Growbook, Cannabis, Notizbuch, Growbuch, Pflanzenzucht, Samenbank, Seedbank, Software, Stammbaum, Kreuzen, züchten,growen,anbauen,News,GIB,Lux,Omega,Mars, Dünger,BioBizz,Hesi,Athena,
die Software für deinen Anbau

Willkommen

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.
Max3 1Max3 1 2


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 smile
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)