Spielfeld begenzen

RobJava

Mitglied
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

Java:
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;
				
				}
Java:
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
 
Zuletzt bearbeitet:

Marco13

Top Contributor
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

Mitglied
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

Top Contributor
"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:
Code:
-----------------------
       /\
      /  \
     /    \
    /      o
   /
  /
 /
/ 



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

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

RobJava

Mitglied
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 :)
 
Zuletzt bearbeitet:

Marco13

Top Contributor
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).
 

Marco13

Top Contributor
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)
 

fastjack

Top Contributor
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.
 

Neue Themen


Oben