java-forum.org
JBoss Seam
Alter Preis: 39,95 €
Jetzt: 0,00 €

zzgl. Versandkosten

Zurück   java-forum.org > Java - Programmierung > Spiele- und Multimedia-Programmierung

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 14.07.2009, 00:36   #1 (permalink)
Neuer Benutzer
Byte
 
Registriert seit: 26.10.2008
Beiträge: 13
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Standard Rechteck Kollision erkennen

Hi ich habe eine Schlange bestehend aus Rechtecken. Wenn die Schlange ihren Schwanz berührt soll das Spiel beendet werden. Da die Schlange sich auch in kreisen bewegt weiß ich nun leider nicht wie ich alle Punkte des gezeichneten Rechtecks errechnen kann. Zum zeichen des rechtecks hab ich eine Methode zeichenRechteck()

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
 
public synchronized void zeichneRechteck(double pBreite, double pHoehe)
  {
    int x1 = (int)Math.round(this.zStiftX);
    int x2 = (int)Math.round(pBreite);
    int y1 = (int)Math.round(this.zStiftY);
    int y2 = (int)Math.round(pHoehe);
    setzeZustand();
    if (this.g != null)
      this.g.drawRect(x1, y1, x2, y2);
  }
zum bewegen eine bewegeUm() und dreheUm()

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
public void dreheUm(double pWinkel)
  {
    this.zWinkel += pWinkel;
    while (this.zWinkel < 0.0D)
      this.zWinkel += 360.0D;
    while (this.zWinkel >= 720.0D)
      this.zWinkel -= 360.0D;
  }
 
public void bewegeUm(double pDistanz)
  {
    double w = this.zWinkel * 3.141592653589793D / 180.0D;
    double x = this.zStiftX + pDistanz * Math.cos(w);
    double y = this.zStiftY - pDistanz * Math.sin(w);
    if (!(this.zHoch))
      zeichneLinie(this.zStiftX, this.zStiftY, x, y);
    this.zStiftX = x;
    this.zStiftY = y;
  }


Zum zeichnen habe ich die Methode zeichnen geschrieben

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public void zeichne (Ereignisanwendung EA) {
  if(letztesLoch < (System.currentTimeMillis()-3000))  // mehr als 3s her
            {
                stift.hoch();
                for(int i=0;i<lochzeit;i++){
                stift.bewegeUm(geschwindigkeit);
                Color sichfarbe=farbe;
                stift.setFarbe(Color.BLACK);
                stift.fuelleRechteck(radius,radius);
                stift.setFarbe(sichfarbe);
                EA.warte(schnelligkeitSnake);
                }
                stift.runter();
                letztesLoch = System.currentTimeMillis();
            }
  else {
    stift.hoch();
    stift.bewegeUm(geschwindigkeit);
    stift.runter();
    double x=stift.getX();
    double y=stift.getY();
    double winkel=stift.getWinkel();
    double w = winkel * 3.141592653589793D / 180.0D;
   for(int i=0;i<=radius+1;i++){
   double nx = x + i * Math.cos(w);
   double ny = y - i * Math.sin(w);
   last.add((int)nx+":"+(int)ny);
   }
   stift.fuelleRechteck(radius,radius);
   if(last.size()>15){
   List l=last.subList(0, 14);
   aL.addAll(l);
   last.clear();
   }
  }

in einer Liste speicher ich die letzten 15 rechteckposition ein, sodass sie erst später in die Liste für die Kollosionserkennung rienkommt damit das zeichnen an sich keine Kollision auslöst.

Die Collisonsüberprüfung hab ich wie folgt versucht

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 
 
 public boolean getroffen(){
          boolean wahr=false;
          double winkel=this.getWinkel();
          double w = winkel * 3.141592653589793D / 180.0D;
             int x_=this.getX();
              int y_=this.getY();
              for(int i=0;i<this.getRadius()+1;i++){
                 double nx = x + i * Math.cos(w);
                 double ny = y - i * Math.sin(w);
  if(aL.contains(nx+":"+ny)){wahr=true;}
           }
     
          
           return wahr;
       }

Hab mir halt gedacht ich speichere alle Positionspunkte des gezeichnetenRechteck und wenn die neue zeichposition für das derzeitige Rechteck einer dieser Punkte ist muss er ja getroffen haben. Nur da es verdreht im Raum steht weiß ich nicht wie ich alle punkte berechnen kann. Gibt es noch eine ander Möglichkeit dies rauszukrigen, stell fillrect() sowas bereit?kann ich das irgendwie mit Vektoren machen oder gibt es einfachere Wege die collision zu erkennen? Vlt indem ich keine rechtecke sonder was anderes für die Schlange benutze?
siser ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 14.07.2009, 00:45   #2 (permalink)
Stammbenutzer
CD-R 80
 
Registriert seit: 07.01.2007
Beiträge: 9.360
Abgegebene Danke: 0
Erhielt 291 Danke für 282 Beiträge
Hab' das jetzt nicht alles Nachvollzogen, aber du kannst mal schauen ob du die Eckpunkt des gedrehten Rechtecks in ein java.awt.Polygon packen kannst - dort kann man dann mit contains usw. Testen, ob es einen bestimmten Punkt enthält.
Marco13 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort    

Lesezeichen

Stichworte
alt , awt , berechnen , breite , color , contains , erd , farbe , ide , iso , java , kollision , kreise , list , liste , mac , methode , net , neue , pack , rechte , return , size , speicher , spi , spiel , this , vektor , while , zeichnen

Latex Maths & Physics Editor ...

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
SW-Bild: Rechteck um die hellsten Punkte madboy Softwareentwicklung 2 19.10.2007 11:39
Problem mit JLabel, Rechteck, repaint() ;) kickin AWT, Swing & SWT 2 20.05.2007 14:25
Rechteck zeichnen - Hand Annotieren - Hand Anzeigen Eldar AWT, Swing & SWT 0 15.05.2005 23:09
ein Rechteck zeichnen Leeloo Spiele- und Multimedia-Programmierung 6 25.02.2004 19:39


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:42 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de