Spiel verbessern - ConcurrentModificationException

Status
Nicht offen für weitere Antworten.

ARadauer

Top Contributor
Ich hab vor ein paar Tagen auf Facebook so ein Spiel mit Bällen die man zu paltzen bringen muss gespielt.. hab mir geadacht.. das könnte ich ja mal in Java probieren...

Ich mach eigentlich sonst nichts mit Spielprogrammierung, ich arbeite eher im Web und Datenbankbereich.

Also hab ich mir Quxlis Tutorial geschnappt und hab das geschrieben....

Java:
package bouncing;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Bouncing extends JPanel implements Runnable, MouseListener{

   private static final long serialVersionUID = -2897573490118370605L;

   boolean running = true;
   Random rnd = new Random();

   //zur Berechnung der FPS und Animation
   long delta = 0;
   long last = 0;
   long fps = 0;

   
   //Anzahl der Bälle
   int numBalls = 200;

   //Liste mit den Bällen
   ArrayList<Ball> balls = new ArrayList<Ball>();

   
   public static void main(String[] args) {
      new Bouncing(800,600);
   }

   public Bouncing(int w, int h){
      this.setPreferredSize(new Dimension(w,h));
      JFrame frame = new JFrame("Bouncing");
      frame.setLocation(100, 100);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(this);
      frame.pack();
      frame.setVisible(true);

      this.addMouseListener(this);

      init();
   }



   private void init(){
      last = System.nanoTime();

      setBackground(Color.black); 
      
      //Bälle erzeugen
      while(balls.size()<numBalls)
         createBall();

      Thread t = new Thread(this);
      t.start();
   }

   /**
    * Methode erzeugt einen zufälligen Ball und fügt ihn in die Liste der Bälle ein
    */
   public void createBall(){

      int x = rnd.nextInt(this.getWidth());
      int y = rnd.nextInt(this.getHeight());

      int r = rnd.nextInt(255);
      int g = rnd.nextInt(255);
      int b = rnd.nextInt(255);

      int dx = rnd.nextInt(200)-100;
      int dy = rnd.nextInt(200)-100;


      Ball ball = new Ball(x,y, 7, 7,this, new Color(r,g,b));
      ball.setDx(dx);
      ball.setDy(dy);

      balls.add(ball);
   }

   public void run() {
      while(running){

         computeDelta();
         doLogic();
         moveObjects();
         repaint();
         try {
            Thread.sleep(10);
         } catch (InterruptedException e) {}
      }    
      
      System.out.println("Spiel zu Ende....");
   }

   
   private void doLogic() {
      try {
         for(Ball move: balls)
            move.doLogic(delta);

         
         
         //zusammen gestoßene Bälle sterben lassen
         ArrayList<Ball> trash = new ArrayList<Ball>();
         for(int i = 0; i < balls.size(); i++){
            for(int j = i+1; j < balls.size(); j++){
               if(balls.get(i).colidedWith(balls.get(j))){
                  trash.add(balls.get(i));
                  trash.add(balls.get(j));
               }
            }
         }
         for(Ball s: trash)
            s.die();

         
         //Bälle die wir löschen können, die löschen wir aus der Liste
         for(Ball s: balls){
            if(s.isCanDelete())
               balls.remove(s);
         }
         
         if(balls.size()<1)
            running = false;
         
      } catch (ConcurrentModificationException e) {
         e.printStackTrace();
      }

   }

   /**
    * Bälle bewegen
    */
   private void moveObjects() {
      for(Ball move: balls)
         move.move(delta);      
   }

   /**
    * zeichnen
    */
   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);      

      g.setColor(Color.red);
      g.drawString("FPS: "+Long.toString(fps), 20, 10);

      g.drawString("Balls: "+balls.size(), 100, 10);

      try {
         for(Ball draw: balls)
            draw.drawObject(g);
      }  catch (ConcurrentModificationException e) {
         e.printStackTrace();
      }
   }

   /**
    * delta und fps berechnen
    */
   private void computeDelta() {
      delta = System.nanoTime() - last;
      last = System.nanoTime();
      fps = ((long) 1e9)/delta;

   }

   
   public void mouseClicked(MouseEvent e) {
      Ball ball = new Ball(e.getX(),e.getY(), 7, 7,this, Color.WHITE);
      ball.setDead(true);
      balls.add(ball);
   }

   public void mouseEntered(MouseEvent e) {}

   public void mouseExited(MouseEvent e) {}

   public void mousePressed(MouseEvent e) {}

   public void mouseReleased(MouseEvent e) {}

}

Java:
package bouncing;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;

/**
 * Spielball
 *
 */
public class Ball extends Rectangle2D.Double {


   private static final long serialVersionUID = -6285058019006719750L;

  
   Bouncing p;

   //Richtung
   double dx;
   double dy;
   
   
   //kann dieser Ball gelöscht werden
   private boolean canDelete;
   
   //Fortschritt der explusion
   private int dieStatus =0; 
   private boolean dead;   
   
   
   Color color;

   public Ball(double x, double y, double w, double h, Bouncing p, Color color) {
      this.x = x;
      this.y = y;
      this.height = h;
      this.width = w;
      this.p = p;   
      this.color = color;
   }

   
   public void drawObject(Graphics g) {
      Color old = g.getColor();
      g.setColor(color);
      g.drawOval((int)x, (int)y, (int)width, (int)height);
      g.setColor(old);
   }



   /**
    * Kollisionsdetection mit den Wänden
    * @param delta
    */
   public void doLogic(long delta) {
      //Wenn wir an den wänden anstoßen, wechseln wir die Richtung
      if(x<0 || (x+width)>p.getWidth())
         dx *=-1;
      
      if(y<0 || (y+height)>p.getHeight())
         dy *=-1;
   }

   /**
    * Bewegung und Animation
    * @param delta
    */
   public void move(long delta) {     
      
      //sind wir tot, explodieren wir...
      if(dead){
         double expansion = 40*(delta/1e9);
         
         width = width+expansion;
         height = height+expansion;
         x = x-expansion/2;
         y = y-expansion/2;
         
         dieStatus++;
         if(dieStatus==250)
            setCanDelete(true);
      }else{ // sonst bewegen wir uns
         if(dy!=0)
            y += dy*(delta/1e9);
         
         if(dx!=0)
            x += dx*(delta/1e9);
      }
      
   }
   
   /**
    * wir sind können nur zusammenstoßen wenn wir tot sind
    * @param s
    * @return
    */
   public boolean colidedWith(Ball s){
      return (this.intersects(s) && (this.isDead() || s.isDead()));
   }
   
   
   public void die() {
      if(!dead){
         setDead(true);
      }
   }
   
   //Getter und Setter
   public double getDx() {
      return dx;
   }
   public void setDx(double dx) {
      this.dx = dx;
   }
   public double getDy() {
      return dy;
   }
   public void setDy(double dy) {
      this.dy = dy;
   }


   public boolean isCanDelete() {
      return canDelete;
   }


   public void setCanDelete(boolean canDelete) {
      this.canDelete = canDelete;
   }

   public boolean isDead() {
      return dead;
   }

   public void setDead(boolean dead) {
      this.dead = dead;
   }



}

Ziel ist es theoritisch durch klicks alle Bälle zu zerstören... ist noch nicht fertig...

1. Grundlegend hab ich jetzt ein Problem mit ConcurrentModificationException.
Passiert weil ich die Liste veränder sie aber gleichzeitig von einem anderen Thread (EDT??) gelesen wird.. oder?
Was mach ich dagegen?

2. Wie kann ich das ganze einwenig "sauberer" zeichnen, das scheint mir noch ein wenig unsauber und nicht so "smooth" wie ich es gerne hätte... Gibts da was in Richtung Antialiasing?

Danke für eure Tipps....
 

ARadauer

Top Contributor
btw da kann man ziehmliche coole sachen machen...
zeile 74 im Ball
schreibt mal
double expansion = 40*dieStatus*(delta/1e9);


wow psydelic!!!
 

Marco13

Top Contributor
Zu 1: Ja, catchen sollte man die jedenfalls nicht ;) Im allgemeinen tritt sie auf, wenn eine Collection von zwei Threads verwendet wird, und mindestens einer davon die Collection verändert. Also bei sowas wie
Code:
private List<Ball> balls = new ArrayList<Ball>();

public void paintComponent(Graphics g)
{
    ...
    for (Ball ball : ball) ball.paint(g);
}

void gameLogicInOwnThread()
{
    balls.remove(0);
}
haut's ihn halt ggf. beim drüberiterieren in der for-Schleife raus.

Verhindern kann man das, indem man die Collection (und die Zugriffe beim drüberiterieren) synchronized macht - am Beispiel also sowas wie
Code:
private List<Ball> balls = Collections.synchronizedList(new ArrayList<Ball>());

public void paintComponent(Graphics g)
{
    ...
    synchronized(balls)
    {
        for (Ball ball : ball) ball.paint(g);
    }
}

void gameLogicInOwnThread()
{
    balls.remove(0);
}

Zu 2: Müßt' ich's mal starten, wenn ich Zeit hab ... bei Gelegenheit...
 

ARadauer

Top Contributor
danke marco.
ich hab jetzt die liste syncronisiert, einen syncroniced block ums painten und meine for each umgebaut.

Java:
//            for(Ball s: balls){
//               if(s.isCanDelete())
//                  balls.remove(s);
//            }
            
            for( int i  = balls.size()-1; i>=0; i-- ){
               if(balls.get(i).isCanDelete())
                  balls.remove(i);;
            }
jetzt klappts...
 

Civilazi

Bekanntes Mitglied
Java:
         for(Ball s: balls){
            if(s.isCanDelete())
               balls.remove(s);
         }

Allein da wirst du schon eine ConcurrentModificationException bekommen, auch bei nur einem Thread.
mögliche Lösung: mit index-for-Schleife über balls drüberlaufen und den index nach dem löschen entsprechend anpassen oder einmal drüberlaufen, die zu löschenden Bälle in ner weiteren Liste merken und dann balls.removeAll(liste).

EDIT: Ok, ganz knapp zu spät =)
 

Landei

Top Contributor
danke marco.
ich hab jetzt die liste syncronisiert, einen syncroniced block ums painten und meine for each umgebaut.

Wenn die Performance darunter nicht zu sehr leidet...

Alternativ: Java hat inzwischen threadsichere Collections, die auch intern ohne synchronized auskommen, und zwar unter java.util.concurrent. Hier könnte z.B. eine CopyOnWriteArrayList das richtige sein (braucht aber potentiell mehr Speicher).
 

Marco13

Top Contributor
Zu 2 Müßtest du nochmal genauer sagen, was du meinst - die Bewegung ist ja (zumindest bei mir) flüssig - Antialiasing kann man ggf. mit
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
in der paintComponent einschalten.
 

ARadauer

Top Contributor
@Landei: CopyOnWriteArrayList? Hammer!!!

@marco:
((Graphics2D)g).setRenderingHint(RenderingHints.KE Y_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
genau, das habe ich gesucht!

danke
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Server für Spiel aufsetzen, was Shutdown ist Spiele- und Multimedia-Programmierung 3
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
ItundMathe1994 TicTacToe Spiel programmieren Spiele- und Multimedia-Programmierung 2
JEP1 Hilfe bei Spiel Spiele- und Multimedia-Programmierung 1
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
Leon.tr3x Mein erstes Programm/Spiel Spiele- und Multimedia-Programmierung 10
O Texas Hold'em Poker als Online-Spiel mit Freunden Spiele- und Multimedia-Programmierung 5
Drachenbauer Speicher-Tool für ein Spiel schreiben Spiele- und Multimedia-Programmierung 13
M Spiel Mühle-Programmierung Java Spiele- und Multimedia-Programmierung 9
Excess Spiel abzugeben Spiele- und Multimedia-Programmierung 1
I Superhelden - Spiel Spiele- und Multimedia-Programmierung 14
E Hauptmenü und Spiel ???? Spiele- und Multimedia-Programmierung 2
L Sound in Java Spiel Spiele- und Multimedia-Programmierung 5
R Interaktives Spiel Spiele- und Multimedia-Programmierung 5
L Spiel im Editor testen Spiele- und Multimedia-Programmierung 4
Jackii dispatchUncaughtException in Quiz Spiel mit GUI Layout Spiele- und Multimedia-Programmierung 6
D Textbasiertes Spiel Spiele- und Multimedia-Programmierung 8
K Android Spiel Programmieren Spiele- und Multimedia-Programmierung 6
L BrickBreaker Spiel Spiele- und Multimedia-Programmierung 3
A Spiel Figur ansprechen und bewegen Spiele- und Multimedia-Programmierung 3
it_is_all Dialogbox im Spiel - Text in Blöcke aufteilen Spiele- und Multimedia-Programmierung 4
F Koordinieren und Essen von Snake - Spiel Spiele- und Multimedia-Programmierung 14
G Entity Verwaltung in einem 2D Spiel Spiele- und Multimedia-Programmierung 1
E Möchte Spiel Programmieren Spiele- und Multimedia-Programmierung 7
S Connect6 Spiel - Code in ei Spiele- und Multimedia-Programmierung 2
A Spiel nach Abfrage beenden oder neustarten Spiele- und Multimedia-Programmierung 1
G Welten Generierung 2D Spiel Spiele- und Multimedia-Programmierung 4
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
N Problem mit 2D Spiel Spiele- und Multimedia-Programmierung 17
T Probleme bei "Pixel-Fighting"-Spiel: Unausgewogene Mannschaften??? Spiele- und Multimedia-Programmierung 4
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
L Coordinate Space JavaFX 2d Spiel Spiele- und Multimedia-Programmierung 0
C Vier Gewinnt Spiel Programmiertipp Spiele- und Multimedia-Programmierung 11
N Jump and run Spiel - wo anfangen / weitermachen? Spiele- und Multimedia-Programmierung 11
K Spiel zum zuordnen von Dienstgraden und Dienstgradabzeichen Spiele- und Multimedia-Programmierung 5
M Textbasiertes Spiel programmieren Spiele- und Multimedia-Programmierung 4
T 2d-Spiel Licht Spiele- und Multimedia-Programmierung 5
S Jump 'n' Run-Spiel Kollisionserkennung Spiele- und Multimedia-Programmierung 3
T Spiel rendern Spiele- und Multimedia-Programmierung 2
Grevak Sounds im Spiel Spiele- und Multimedia-Programmierung 5
B Fehlerhafte Mob Bewegungen in Tower Defense Spiel Spiele- und Multimedia-Programmierung 2
F Spiel ähnlich wie SimCity/o.ä programmieren Spiele- und Multimedia-Programmierung 5
X Erklärung zu einem Tic Tac Toe Spiel Spiele- und Multimedia-Programmierung 1
I Spectator Modus für Spiel ähnlich zu Terraria Spiele- und Multimedia-Programmierung 8
I Textbasiertes Spiel - Umsetzungsfrage & Schleifen Problem Spiele- und Multimedia-Programmierung 26
M Kollisions abfrage bei 3D spiel? Spiele- und Multimedia-Programmierung 12
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
P [Spiel]Welche Bilder sind gleich Spiele- und Multimedia-Programmierung 2
E GUI zum Spiel hinzufügen Spiele- und Multimedia-Programmierung 19
S 2D Spiel - Physics Spiele- und Multimedia-Programmierung 16
S 2D Spiel "Der Sprung" Spiele- und Multimedia-Programmierung 7
A 2D Spiel ohne Tiles Spiele- und Multimedia-Programmierung 10
V welche vorgehensweise beforzieht ihr bei einfachem Quizz Spiel ? Spiele- und Multimedia-Programmierung 4
S Quaxli's Heli Spiel läuft nicht nach Plan Spiele- und Multimedia-Programmierung 2
G Methode sleepen während das Spiel weiterläuft Spiele- und Multimedia-Programmierung 3
T Spiel Überprüfung Spiele- und Multimedia-Programmierung 3
P Spiel laggt nach unbestimmter Zeit tierisch. Spiele- und Multimedia-Programmierung 27
S Hilfe bei Spiel Spiele- und Multimedia-Programmierung 6
B Hauptmenü für Spiel Spiele- und Multimedia-Programmierung 1
W Spiel ist langsam/laggt Spiele- und Multimedia-Programmierung 18
J Ascii Spiel Spiele- und Multimedia-Programmierung 1
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
O Vollständige Musik in Spiel einbauen (wav - Format) Spiele- und Multimedia-Programmierung 8
Y Quiz Spiel Spiele- und Multimedia-Programmierung 1
J Conways Spiel des Lebens nachprogrammiert Spiele- und Multimedia-Programmierung 1
B Spiel Programmieren, die Anfänge Spiele- und Multimedia-Programmierung 6
D [OpenGL] Spiel in der Art von Age of Empires Spiele- und Multimedia-Programmierung 4
lord239123 suche Graphiker für ein Pokemon-Spiel Spiele- und Multimedia-Programmierung 6
S Spiel installeren lassen und organisieren Spiele- und Multimedia-Programmierung 3
J Lichtupdate in tile-basiertem Spiel Spiele- und Multimedia-Programmierung 4
P Erstes Spiel (Strategie) Spiele- und Multimedia-Programmierung 31
J Mein erstes Spiel [Spielevorstellung] Spiele- und Multimedia-Programmierung 2
Bananabert Spiel Renderer Images und Strings Spiele- und Multimedia-Programmierung 4
N Spiel Menü error ! Spiele- und Multimedia-Programmierung 5
S Anfangsmenü mit Spiel verknüpfen Spiele- und Multimedia-Programmierung 16
S Spiel ruckelt trotz 50 fps Spiele- und Multimedia-Programmierung 16
D Spiel-Bilddaten auswerten Spiele- und Multimedia-Programmierung 7
Creylon [LWJGL] Spiel Exportieren Spiele- und Multimedia-Programmierung 2
L Hilfe bei Klassendesign für Spiel Spiele- und Multimedia-Programmierung 2
Devil0s Spiel laggt trotz 90 FPS (bei der Anzeige) Spiele- und Multimedia-Programmierung 9
N Webanwendung als eine Art Spiel Spiele- und Multimedia-Programmierung 8
L Korrekte Darstellung von Wasser in 2D Spiel Spiele- und Multimedia-Programmierung 4
F Ideen für spiel Spiele- und Multimedia-Programmierung 4
J wohin mit der Logik des Spiel Spiele- und Multimedia-Programmierung 2
R Experimente mit Quaxlis Spiel Spiele- und Multimedia-Programmierung 12
W Spiel-Grundlagen selbst austüfteln: Kollisionen? Spiele- und Multimedia-Programmierung 3
Kenan89 Java 2D Spiel Spiele- und Multimedia-Programmierung 39
M Automaten Spiel Spiele- und Multimedia-Programmierung 27
J Tic tac toe spiel Neustart Spiele- und Multimedia-Programmierung 5
S 2D Spiel im Vollbild langsamer als im Fenster Spiele- und Multimedia-Programmierung 11
A TicTacToe Spiel Spiele- und Multimedia-Programmierung 3
S Verbesserungvorschläge Spiel Z Spiele- und Multimedia-Programmierung 31
S Spiel abbrechen Spiele- und Multimedia-Programmierung 3
J Greenfoot "Little Crab" Spiel Erweiterungen Spiele- und Multimedia-Programmierung 6
P Spiel HUD erstellen Spiele- und Multimedia-Programmierung 6
E Spiel neustarten Spiele- und Multimedia-Programmierung 4
S Aufbau von Klassen für Spiel Spiele- und Multimedia-Programmierung 13
A Grundlagensuche für Spiel Spiele- und Multimedia-Programmierung 8
V Basisprinzipien Breakout-Spiel Spiele- und Multimedia-Programmierung 8
E Spiel startet nach exportieren nicht Spiele- und Multimedia-Programmierung 7

Ähnliche Java Themen

Neue Themen


Oben