Kollision mit Speed

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

ToeB

Betreff: Kollision mit Speed

BeitragSo, Jan 06, 2008 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo !
Ich progge grad sowas hier. Jetzt bin ich bei der Collision und hab keine ahnung wies weiter gehen soll.

Code: [AUSKLAPPEN]
Graphics 800,600,16,1
SetBuffer BackBuffer()

;// Die Variablen für die Positon etc. :
Global x#,y#,sx#,sy#,ox#,oy#
Global Leben = 3, Schild = 100
Global start

;// Sonstige Variablen :
;Global timer = CreateTimer(60)
Global fd_frame,fd_fms = MilliSecs()

;// Konstanten für Schwerkraf etc. :
Const grav# = 0.01,speed# = 0.02

;// Images Laden :
Global ship = LoadImage("gfx\Ship.png"):MaskImage ship,255,0,255
Global fire_Down = LoadAnimImage("gfx\flame_down.png",17,20,0,5):MaskImage Fire_down,255,0,255
Global map
;// Arrays :

;// Einstellungen :
HidePointer()
SeedRnd MilliSecs()

LoadLevel(1)

;//Schleife :
Repeat
ox# = x#
oy# = y#
DrawImage map,0,50
Text 1,1,"Schild : "+Schild
Text 1,13,"Leben : "+Leben
Text 1,26,"SpeedX : "+sx+" / SpeedY : "+sy
;// Steuerung :
If KeyDown(200) Then
sy = sy - speed
If fd_fms <= MilliSecs() - 100 And fd_frame < 4 Then
fd_frame = fd_frame + 1
fd_fms = MilliSecs()
EndIf
start = 1
Else
sy = sy + grav
If fd_fms <= MilliSecs() - 100 And fd_frame > -1 Then
fd_frame = fd_frame - 1
fd_fms = MilliSecs()
EndIf
EndIf
If Abs(sy) < 0.01 And start = 1 Then start = 0
sx = sx + (KeyDown(205) - KeyDown(203)) * speed
If start = 1
If ImageRectCollide(map,0,50,0,x+2,y-1,21,1) Then Schild = Schild - Abs(sy)*5:sy = sy * -0.5:y = y + 2
If ImageRectCollide(map,0,50,0,x+2,y+31,21,1) Then Schild = Schild - Abs(sy)*5:sy = sy * -0.5:y = y - 2
If ImageRectCollide(map,0,50,0,x+26,y+2,1,26) Then Schild = Schild - Abs(sx)*5:sx = sx * -0.5:x = x - 2
If ImageRectCollide(map,0,50,0,x-1,y+2,1,26) Then Schild = Schild - Abs(sx)*5:sx = sx * -0.5:x = x + 2
EndIf
If sx > 5 Then sx = 5
If sx <-5 Then sx =-5
If sy > 5 Then sy = 5
If sy <-5 Then sy =-5
;// Positionen Berechnen :
x = x + sx
y = y + sy
;// Grafik Malen :
DrawImage ship,Int(x),Int(y)
If fd_frame > -1 DrawImage fire_down,Int(x)+4,Int(y)+30,fd_frame
;// Grafik Updaten :
;WaitTimer(timer)
Flip
Cls
;// Schleifen beenden wenn Escape
Until KeyHit(1)
;// Programm beenden :
End

;// Functionen :

;// CreateMap für Mapimage erstellen :
Function LoadLevel(Nr)
   dat = ReadFile("Maps\Map"+Nr+".map")
   tex = ReadInt(dat)
   x = ReadInt(dat)
   y = ReadInt(dat) + 50
   If dat <> 0 Then
      grab = LoadImage("gfx\MapTexture2.png")
      img = CreateImage(GraphicsWidth(),GraphicsHeight()-50)
      SetBuffer ImageBuffer(img)
      LockBuffer ImageBuffer(img)
      WritePixelFast(0,0,0)
      black = ReadPixelFast(0,0)
      UnlockBuffer ImageBuffer(img)
      Color 255,255,255
         Color 255,0,255:Rect 0,0,1000,1000:Color 0,0,0
         For xx = 0 To 15
            For yy = 0 To 10
               byte = ReadByte(dat)
               If byte = 1 Then
                  Rect xx*50,yy*50,50,50
               EndIf
            Next
         Next
      back = CreateImage(ImageWidth(img),ImageHeight(img))
      SetBuffer ImageBuffer(back)
      TileBlock grab
      LockBuffer ImageBuffer(img)
      LockBuffer ImageBuffer(back)
         For xx = 0 To ImageWidth(img) - 1
            For yy = 0 To ImageHeight(img) - 1
                pix = ReadPixelFast(xx,yy,ImageBuffer(img))
               If pix = black Then ;Wenn Schwarz ...
               aa = 1
                  WritePixelFast(xx,yy,ReadPixelFast(xx,yy,ImageBuffer(back)),ImageBuffer(img))
               EndIf
            Next
         Next
      UnlockBuffer ImageBuffer(img)
      UnlockBuffer ImageBuffer(back)
      MaskImage img,255,0,255
      Color 255,255,255
      SetBuffer BackBuffer()
      While Not ImageRectCollide(img,0,50,0,x,y,25,30)
      y = y + 1
      Wend
      start = 0
      Schild = 100
      map = CopyImage(img)
      FreeImage img
      FreeImage back
      FreeImage grab
   Else
      Return 0
   EndIf
End Function


Ich will die Collision genau wie in dem Spiel (Link). Wie mach ich dass ?

Danke schonmal...
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Jan 06, 2008 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
In 2D kannst du dir eine Minitileengine schreiben und nur auf die möglichen 4 Felder nach pixelgenauer Kollisions überprüfen. Dazu dann die Raumschiffposition skalliert auf die Dim-Map übertragen und überprüfen.

In 3D kannst du es mithilfe Kollisionsflächen machen. Dazu müsstest du dir eine Miniquadengine schreiben die zudem an den Aussenkanten Kollisionsquad aufweist.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragSo, Jan 06, 2008 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab garkeine Tiles ^^ ich erstelle ein Bild von der Map und überprüf die Dann....

Trotzdem danke...
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Jan 06, 2008 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst natürlich auch ein Bildschirmfüllendes Hintergrundbild (in deinem Beispiel 800x600) nehmen und auf dieser eine Pixelgenaue Kollisionsprüfung machen. Doch wird es nicht sonderlich schnell sein fürchte ich (recourcenmässig).

Pixelgenaue Kollision kannst du mit ql:ImagesCollide machen. Dabei muss aber die ''transparente'' Farbe gemaskt sein.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragSo, Jan 06, 2008 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das hört sich jetzt an als wär ich blöd ^^...

Guck mal hier :
Mein Code hat Folgendes geschrieben:
If ImageRectCollide(map,0,50,0,x+2,y-1,21,1) Then Schild = Schild - Abs(sy)*2:sy = sy * -0.5:y = y + Abs(sy)
If ImageRectCollide(map,0,50,0,x+2,y+31,21,1) Then Schild = Schild - Abs(sy)*2:sy = sy * -0.5:y = y - Abs(sy)
If ImageRectCollide(map,0,50,0,x+26,y+2,1,26) Then Schild = Schild - Abs(sx)*2:sx = sx * -0.5: x = x - Abs(sx)
If ImageRectCollide(map,0,50,0,x-1,y+2,1,26) Then Schild = Schild - Abs(sx)*2:sx = sx * -0.5: x = x + Abs(sx)


Wink
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Jan 06, 2008 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
ql:ImageRectCollide <> ql:ImagesCollide
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group