# Objekte animieren mit Threads



## zipmar (14. Nov 2013)

hallo community!

ich schreibe mir ein kleines spiel in java , so ist der plan:rtfm:, jedoch habe ich ein problem bei der
animation.
ich habe mir das 2d tutorial hier aus dem link angesehen von zet.....com und habe recht nett damit experimentiert, jedoch stockt es immer beim selben. Animation;(
kann auch sein das ich da was dauerhaft überlese:bahnhof:

wie bekomme ich mehrere unterschiedliche objekte in verschiedenen geschwindigkeiten animiert?


```
public void run() {
        long beforeTime, timeDiff, sleep;
        beforeTime = System.currentTimeMillis();
        while (true) {
            bob1(); // ball 1
            bob2(); // ball 2
            bob3(); // ball 3
            repaint();
            timeDiff = System.currentTimeMillis() - beforeTime;
            sleep = DELAY - timeDiff;
            if (sleep < 0){
                sleep = 10;
            }
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException e) {
                // do nothing
            }
            beforeTime = System.currentTimeMillis();
        }
    }
```

so setze ich immer alle meine objekte in tiefschlaf:autsch:
wo liegt mein denkfehler, bzw. habe ich den falschen ansatz? könnt ihr mir helfen , bitte ?

grüße
zipmar


----------



## NoXiD (14. Nov 2013)

was meinst du mit 





> ..., jedoch stockt es immer beim selben. Animation


 ? Meinst du dass die Objekte beim Bewegen "flackern"?



> kann auch sein das ich da was dauerhaft überlese


 ist leicht möglich 



> wie bekomme ich mehrere unterschiedliche objekte in verschiedenen geschwindigkeiten animiert?


 ich würde mir ein Objekt (Ball) erstellen, der zb. einen Parameter speed hat. Somit kannst du jedem der Bälle (Objekt) verschiedene Geschwindigkeiten setzen


----------



## zipmar (14. Nov 2013)

flackern habe ich keins, da ich double buffering verwende.

das der ball als eigendes objekt vorhanden sein soll, hab ich mir auch schon überlegt.
speed im konstruktor wäre auch ok, aber wie umsetzen?

für jedes ball objekt, dann einen thread erstellen? geht sowas nicht an die performance ran :bahnhof:

opcorn:


----------



## NoXiD (14. Nov 2013)

> das der ball als eigendes objekt vorhanden sein soll, hab ich mir auch schon überlegt.
> speed im konstruktor wäre auch ok, aber wie umsetzen?



naja, eine Klasse Ball hat zb. aktuelle xKoordinate, yKoordinate, radius und schlussendlich speed. Wenn du dann deine Elemente bewegst, kannst du einfach immer ball1.getXKoordinate+=speed (oder multiplizieren, jenachdem wie du speed verwenden willst) und dann neu zeichnen. Somit hat jedes Element seine eigene Geschwindigkeit.



> für jedes ball objekt, dann einen thread erstellen? geht sowas nicht an die performance ran


Grundsätzlich kannst du alle Bälle in einem Thread zeichnen, wenn du richtig vorgehst. Du müsstest eine Liste von Bällen haben, die du in einer Schleife alle immer neu zeichnest. Somit kannst du zur Runtime Bälle hinzufügen und entfernen. Auch stoppen kannst du sie, indem du einfach speed auf 0 setzt.

Du kannst aber auch für jeden Ball einen eigenen Thread erstellen, was ich persönlich (je nach Anzahl der Bälle) schöner finden würde. Bei wenigen Bällen musst du auf die Performanz nicht zwingend acht geben, sollten es mehr werden, würde ich die Variante mit den einzelnen Threads bevorzugen, da so jeder Thread "nur" seinen eigenen Ball zeichnen muss, und nicht ein Thread alle zeichnen muss, egal ob er sich bewegt oder nicht..


----------



## BuddaKaeks (24. Nov 2013)

Spiele sind normalerweise immer so aufgebaut:


```
public void mainLoop(){
    while(running){
        for(Ball ball : baelle){
            ball.logic(); //hier bewegst du den Ball
        }
        for(Ball ball : baelle){
            ball.render(); //hier zeichnest du den Ball
        }
    }
}
```


----------

