Max2D Kollision Teil 3
Max2D Kollision Teil 3 (c) Assari 2006
Ins Deutsche übersetzt von simi
Im vorherigen Tutorial sahen wir, wie man Kollisionen mit CollideImage erkennen kann. CollideImage detektiert die Kollision pixlegenau. Wir können das einfach überprüfen, indem wir unseren Player zum Spaceship hinbewegen, und beobachten, wie sich die Farbe exakt ändert.
Aber wie erwartet verbraucht diese pixelperfekte Prüfung viel Zeit und macht dein Spiel dadurch langsamer.
CollideRect
Die Syntax für CollideRect ist ähnlich wie die von CollideImage.
Function CollideRect:Object[](x,y,w,h,collidemask%,writemask%,id:Object=Null) |
Lass uns unser vorheriges Programm neu mit der CollideRect-Funktion schreiben.
Strict Graphics 640,480 AutoMidHandle True Local URL:String="http::www.hanfgebiet.de/" Local SpaceShip:TImage=LoadImage(LoadBank(URL+"blobship_1-1.png")) Local AlienShip1:TImage=LoadImage(LoadBank(URL+"cartoonufo_1-1.png")) Local AlienShip2:TImage=LoadImage(LoadBank(URL+"cartoonufo_1-1.png")) Local w:int=ImageWidth(SpaceShip) Local h:int=ImageHeight(SpaceShip) Repeat Cls Local R:Int=0 Local G:Int=0 Local B:Int=255 ResetCollisions() SetColor 255,255,255 DrawImage AlienShip1, 250,100 CollideImage(AlienShip1,250,100,0,0,1,AlienShip1) DrawImage AlienShip2, 400,100 CollideImage(AlienShip2,400,100,0,0,1,AlienShip2) Local p:Object[]=CollideRect(MouseX()-w,MouseY()-h,100,100,1,0) For Local i:TImage=EachIn p Select i Case AlienShip1 R=255 Case AlienShip2 G=255 End Select Next SetColor R,G,B DrawRect MouseX()-w,MouseY()-h,100,100 DrawImage SpaceShip,MouseX(),MouseY() Flip Until KeyDown(KEY_ESCAPE) Or AppTerminate() |
Beachte wie die Kollision erkennt wird, wenn das Rechteck das AlienShip berührt, wenn das SpaceShip noch weit entfernt ist. Versuche das obige Programm ohne den DrawRect-Befehl aufzurufen. Es wird sich nicht ändern, da die Kollisionsüberprüfung von der CollideRect-Funktion gemacht wird.
Das gute daran ist, dass CollideRect die Objekte, die vom Rechteck berührt werden, zurückgibt. Du kannst dann diese Objekte nochmals mit pixelgenauer Kollision überprüfen. Der Code würde etwa so aussehen:
Local p:Object[]=CollideRect(MouseX()-w,MouseY()-h,100,100,1,0) For Local i:TImage=EachIn p If ImagesCollide(i,150,200,0,SpaceShip,MouseX(),MouseY(),0) SetClsColor 255,0,0 Else SetClsColor 0,0,0 EndIf Next |
AutoMidHandle
Beachte dass die Startkoordinate vom zu zeichnende Bild sehr wichtig ist für die Kollision. Die x- und y-Positionen müssen in der CollideImage/CollideRect-Funktion dieselben sein, wie sie in der DrawImage-Funktion verwendet werden. Beachte dass ich die MouseX()- und MouseY()-Position so mit der Höhe und Breite des Bildes abstimme, dass sich das Rechteck in der Nähe des Bildes befindet.
If CollideRect(MouseX(),MouseY(),2,2,1,0) And MouseDown(1) <Hier kommt dein Code> EndIf |
In einer weiterentwickelten Version, kannst du das zurückgegebene Objekt für weitere Aktionen benutzen.
Local p:Object[]=CollideRect(MouseX(),MouseY(),2,2,1,0) And MouseDown(1) For Local i:TImage=EachIn p Select i Case Alien <Hier kommt dein Code> Case Player <Hier kommt dein Code> EndSelect Next |
Das dritte Tutorial hat dich in die CollideRect-Funktion eingeführt, die ein schnellerer Weg für die Kollisionsüberprüfung ist. Du musst selbst ausprobieren ob diese Technik benötigt wird oder nicht. Nur CollideImage zu benutzen ist einfacher.
OK. Das wäre es. Es gibt noch mehr Zeugs zum lesen, wenn du hungrig danach bist
Wenn du mehr über Kollisionstechniken lesen möchtest (nicht spezifisch für BlitzMax), kannst du "Weiterführende Quellen"-Liste auschecken.
Allerdings sind alle unten aufgeführten Links in englischer Sprache!
Links zu weiteren BlitzMax-Kollisions-Codes
Sammlung von Kollisionsfunktionen von Oddball im Code-Archiv
Spezieller Dank an Tom für das Codebeispiel, das mir das "Aha"-Erlebnis gab. (Link)
Code zum demonstrieren, wie man CollideImage mit mehrere Objekten nutzen kann. (Link)
Code zum zeigen, wie man CollideImage mit zurückgegebenen Identifizierobjekten benutzt. (Link)