# Kisten Kollision



## Hercules (29. Jan 2013)

Hey.
Irgendwie funktioniert die Kollision nur bei der ersten Kiste ich weiss aber nicht warum.
Java Kisten Kollision Fehler - YouTube

So erstelle ich die Kisten:


```
chest1 = new Chest(20*32,16*32,Menu.trank);
        chest2 = new Chest(15*32,10*32,Menu.gegengift);
        chestList.add(chest1);
        chestList.add(chest2);

        // Dann Rechtecke für die Kollisionabfrage, die Kistengrafik ist 32x32
        chestRect = new Rectangle[2];
        chestRect[0] = new Rectangle(chest1.x,chest1.y,32,32); // First Map
        chestRect[1] = new Rectangle(chest2.x,chest2.y,32,32); // First Map
```

Ich frage dann so ab:


```
for(int x = 0 ;x < chestRect.length; x++){       
                             
                        if(chestRect[x].intersects(playerUp))
                            value.chestUp = true;                       
                        else
                            value.chestUp = false;
                        
                         if(chestRect[x].intersects(playerLeft))
                            value.chestLeft = true;
                        else
                            value.chestLeft = false;
                
                        if(chestRect[x].intersects(playerRight))
                            value.chestRight = true;
                        else
                            value.chestRight = false;
                
                        if(chestRect[x].intersects(playerDown))
                            value.chestDown = true;
                        else
                            value.chestDown = false;
                
                         }
```

Und bei der Spielebewegung frage ich dann ab ob z.B. chestUp true ist und wenn ja darf der Spieler nicht nach oben gehen.

Das geht auch aber nur bei der ersten Kiste. Die Spieler Rechtecke setze ich so:

```
// Rechtecke aktualisieren
      playerUp.setBounds(xenor.x+8,xenor.y+16,32,32);
      playerLeft.setBounds(xenor.x-4,xenor.y+30,32,32);  
      playerRight.setBounds(xenor.x+20,xenor.y+30,32,32);  
      playerDown.setBounds(xenor.x+8,xenor.y+40,32,32);
```


----------



## SlaterB (29. Jan 2013)

ausreichende Information ohne youtube-Videos wäre begrüßenswert,

einen naheliegenen Tipp wage ich, und sei es nur, damit du mehr dazu erklärst:

bei jedem Kistenvergleich wird im Nicht-Treffer-Fall alles mögliche auf false gesetzt,
wenn die erste Kiste [c]value.chestUp = true;[/c] bewirkt, so nützt das gar nichts, sofern nicht die zweite Kiste genauso verfährt,
lasse alle else-Fälle weg, 
du kannst die boolean-Variablen gegebenfalls vor dem Schleifendurchlauf alle 4 auf false initialisieren

------

vermeide grundsätzlich so weit wie möglich, separate Listen/ Daten zu bestimmten Objekten vorzuhalten,
warum kann das Rectangle der Kiste nicht im Chest-Objekt gespeichert sein?


----------



## Hercules (29. Jan 2013)

Ich verdammter Vollidiot! -.-"
Habe es geändert und es geht nun.


```
value.chestUp = false;
        value.chestLeft = false;
        value.chestRight = false;
        value.chestDown = false;

                for(int x = 0 ;x < chestRect.length; x++){       
                             
                        if(chestRect[x].intersects(playerUp))
                            value.chestUp = true;                       
                        
                         if(chestRect[x].intersects(playerLeft))
                            value.chestLeft = true;                    
                
                        if(chestRect[x].intersects(playerRight))
                            value.chestRight = true;                        
                
                        if(chestRect[x].intersects(playerDown))
                            value.chestDown = true;                 
                
                         }
```

Danke!


----------

