Avec le code précédent il n'était pas possible de déplacer le carré avec les fléches et je ne testais pas les collisions frontales.
C'est chose fait avec ce nouveau code.
Code : Tout sélectionner
;Gravity & Bounce V1.5
EnableExplicit
Global Event
Global Image
;Sprite structure
Structure newSprite
id.i
x.i
y.i
direction.i
velocityX.f
speedX.f
speedY.f
gravity.f
gravitySpeed.f
bounce.f
impulse.f
collide.b
collideY.f
EndStructure
;Square
Global square.newSprite
Global ground.newSprite
Global NewMap scene.newSprite()
;Init
InitSprite() : InitKeyboard()
UsePNGImageDecoder() : UsePNGImageEncoder()
;Screen
OpenWindow(0, 0, 0, 800, 600, "Gravity & Bounce", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
;Create a awesome spite sheet ^^
Image = CreateImage(#PB_Any, 32, 32, 24, RGB(255, 255, 255))
SaveImage(Image, "WhiteSquare.png", #PB_ImagePlugin_PNG)
;Setup square
With square
\id = LoadSprite(#PB_Any, "WhiteSquare.png")
\x = 10
\y = 100
\direction = 1 ;Default Right
\velocityX = 2
\speedX = \velocityX
\gravity = 0.09
\bounce = 0.5
\impulse = 5
;Change color
StartDrawing(SpriteOutput(\id))
Box(0, 0, 32, 32, RGB(255, 0, 0))
StopDrawing()
EndWith
;Setup Scene
AddMapElement(scene(), "ground")
scene()\id = LoadSprite(#PB_Any, "WhiteSquare.png")
scene()\x = 0
scene()\y = ScreenHeight() -20
ZoomSprite(scene()\id, ScreenWidth(), 20)
AddMapElement(scene(), "block1")
scene()\id = LoadSprite(#PB_Any, "WhiteSquare.png")
scene()\x = 200
scene()\y = 560
ZoomSprite(scene()\id, 600, 20)
AddMapElement(scene(), "block2")
scene()\id = LoadSprite(#PB_Any, "WhiteSquare.png")
scene()\x = 300
scene()\y = 500
ZoomSprite(scene()\id, 100, 80)
AddMapElement(scene(), "block3")
scene()\id = LoadSprite(#PB_Any, "WhiteSquare.png")
scene()\x = 400
scene()\y = 450
ZoomSprite(scene()\id, 200, 110)
AddMapElement(scene(), "Wall left")
scene()\id = LoadSprite(#PB_Any, "WhiteSquare.png")
scene()\x = 0
scene()\y = 200
ZoomSprite(scene()\id, 20, 400)
AddMapElement(scene(), "Wall Right")
scene()\id = LoadSprite(#PB_Any, "WhiteSquare.png")
scene()\x = 780
scene()\y = 200
ZoomSprite(scene()\id, 20, 400)
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
FlipBuffers()
ClearScreen(RGB(135, 206, 235))
;Display Scene
ForEach Scene()
DisplaySprite(scene()\id, scene()\x, scene()\y)
Next
;Display square
With square
DisplaySprite(\id, \x, \y)
EndWith
;Hit with object
ForEach scene()
If SpriteCollision(square\id, square\x, square\y, scene()\id, scene()\x, scene()\y) And square\collide = #False
;Horizontal displacement = 0
square\speedX = 0
If square\x - scene()\x <= 0 And MapKey(Scene()) <> "ground" And square\direction = 1
;Right vertical collision
square\x = scene()\x - (SpriteWidth(square\id))
square\speedX = square\velocityX * -1
ElseIf (scene()\x + SpriteWidth(scene()\id)) - square\x <= Abs(Int(square\velocityX)) And MapKey(Scene()) <> "ground"
;Left vertical collision
square\x = scene()\x + SpriteWidth(scene()\id)
square\speedX = square\velocityX
Else
;Horizontal collision
square\y = scene()\y - SpriteHeight(square\id)
square\collideY = square\y
square\collide = #True
EndIf
EndIf
Next
;New square position
With square
\gravitySpeed + \gravity
\x + \speedX
\y + \speedY + \gravitySpeed
;Bouce if collision
If \collide = #True
If \y >= \collideY
\y = \collideY
\gravitySpeed = - (\gravitySpeed * \bounce)
EndIf
EndIf
;Out of bound
If \x < 0 Or \x > ScreenWidth() - SpriteWidth(\id)
\speedX * -1
EndIf
EndWith
;Pulse up
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Space) And square\collide = #True ;square\speedX = 0
square\gravitySpeed - square\impulse
square\speedX = square\velocityX * square\direction
square\collide = #False
EndIf
;Move to left : Gravity speed must be = 0
If square\collide = #True
If KeyboardPushed(#PB_Key_Left)
square\direction = -1
square\speedX = square\velocityX * square\direction
square\collide = #False
;Move to left : Gravity speed must be = 0
ElseIf KeyboardPushed(#PB_Key_Right)
square\direction = 1
square\speedX = square\velocityX * square\direction
square\collide = #False
EndIf
EndIf
Until KeyboardPushed(#PB_Key_Escape)
- Flèches gauche ou droit pour déplacer le carré.
- Barre d'espace pour l'impulsion.