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