Seite 1 von 2

Kollisionsangabe

Verfasst: 03.06.2008 15:57
von Lorne
Hallo,
wie kann ich, bei einem Spiel wie Snake, die Berührung angeben?
Weil wenn ich ja

Code: Alles auswählen

If 1X And 1Y = 2X And 2Y
 Punkte = Punkte +10
EndIf
mache dann müssen sich die Gegenstände ja genau treffen.
Wie geht das dass man auch wenn man streif es als getroffen zählt?
Also das ich die komplette Breite beider Grafiken nutzen kann.

Gruß Lorne

Verfasst: 03.06.2008 16:01
von ZeHa
Denk mal ein bißchen nach :)

Kleiner Tip: Die Breite läßt sich ja auch in Pixeln ausdrücken, also hast Du nicht nur die Positionen der linken oberen Ecke einer Grafik, sondern auch die der rechten oberen Ecke, der linken unteren Ecke und der rechten unteren Ecke ;)

Noch ein Tip: Hol Dir ein Blatt Papier und zeichne das einfach mal auf, und zeichne auch die Positionen mit einem kleinen X an... vielleicht hilft Dir das weiter.

Verfasst: 03.06.2008 16:05
von STARGÅTE
Du musst auch die Breite und Höhe der Grafik wissen:

Vereinfacht angenommen die MittelPunkte der Grafik sind :
x und y und die Breite/Höhe Width und Height:

Code: Alles auswählen

If Abs(xGrafik2-xGrafik1) < WidthGrafik1/2+WidthGrafik2/2 And Abs(yGrafik2-yGrafik1) < HeightGrafik1/2+HeightGrafik2/2
  ;kollision
EndIf

Sry habe eben was geändert!

Verfasst: 03.06.2008 16:48
von Kaeru Gaman
die formeln für die berechnung findest du auch hier:
http://www.purebasic.fr/german/viewtopic.php?t=9093

Verfasst: 03.06.2008 16:50
von ZeHa
Daß Du die halbe Breite als Width bezeichnest ist schon etwas arg. Dann schreib lieber Width / 2 hin, das ist um einiges verständlicher.

Verfasst: 03.06.2008 17:20
von STARGÅTE
jo ok sehe ich hier im Anfängerbereich ein.
Aber da Width/2 zeitverschwendung ist (beim berechnen) kann man sich gleich am anfang Definieren das Width = 32 ist wenn das Bild 64 ist.
Und es dnan so angezeigt wird:
DisplaySprite(Sprite, x-Width, y-Height)

klar kann man dann auch am Anfang HalfWidth=Width/2 Definieren aber ...

naja

habs oben umbenannt

Verfasst: 03.06.2008 17:51
von ZeHa
Gilt nicht nur für den Anfänger-Bereich ;) sondern grade auch Profis sollten (Variablen)namen verwenden, die möglichst genau aussagen, was sie beinhalten ;) und in diesem Fall wäre es nicht nur ungenau, sondern sogar völlig falsch (bzw. irreführend).

In vielen Fällen wird man für die Width und Height wohl sowieso Konstanten benutzen, und ein /2 ist da keine Zeitverschwendung. Bei Variablen zwar schon, aber da ist der Unterschied sooooooo minimal (ein Bitshift nach rechts ist eine einzige (!) Operation), daß er a) nicht der Reder wert ist und man b) für sowas nicht die Lesbarkeit des Codes opfern sollte :)

HalfWidth usw. ist auch käsig irgendwie, also bei solchen Minimal-Kleinigkeiten darf bei mir ruhig 'ne vermeintlich überflüssige Berechnung drin sein ;)

Verfasst: 03.06.2008 18:56
von Kaisky007
löl, warum immer mit widht und height?

für anfänger ist es so verständlicher:

mal angenommen deins ist 30x30 Pixel groß, gehts so:

If 1X < 2X + 30 And 1X + 30 > 2X And 1Y < 2Y + 30 And 1Y + 30 > 2Y
einfach mit kleiner und größer zeichen, capitschke??

Verfasst: 03.06.2008 19:02
von ZeHa
Ja ist unter Umständen wirklich verständlicher, aber Width und Height benutzt man, weil man generell keine "magic numbers" benutzen sollte ;)

Und mit 1X wirst Du beim Kompilieren sicherlich auch ein paar Problemchen kriegen ;)

Also warum nicht so:

Code: Alles auswählen

If xPos1 > xPos2 - Width And xPos1 < xPos2 + Width
    If yPos1 > yPos2 - Height And yPos1 < yPos2 + Height
        ; Kollision
    EndIf
EndIf
Setzt aber voraus, daß Width und Height für beide Sprites gleich ist.

Verfasst: 04.06.2008 11:12
von Lorne
Hallo,
danke schon einmal für die Hilfe.
Also ich habe das nun so gemmacht:

Code: Alles auswählen

If SpriteCollision(0,UFOX,UFOY,5,SteinX,SteinY) Or SpriteCollision(1,UFOX,UFOY,5,SteinX,SteinY) Or SpriteCollision(2,UFOX,UFOY,5,SteinX,SteinY) Or SpriteCollision(3,UFOX,UFOY,5,SteinX,SteinY)
 SteinX=Random(789)
 SteinY=Random(583)
 Punkte = Punkte +10
EndIf
Leider verschwindet der Stein zufrüh wenn ich nach rechts fliege und wenn ich nach links fliege muss ich mit dem Ufo darüber bis er verschwindet.
Ich habe das mit der Höhe und Breite nicht ganz verstanden, kann das daran liegen? Wenn ja, wie baue ich die dann in den Code ein?
Das Ufo ist 32x32 Pixel groß und der Stein 10x16 Pixel.