[B2D,B+,B3D] Saubere Kollision auf Basis von ImagesCollide
Übersicht

![]() |
DerHaseBetreff: [B2D,B+,B3D] Saubere Kollision auf Basis von ImagesCollide |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Global outx
Global outy Function CollideGuy (g1,x1#,y1#,xalt1#,yalt1#,frame1,g2,x2,y2,frame2) xstep1# = xalt1# - x1# ystep1# = yalt1# - y1# If Abs(xstep1#) > Abs(ystep1#) xstep1b# = xstep1# / Abs(xstep1#) ystep1b# = ystep1# / Abs(xstep1#) Else xstep1b# = xstep1# / Abs(ystep1#) ystep1b# = ystep1# / Abs(ystep1#) End If While ImagesCollide (g1,x1,y1,frame1,g2,x2,y2,frame2) If Abs(x1) <> Abs(xalt1) x1# = x1# + xstep1b# End If If Abs(y1) <> Abs(yalt1) y1# = y1# + yStep1b# End If c = 1 If x1 = xalt1 And y1 = yalt1 Exit End If Wend outx = x1 outy = y1 Return c Bei einer Kollision setzt diese Funktion, das bewegte Image genau neben das Image, gegen das es gestoßen ist. Zunächst muss man die Position des Images speicher und danach erst ändern. Nachdem man die Position des Images verändert hat, muss man diese Funktion mit allen in Frage kommenden Images in der Nähe nacheinander durchgeführen. Wenn eine Kollision stattfindet wird das Image Pixelweise gen die alte Position geschoben, bis keine Kollision mehr stattfindet. So verhindert man ein hängenbleiben zweier Images. Da kein Call by Reference mit BB möglich ist, muss man 2 Hilfsvariablen für den Output der Funktion benützen. Der Code sieht dann ungefähr so aus: Code: [AUSKLAPPEN] pxalt = px
pyalt = py moveplayer() If CollideGuy (player,px#,py#,pxalt#,pyalt#,pframe,Background,bx#,by,0) px# = out1 py# = out2 End If If CollideGuy (player,px#,py#,pxalt#,pyalt#,pframe,Gegner,gx#,gy#,gframe) px# = out1 py# = out2 End If Wenn Ihr Fragen oder Ideen habt, dann schreibt in diesen Thread! |
||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi.
Ich blick da ni9cht durch! Was soll das sein? man kann doch bilder einfach so mit Imagescollide collidieren lassen. MfG Blitzcoder |
||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn Du nur Imagescollid verwendest und eine höhere Geschwindigkeit als 1 Pixel / Schleifendurchgang hast, kann es gut sein, dass Deine Figur z.B. Teile der Wand überlappt, oder beim zurücksetzen eine Lücke zwischen Wand und Figur entsteht. Mit dieser Funktion liegt die Figut exat an der Wand an ![]() |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
px# = out1
py# = out2 muss das nicht pxalt 1 und 2 heißen? MfG |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
@5k41: Nein. | ||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
sorry, stimmt! Hab mir den Code zu kurz angesehen, verfahren ist mir nun klar!
MfG |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kein Problem ![]() |
||
CodeMaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kleiner allgemeiner Tip von mir: Um diese unschönen globalen Variablen zu vermeiden (so gebräuchlich diese Taktik im Lowlevel auch sein mag...), und trotzdem mehr als einen Parameter zurückgeben zu können, gebt Typen zurück:
Code: [AUSKLAPPEN] ; DECLARATION ##############################################
Type TPosition Field X# Field Y# End Type ; IMPLEMENTATION ########################################### Function Main() Local Pos.TPosition Graphics 640,480,0,2 SetBuffer BackBuffer() While Not KeyDown( 1 ) Cls Pos = GetMousePosition() Text 0, 0, "X = " + Pos\X Text 0, 12, "Y = " + Pos\Y Free( Handle( Pos ) ) Flip Wend End Function ; -------------------------------------------------------- Function Free( hndl% ) Select True Case Object.TPosition( hndl ) <> Null TPosition_Destroy( Object.TPosition( hndl ) ) End Select End Function ; -------------------------------------------------------- Function TPosition_Create.TPosition() Local l_Position.TPosition = New TPosition Return l_Position End Function Function TPosition_Destroy( p_Position.TPosition ) Delete p_Position End Function Function GetMousePosition.TPosition() Local l_Position.TPosition = TPosition_Create() l_Position\X = MouseX() l_Position\Y = MouseY() Return l_Position End Function ; PROGRAM ################################################## Main End Hat man zugleich noch den gewissen Touch OOP ![]() |
||
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.
Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102 |
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah cool Codemaster, ich werde es mir mal ankucken. Ich war mir einfach absolut nicht sicher wie ich das am besten löse, hatte auch über Types nachgedacht, aber dann der einfachhaber Globals genommen. Ich werde es bei Gelegenheit so umschreiben, sobald ich mal wieder Zeit hab! | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group