Je voudrais réaliser un petit saut de sprite.. J'ai regardé les exemples (d'anablast entre autre) mais je ne pige pas.
Idem sur les tutos trouvés du net, ces histoires de vélocité, gravité, accélération ça me déprime.
Auriez vous un algo simple et assez propre de saut ?
Si une bonne âme peut faire un petit tuto là dessus ce sera utile.
Avec un timer ce serait gérable mais j'aimerai une méthode via elapsemillisecond()
Voilà mon code, ne pas tenir compte du code commenté, c'est un mix d'essais foireux.
D'avance merci
Code : Tout sélectionner
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
End
EndIf
Declare CheckFrontiere()
Declare CreaSprite()
Enumeration
#win
#CB1
EndEnumeration
#DROITE = 1
#GAUCHE = 2
#NOMOVE = 0
Structure CB
X.i ; Position X
Xini.i ; Position initial en X (repère pour pour saut)
Y.i ; Position Vertical
dir.b ; direction
vd.b ; vitesse droite
vg.b ; vitesse gauche
a.f ; accélération
t.f ; temps
g.f ; Gravite
EndStructure
Global MonSprite.CB\X
Global MonSprite.CB\Y
Global DIR
Global ySp = 160 - 69 ; Frontière sol (bas)
Global xSP = 800 - 64 ; Frontière ecran (droite)
; Gestion du saut
; Global c = 100 ; Hauteur du saut max
; Global b = MonSprite.CB\X + 200 ; Distance x du saut
; Global a = MonSprite.CB\X
; positionFinale.x = MonSprite.CB\V * tempsApresLancer * Cos(angleDeLancer) + positionInitiale.x;
Macro CoW(champ,valeur)
Global MonSprite.CB\champ = valeur
EndMacro
; INITIALISATION /////////
Cow(Y,ySp)
Cow(X,64)
Cow(Xini,64)
Cow(vd,3)
Cow(vg,-3)
Cow(g,9.6)
Cow(Dir,#Droite)
;////////////////////////
If OpenWindow(#win, 0, 0, 800, 160, "sprite jump", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
DIR = #NOMOVE
If OpenWindowedScreen(WindowID(0), 0, 0, 800, 160)
KeyboardMode(#PB_Keyboard_International)
CreaSprite()
Else
MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
End
EndIf
EndIf
Repeat
; Double repeat / event et 2D
;
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Gadget
If EventGadget() = 0
End
EndIf
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
; ***************** PARTIE 2D
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
ExamineKeyboard()
; GAUCHE
If KeyboardPushed(#PB_Key_Q)
DIR = #GAUCHE
LastDIR = #GAUCHE
MonSprite.CB\X + MonSprite.CB\vg
; DROITE
ElseIf KeyboardPushed(#PB_Key_D)
DIR = #DROITE
LastDIR = #DROITE
MonSprite.CB\X + MonSprite.CB\vd
EndIf
; SAUT
If KeyboardPushed(#PB_Key_Space)
Debug "hop"
Saut = #True
Else
DIR = #NOMOVE
EndIf
; AFFICHAGE
If Saut = #True
; t = ElapsedMilliseconds()
; While ElapsedMilliseconds() < t + 2000
; MonSprite.CB\X = 0.5*MonSprite.CB\a * t * t + MonSprite.CB\v * t + MonSprite.CB\Xini
; MonSprite.CB\y + 3
; Wend
Saut = #False
EndIf
; TransparentSpriteColor(#CB1,$FF00FF)
DisplayTransparentSprite(#CB1, MonSprite.CB\X, MonSprite.CB\Y)
CheckFrontiere()
Delay(1)
ForEver
Procedure CheckFrontiere()
Shared MonSprite.CB\X, MonSprite.CB\Y, ySp, xSp
Debug Str(Xsp) + " / " + Str(MonSprite.CB\X)
With MonSprite.CB
If \X >= xSP : \X = xSP : EndIf
If \X <= 0 : \X = 0 : EndIf
If \Y >= ySp : \Y = ySp : EndIf
If \Y <= 43 : \Y = 43 : EndIf
EndWith
EndProcedure
Procedure CreaSprite()
CreateSprite(#CB1, 64,69)
StartDrawing(SpriteOutput(#CB1))
Box(0,0,64,69,$0000FF)
StopDrawing()
EndProcedure