Olá pessoal,
Estou fazendo um curso de desenvolvimento de jogos em Java, estamos usando um projeto baseado na estrutura do apresentado no seguinte link: http://abrindoojogo.com.br/djj-index
O Mistério está no erro que tenho nos meus dois notebooks, um com windows e outro com ubuntu. Nos computadores do curso, do professor e de outros alunos o código funciona.
Bom, vamos detalhar o código para tentar esclarecer…
Temos um projeto, GameCore, que é adicionado no projeto do jogo, nas propriedades do projeto em ‘Java Build Path’.
então criamos a classe principal do jogo, estendendo a classe Game do GameCore, assim:
[code]public class Animation extends Game {
public Animation() {
super("Animacao");
}
@Override
public void onLoad() {
}
@Override
public void onUnload() {
}
@Override
public void onUpdate(int currentTick) {
}
@Override
public void onRender(Graphics2D g) {
}
public static void main(String[] args) {
new Animation().run();
}
}[/code]
Quando eu tento usar o teclado, ocorre esse erro…
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at com.game.core.InputManager.update(InputManager.java:57)
at com.game.core.Game.run(Game.java:67)
at Main.main(Main.java:10)
Veja abaixo a classe InputManager, e em seguida o looping faz o update do teclado.
***CORRIGIDO, TINHA POSTADO OUTRA CLASSE…
package com.game.core;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.HashMap;
public class InputManager implements KeyListener {
protected static final int KEY_RELEASED = 0;
protected static final int KEY_JUST_PRESSED = 1;
protected static final int KEY_PRESSED = 2;
private static InputManager instance;
private HashMap<Integer, Integer> keyCache;
private ArrayList<Integer> pressedKeys;
private ArrayList<Integer> releasedKeys;
private InputManager() {
keyCache = new HashMap<Integer, Integer>();
pressedKeys = new ArrayList<Integer>();
releasedKeys = new ArrayList<Integer>();
}
public static InputManager getInstance() {
if (instance == null) {
instance = new InputManager();
}
return instance;
}
public boolean isPressed(int keyId) {
return keyCache.containsKey(keyId)
&& keyCache.get(keyId).equals(KEY_PRESSED);
}
public boolean isJustPressed(int keyId) {
return keyCache.containsKey(keyId)
&& keyCache.get(keyId).equals(KEY_JUST_PRESSED);
}
public boolean isReleased(int keyId) {
return keyCache.containsKey(keyId)
&& keyCache.get(keyId).equals(KEY_RELEASED);
}
public void update() {
for (Integer keyCode : keyCache.keySet()) {
if (isJustPressed(keyCode)) {
keyCache.put(keyCode, KEY_PRESSED);
}
}
for (Integer keyCode : pressedKeys) {
if (isReleased(keyCode)) {
keyCache.put(keyCode, KEY_JUST_PRESSED);
} else {
keyCache.put(keyCode, KEY_PRESSED);
}
}
for (Integer keyCode : releasedKeys) {
keyCache.put(keyCode, KEY_RELEASED);
}
pressedKeys.clear();
releasedKeys.clear();
}
@Override
public void keyPressed(KeyEvent e) {
pressedKeys.add(e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e) {
releasedKeys.add(e.getKeyCode());
}
@Override
public void keyTyped(KeyEvent e) {
}
}
LOOPING
public void run() {
active = true;
load();
expectedTPS = 50;
expectedNanosPerTick = GameSpeedTracker.NANOS_IN_ONE_SECOND
/ expectedTPS;
maxFrameSkip = 10;
long nanoTimeAtNextTick = System.nanoTime();
int skippedFrames = 0;
while (active) {
speedTracker.update();
if (System.nanoTime() > nanoTimeAtNextTick
&& skippedFrames < maxFrameSkip) {
nanoTimeAtNextTick += expectedNanosPerTick;
keyboard.update();
update();
skippedFrames++;
} else {
render();
skippedFrames = 0;
}
}
unload();
}
A tecla não permanece pressionada, ela volta para release e repete o ciclo, just pressed e pressed, voltando para release mesmo sem soltar a tecla. Logo em seguida vem esse erro.
Lembrando que esse ocorre em meu PC pessoal, com Linux e em outro com Windows 7, mas nos PCs do curso e no PC do professor está funcionando como esperado!
Desde Já agradeço a todos!