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

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

DerHase

Betreff: [B2D,B+,B3D] Saubere Kollision auf Basis von ImagesCollide

BeitragSo, Jun 25, 2006 2:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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!

Blitzcoder

Newsposter

BeitragSo, Jun 25, 2006 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 25, 2006 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

5k41

BeitragSo, Jun 25, 2006 11:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 25, 2006 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@5k41: Nein.

5k41

BeitragSo, Jun 25, 2006 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 25, 2006 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Problem Wink
 

CodeMaster

BeitragSo, Jun 25, 2006 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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

BeitragMo, Jun 26, 2006 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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!

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group