2D Kollision genauer machen
Übersicht

![]() |
BjörnBetreff: 2D Kollision genauer machen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo ![]() in meinem 2D-Spiel habe ich eine Kollisionsprüfung mit Code: [AUSKLAPPEN] ImagesCollide(schuss,s\x,s\y,0,player,x,y,0)
Diese ist aber sehr ungenau soll heißen mann kann ruhig fünt pixel zu tief schießen und der Treffer zählt trotzdem. Die Grafik ist ca. 30x60 Pixel groß. Gibt es eine Möglichkeit die Kollisionsabfrage zu verbessern? Björn |
||
www.brickmovies.de |
![]() |
Spikespine |
![]() Antworten mit Zitat ![]() |
---|---|---|
Imagescollide ist normlaerweise ganz genau, wenn transparente bereiche im Bild sind...
genauer gehts eigentlich nicht, wenn du die Kollision zweier Bilder prüfst... |
||
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax |
KifferopaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Die heilige Online-Hilfe hat Folgendes geschrieben: Wert=IMAGERECTCOLLIDE (Bild, X, Y, Frame, StartX, StartY, Breite, Höhe)
Beschreibung Diese Funktion überprüft, ob ein Bild einen rechteckigen Bereich berührt oder überlappt. Dies ist besonders für Objekte mit transparenter Farbe gut geeignet. Die Prüfung geschieht pixelgenau - daher etwas langsamer als IMAGERECTOVERLAP. Um die Kollision zwischen zwei Bilder zu prüfen, ist der Befehl IMAGESCOLLIDE besser. Benutze MASKIMAGE, um eine transparente Farbe auszuwählen! Diese Grafik zeigt eine saubere, pixelgenaue Kollision, die mit dieser Funktion ermittelt werden kann. Parameter Bild = Identität des Bildes (z.B. mit LOADIMAGE ermittelt) X = Hor. Position des Bildes Y = Ver. Position des Bildes Frame = Animationsframe des Bildes (ab 0) StartX = Hor. Startkoordinate des rechteckigen Bereichs StartY = Ver. Startkoordinate des rechteckigen Bereichs Breite = Breite des rechteckigen Bereichs Höhe = Höhe des rechteckigen Bereichs Rückgabewert 0 = keine Kollision 1 = Kollision Beispiel Dieses Programm zeichnet einen Kreis. Wenn dieser Kreis einen rechteckigen Bereich berührt, dann wird das Programm gestoppt: GRAPHICS 640,480,0,1 gfxCircle=CREATEIMAGE(50,50) SETBUFFER IMAGEBUFFER(gfxCircle) COLOR 255,0,0 OVAL 10,10,30,30,1 SETBUFFER BACKBUFFER() Color 0,0,255 hotX=RND(50,610) hotY=RND(50,430) hotW=RND(20,100) hotH=RND(20,100) REPEAT circleX=MOUSEX() circleY=MOUSEY() CLS RECT hotX,hotY,hotW,hotH,0 DRAWIMAGE gfxCircle,circleX,circleY FLIP UNTIL IMAGERECTCOLLIDE (gfxCircle,circleX,circleY,0,hotX,hotY,hotW,hotH) TEXT 0,0, "Kollision! Maustaste drücken" FLIP WAITMOUSE() ENDGRAPHICS |
||
![]() |
Spikespine |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Kifferopa:
ImagesCollide prüft beide Bilder auf eine Pixelgenaue kollision! |
||
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax |
krux |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du hast den Frame am anfang auf null gestellt du solltest ihn aber immer auf das auch aktivangezeigte bilst Stellen , das geht leicht mit einer Variable.
Du darfst nicht vergessen auch eine Tranzparente Farbe festzulegen |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
@krux: Ist ja gut möglich das die Bilder nicht animiert sind ![]() Wie weit bewegst Du den Schuss pro Hauptschleifendurchlauf? Wenn er z.B. 5 Pixel bewegt wird ists klar das er ins Ziel reinragt ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Ebola33 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was unser Hubsi damit sagen will ist,
daß wenn sich dein Schuss nur mit 1. Pixel/Schleifendurchlauf bewegen würde Imagescollide auch auf den Pixel genau wäre. ![]() |
||
ansteckend... ![]() verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/ |
KifferopaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Spikespine hat Folgendes geschrieben: @ Kifferopa:
ImagesCollide prüft beide Bilder auf eine Pixelgenaue kollision! Aber das weiß ich doch. Habe ich was falsches gesagt? ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group