Hallo miteinander,
also mein Problem ist das ich eine java.util.ConcurrentModificationException.
Dieses Problem ist zuvor nie aufgetretten und tritt jetzt ohne änderung am Code auf.
Also der Fehler tritt in der paintComponent() Methode auf :
Das ist die Klasse GamePanel
Der Fehler tritt erst dann auf wenn der Helicopter mit der Rakete zusammengestoßen ist und die beiden Objekte entfernt wurden.
Was habe ich übersehen bzw warum wird diese Exception ausgelöst?!?
Programm Code
Danke schonmal im Vorraus.
Mfg
also mein Problem ist das ich eine java.util.ConcurrentModificationException.
Dieses Problem ist zuvor nie aufgetretten und tritt jetzt ohne änderung am Code auf.
Also der Fehler tritt in der paintComponent() Methode auf :
Java:
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(background, 0, 0, this);
g.setColor(Color.red);
g.drawString("FPS: " + Long.toString(fps), 20, 10);
if(!isStarted()){
return;
}
if(actors != null){
for(Drawable draw:actors){ // HIER TRITT DER FEHLER AUF!!!
draw.drawObjects(g);
}
}
}
Das ist die Klasse GamePanel
Java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package helix;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GamePanel extends JPanel implements Runnable , KeyListener, ActionListener{
private static final long serialVersionUID = 1L;
private JFrame frame;
boolean started = false;
boolean once = false;
long delta = 0;
long last = 0;
long fps = 0;
long gameover = 0;
//Steuerung
boolean up = false;
boolean down = false;
boolean left = false;
boolean right = false;
int speed = 70;
Timer timer;
BufferedImage[]rocket;
BufferedImage background;
Heli copter;
Vector<Sprite> actors;
public GamePanel(int w , int h)
{
this.setPreferredSize(new Dimension(w, h));
frame = new JFrame("GameDemo");
frame.setLocation(100, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addKeyListener(this);
frame.add(this);
frame.pack();
frame.setVisible(true);
doInitializations();
}
private void doInitializations()
{
BufferedImage[] heli = loadPics("pics/Helix.gif", 5);
rocket = loadPics("pics/Rockets.gif", 8);
background = loadPics("pics/BergHimmel.jpg", 1)[0];
last = System.nanoTime();
gameover = 0;
actors = new Vector<Sprite>();
copter = new Heli(heli, 400, 300, 100, this);
actors.add(copter);
timer = new Timer(3000, this);
timer.start();
if(!once){
Thread t = new Thread(this);
t.start();
}
}
public void run(){
while(frame.isActive()){
computeDelta();
if(isStarted())
{
//checkKeys();
doLogic();
moveObjects();
}
repaint();
try{
Thread.sleep(10);
}catch ( InterruptedException e){}
}
}
private void createRocket(){
int x = 0;
int y = (int)(Math.random()*getHeight());
int hori = (int)(Math.random()*2);
if(hori == 0){
x = -30;
}else{
x = getWidth()+30;
}
Rocket rock = new Rocket(rocket, x, y, 100, this);
if(x<0){
rock.setHorizontalSpeed(100);
}else{
rock.setHorizontalSpeed(-100);
}
actors.add(rock);
}
private void doLogic(){
Vector<Sprite> trash = new Vector<Sprite>();
for(Movable mov:actors){
mov.doLogic(delta);
Sprite check = (Sprite)mov;
if(check.remove){
trash.add(check);
}
}
for(int i = 0; i < actors.size();i++){
for( int n = i+1; n < actors.size(); n++){
Sprite s1 = actors.elementAt(i);
Sprite s2 = actors.elementAt(n);
s1.collidedWith(s2);
}
}
if(trash.size()>0){
for(Sprite s : trash){
actors.remove(s);
}
}
if(gameover > 0){
if(System.currentTimeMillis() - gameover>3000){
stopGame();
}
}
}
private void stopGame(){
timer.stop();
setStarted(false);
}
private void moveObjects(){
for(Movable mov:actors){
mov.move(delta);
}
}
private BufferedImage[] loadPics(String path , int pics){
BufferedImage[] anim = new BufferedImage[pics];
BufferedImage source = null;
URL pic_url = getClass().getResource(path);
try{
source = ImageIO.read(pic_url);
}catch ( IOException e){}
for(int x = 0; x < pics;x++){
anim[x] = source.getSubimage
(
x*source.getWidth()/pics,
0,
source.getWidth()/pics,
source.getHeight()
);
}
return anim;
}
private void computeDelta()
{
delta = System.nanoTime() - last;
last = System.nanoTime();
fps =((long) 1e9)/delta;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(background, 0, 0, this);
g.setColor(Color.red);
g.drawString("FPS: " + Long.toString(fps), 20, 10);
if(!isStarted()){
return;
}
if(actors != null){
for(Drawable draw:actors){
draw.drawObjects(g);
}
}
}
public boolean isStarted(){
return started;
}
public void setStarted(boolean started){
this.started = started;
}
}
Der Fehler tritt erst dann auf wenn der Helicopter mit der Rakete zusammengestoßen ist und die beiden Objekte entfernt wurden.
Was habe ich übersehen bzw warum wird diese Exception ausgelöst?!?
Programm Code
Danke schonmal im Vorraus.
Mfg