Hilfe bei der Collision und geschwindigkeit
Verfasst: 09.04.2010 19:26
guten tag zusammen ich habe mit hilfe vieleer leute hier aus dem forum einn beta version des spiels jump or die programmiert.wen man zu sich zu erst bewegt klappt auch alles ganz flüssig nur wenn man den stern berührt harkt es sehr stark und ich vermute das an der collisions abfrage liegt nur ich kann mir den fehler inicht erklären.
Code: Alles auswählen
InitSprite()
InitSprite3D()
InitKeyboard()
InitSound()
InitMovie()
;Procedure Collision
Procedure BoxKolli(X1,Y1,W1,H1, X2,Y2,W2,H2)
If X1<X2+W2 And X1+W1>X2
If Y1<Y2+H2 And Y1+H1>Y2
ProcedureReturn 1
EndIf
EndIf
ProcedureReturn 0
EndProcedure
#W=16
#H=16
s=16
l=16
;Leveldaten
Dim Feld(#W,#H)
Dim solid(s,l)
For i=0 To 16 Step 1
solid(i,11)=1
Next
;Variables
audio=100
Score=0
;Screen
ExamineDesktops()
OpenWindow(0,0,0,1024,768,"Basic Ghost v1.0")
OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0)
;Sound
LoadSound(0,"sfx\flag.wav")
LoadMovie(0,"sfx\music\background.mp3")
;Jetzt brauchen wir noch ein paar Grafiken
LoadSprite(0,"gfx\player.bmp",0)
TransparentSpriteColor(0,$FFFFFF)
LoadSprite(1,"gfx\stone.bmp",0)
TransparentSpriteColor(1,$FFFFFF)
LoadSprite(2,"gfx\sun.bmp",0)
LoadSprite(20,"gfx\sun.bmp",#PB_Sprite_Texture)
LoadSprite(3,"gfx\door.bmp",0)
TransparentSpriteColor(3,$FFFFFF)
LoadSprite(4,"gfx\next-level.bmp",0)
TransparentSpriteColor(4,$FFFFFF)
CreateSprite3D(1,20)
;Die Variabeln für den Spieler
Define.l PlayerX,PlayerY;Position
Define.f MoveX,MoveY
PlayerW=SpriteWidth(0) ;Breite des Spielers
PlayerH=SpriteHeight(0);Höhe des Spielers
TileW=SpriteWidth(1) ;Breite eines Tiles
TileH=SpriteHeight(1);Höhe eines Tiles
Define.b OnGround;
For i=0 To 10 Step 1
PlayMovie(0,WindowID(0))
Next
Repeat
ExamineKeyboard()
Start3D()
If IsScreenActive()
ClearScreen(RGB(100,0,255))
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
MoveX=0
MoveY+0.5
If KeyboardPushed(#PB_Key_Left)
MoveX-5
EndIf
If KeyboardPushed(#PB_Key_Right)
MoveX+5
EndIf
If OnGround
If KeyboardPushed(#PB_Key_Space)
MoveY=-15 ;Größerer Wert=Höherer Sprung
PlaySound(0)
EndIf
EndIf
;Variables Player
PlayerY+MoveY
OnGround=0
Hit=0
;***********Not Solid***********
;Collision Y
For x=0 To #W
For y=0 To #H
If Feld(x,y)=1
If BoxKolli(x*TileW,y*TileH,TileW,TileH,PlayerX,PlayerY,PlayerW,PlayerH) ;
Feld(x,y)=0
Score=Score+1
Hit=1
If MoveY<0;
PlayerY=Y*TileH+TileH;Untere Seite
ElseIf MoveY>0
OnGround=1
PlayerY=Y*TileH-PlayerH;Linke Seite
EndIf
EndIf
EndIf
Next y
Next x
If Hit=1
MoveY=0
EndIf
;Collision X
PlayerX+MoveX
Hit=0
For x=0 To #W
For y=0 To #H
If Feld(x,y)=1
If BoxKolli(x*TileW,y*TileH,TileW,TileH,PlayerX,PlayerY,PlayerW,PlayerH)
Hit=1
If MoveX<0
PlayerX=X*TileW+TileW
ElseIf MoveX>0
PlayerX=X*TileW-PlayerW
EndIf
EndIf
EndIf
Next y
Next x
If Hit=1
MoveX=0
EndIf
;***********Solid***********
;Colision Y
For x=0 To s
For y=0 To l
If solid(x,y)=1
If BoxKolli(x*TileW,y*TileH,TileW,TileH,PlayerX,PlayerY,PlayerW,PlayerH)
Hit=1
If MoveY<0
PlayerY=Y*TileH+TileH;Untere Seite
ElseIf MoveY>0
OnGround=1
PlayerY=Y*TileH-PlayerH;Linke Seite
EndIf
EndIf
EndIf
Next y
Next x
If Hit=1
MoveY=0
EndIf
;Collision X
For x=0 To s
For y=0 To l
If solid(x,y)=1
If BoxKolli(x*TileW,y*TileH,TileW,TileH,PlayerX,PlayerY,PlayerW,PlayerH)
Hit=1
If MoveX<0
PlayerX=X*TileW+TileW
ElseIf MoveX>0
PlayerX=X*TileW-PlayerW
EndIf
EndIf
EndIf
Next y
Next x
If Hit=1
MoveX=0
EndIf
If SpriteCollision(0,PlayerX,PlayerY,3,800,650)=1
DisplayTransparentSprite(4,500,500)
For i=0 To 16 Step 1
Feld(i,11)=1
Next
For i=0 To 9 Step 1
Feld(i,9)=1
Next
For i=0 To 9 Step 1
Feld(i,3)=1
Next
EndIf
;Draw solid
For x=0 To s
For y=0 To l
Select solid(x,y)
Case 0
Case 1
DisplayTransparentSprite(1,x*TileW,y*TileH)
EndSelect
Next y
Next x
;Draw not solid
For x=0 To #W
For y=0 To #H
Select Feld(x,y)
Case 0
Case 1
DisplayTransparentSprite(1,x*TileW,y*TileH)
EndSelect
Next y
Next x
;Display Sprites
DisplayTransparentSprite(0,PlayerX,PlayerY)
DisplayTransparentSprite(3,800,650)
DisplaySprite3D(1,100,100)
RotateSprite3D(1,2, #PB_Relative)
FlipBuffers()
EndIf
If KeyboardReleased(#PB_Key_PadEnter)
PlayerY=32
EndIf
If KeyboardReleased(#PB_Key_Add)
audio=audio+10
MovieAudio(0,audio,0)
If audio>=100
audio=100
EndIf
EndIf
If KeyboardReleased(#PB_Key_PadEnter)
PlayerY=32
EndIf
If KeyboardReleased(#PB_Key_Subtract)
audio=audio-10
MovieAudio(0,audio,0)
If audio>=100
audio=100
EndIf
EndIf
If KeyboardReleased(#PB_Key_R)
For i=0 To 16 Step 1
Feld(i,11)=1
Next
PlayerX=0
PlayerY=0
MoveY=0
Score=0
EndIf
ForEver