# Spielfeld begenzen



## RobJava (1. Jan 2012)

hey ich wollte fragen, ob es auch eine elegantere Lösung gibt das Spielfeld zu begrenzen.
ey-(ball.getHeight()/2)-ay= der y Wert des Balles
ex-(ball.getHeight()/2)-ax=der x Wert des Balles


```
if(ex-(ball.getHeight()/2)-ax  <= 0 ||ex+(ball.getHeight()/2)-ax >= canvas.getWidth()  ){
				scx=-scx;	
				
				}
				if(ey-(ball.getHeight()/2)-ay <= 0||
						ey+(ball.getHeight()/2)-ay >= canvas.getHeight()){
				
				scy=-scy;
				
				}
```


```
ax=ax+scx;
ay=ay+scy;
```


Diese Begenzung hat halt viele Fehler, wie wenn der Ball nicht schnellgenug umgekert wird, steckt dieser in der wand und ändert dauernt die Richtung...

Ist wahrscheinlich eine relativ dumme Frage, konnte aber keinen anderen Weg finden.

vielen Dank im vorraus
Lg RobJava


----------



## Marco13 (1. Jan 2012)

Sowas wie
float radius = ball.getHeight()/2;
oder diese Rechnung in eine Methode wegzukapseln, so dass dann da
if (ball.getMaxY() > someHeight) ...
oder sowas steht ... vermutlich könnte man da einiges noch eleganter machen...


----------



## RobJava (2. Jan 2012)

Ja ich weiß...
Danke für die Antwort 
Aber mit eleganter habe ich mich vllt dumm Ausgedrückt. 
Ich meine gibt es noch andere mögllichkeiten das spielfeld zu begenzen,besser?
Danke im vorraus 
Lg Rob


----------



## Marco13 (2. Jan 2012)

"Besser" geht immer  In diesem Fall rate ich mal, worauf sich das beziehen könnte: Wenn der Ball sich schnell bewegt, kann er, wie du schon angedeutet hast, "in die Wand rein" (oder sogar durch) fliegen. Um das zu verhindern müßte man die Flugbahn genauer betrachten. Ich nehme an, ax/ay steht für die aktuelle Position, und ex/ey für die Endposition nach dem anstehenden Schritt. Im einfachsten Fall müßte man jetzt prüfen, ob die Linie von A nach E den Rand des Spielfeldes schneidet - aber nicht einfach den Rand, sondern einen Rand der um 'radius' nach innen versetzt ist. In den Ecken ist das noch ein bißchen komplizierter... Aber wenn man den Schnittpunkt genau ausrechnet, hat man zumindest für die Seiten schon das wichtigste abgehakt. 

BTW: Dann kann man auch genau bestimmen, WO der Ball nach der Kollision ist - im Moment wird der Unterschied zwischen diesen Fällen ja gar nicht berücksichtigt:

```
-----------------------
       /\
      /  \
     /    \
    /      o
   /
  /
 /
/ 



-----------------------
       /\
      /  \
     /    \
           \
            \
             \
              \
               \ 
                o
```
 
Aber... wie es eben so ist: Je "besser" man es machen will, desto aufwändiger wird's meistens...


----------



## RobJava (2. Jan 2012)

vielen Dank 
ich schau mal wie ich das umsetzen kann 
nochmal eine kleine Frage, (ich weiß nicht ob ich ein neues Thema anfangen soll oder gerade nochmal nachfragen kann), wie kann ich bestimmen wann sie die Pixel von der Bitmap treffen, also ich meine die farbigen, anstatt das ich nur unterscheide ob sich die Bitmaps im kompletten treffen?
Also statt (Bitmap | |---><---| | Bitmap) dann gucken ob sich einzelne Pixel überschneiden.
vielen Dank nochmal


----------



## Marco13 (2. Jan 2012)

So eine Pixelgenaue Kollision zwischen zwei Bitmaps ist so erstmal zu aufwändig. Festzustellen, ob EIN Punkt einen (nicht-transparenten) Pixel eines Bildes berührt ist einfach, aber _gegenseitig_ von zwei Bilder ist das kaum vernünftig machbar - man müßte über alle Pixel laufen und sie alle einzeln testen (und ich weiß auch nicht, wie dir das an dieser Stelle weiterhelfen würde).


----------



## RobJava (2. Jan 2012)

Also wenn ich das nur bei einer der beiden Bitmaps machen würde, wie würde das funktionieren? 
Lg RobJava


----------



## Marco13 (2. Jan 2012)

Bei einem BufferedImage kann man mit
int argb = image.getRGB(x,y);
einen Pixel abfragen. Da kann man dann z.B. mit 
if (argb = Color.RED.getRGB()) { ...}
prüfen, ob der Pixel rot ist (und noch detailliertere Abfragen, je nach Anforderung)


----------



## RobJava (2. Jan 2012)

ok so ganz krieg ich es nicht mit ner einfachen Bitmap hin...


----------



## fastjack (3. Jan 2012)

Zur Kollision könntest Du zu den Bildern ein Kollisions-Polygon machen. Versuche die wenn möglich dynamisch zu erzeugen. Dann prüfst Du, ob sich zwei Polygone berühren. Das sollte mit den Polygonmethoden möglich sein.


----------



## Marco13 (3. Jan 2012)

RobJava hat gesagt.:


> ok so ganz krieg ich es nicht mit ner einfachen Bitmap hin...



Poste mehr code und genauere Fragen.


----------

