Page 1 sur 1

Saut d'un personnage

Publié : dim. 09/sept./2007 21:01
par Chris
En trainant dans le forum, j'ai vu que quelqu'un demandait comment on pouvait faire "sauter" un personnage. Alors j'ai mis à jour un truc que j'avais dans mes archives.

Flèches G et D pour avancer/reculer. Flèche H pour sauter. Esc pour sortir

Si ça peut être utile à quelqu'un...

[PS] Vous remarquerez que quand le sprite va à gauche ou à droite, il stoppe immédiatement quand on lache la touche. Par contre, si il saute en avancant, il ne s'arrete d'avancer que quand il a touché le sol

Bah oui! On n'a jamais vu ça, un mec qui saute en courant et qui s'arrete en l'air pour retomber comme une bouse. :lol:

Code : Tout sélectionner

Enumeration
  #Win_Main
EndEnumeration

#Screen_Width = 1024
#Screen_Height = 768

#Step = 8  ; Vitesse de déplacement


Procedure CreateWinMain()
  If OpenWindow(#Win_Main, 0, 0, #Screen_Width, #Screen_Height, "My Window - [Escape pour sortir]",  #PB_Window_ScreenCentered )
  Ret = #True : Else : Ret = #False
  EndIf
  
  ProcedureReturn Ret
EndProcedure

Procedure Init_Screen()
  If InitSprite() = 0 Or InitMouse() = 0 Or InitKeyboard() = 0 Or InitSprite3D() = 0
    MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
    
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure

Procedure Create_Sprite(Sprite, x, y, w, h, Couleur)
  If CreateSprite(Sprite, w, h, 0)
    StartDrawing(SpriteOutput(Sprite))
    Box(x, y, w, h, Couleur)
    StopDrawing()
  EndIf
EndProcedure

If CreateWinMain()
  If Init_Screen() = #False : End : EndIf
EndIf

If OpenWindowedScreen(WindowID(#Win_Main), 0, 0, #Screen_Width, #Screen_Height, 0, 0, 0)
  Create_Sprite(0, 0, 0, 24, 24, $FFFF00)
  
  x_Spr = 100 : y_Spr = #Screen_Height - 24 : Jump = 15 : limit = -Jump -1
  
  Repeat
    FlipBuffers() : ClearScreen(0) : ExamineKeyboard()
    
    ; Données à l'écran
    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(10, 10, "X = " + Str(x_Spr), $FFFFFF)
    DrawText(10, 30, "Y = " + Str(y_Spr), $FFFFFF)
    DrawText(10, 50, "Jump = " + Str(Jump), $FFFFFF)
    StopDrawing()
    
    
    DisplaySprite(0, x_Spr, y_Spr)
    
    ;/ Déplacements et sauts
    If x_Spr < 0 : x_Spr = 0 : EndIf
    If x_Spr > #Screen_Width -24 : x_Spr = #Screen_Width - 24 : EndIf
    
    ; Saute en allant à droite
    If flag_Jump = 1 And flag_R = 1
      y_Spr - Jump : Jump -1 : x_Spr + #Step
      If Jump = limit : Jump = 15 : flag_Jump = 0 : flag_R = 0 : EndIf
      
    ; Saute en allant à gauche
    ElseIf flag_Jump = 1 And flag_L = 1
      y_Spr - Jump : Jump -1 : x_Spr - #Step
      If Jump = limit : Jump = 15 : flag_Jump = 0 : flag_L = 0 : EndIf
      
    ; Va à Droite
    ElseIf flag_Jump = 0 And flag_R = 1
      x_Spr + #Step
      
    ; Va à gauche
    ElseIf flag_Jump = 0 And flag_L = 1
      x_Spr - #Step
      
    ; Saute sur place comme un con
    ElseIf flag_Jump = 1 And (flag_L = 0 And flag_R = 0)
      y_Spr - Jump : Jump -1
      If Jump = limit : Jump = 15 : flag_Jump = 0 : EndIf
    EndIf
    
    ;/ Clavier
    If KeyboardPushed(#PB_Key_Right)
        flag_R = 1
    EndIf
    If KeyboardReleased(#PB_Key_Right) And flag_Jump = 0
      flag_R = 0
    EndIf
    
    If KeyboardPushed(#PB_Key_Left)
         flag_L = 1
    EndIf
    If KeyboardReleased(#PB_Key_Left) And flag_Jump = 0
      flag_L = 0
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)
      flag_Jump = 1
    EndIf
    
    
    
    ;/ Gestion des évènements de la fenêtre
    Delay(1) : While WindowEvent() : Wend
    
  Until KeyboardPushed(#PB_Key_Escape)
EndIf
End

Publié : lun. 10/sept./2007 17:59
par flaith
Toujours utile, merci pour le code :D

petit bug :va vers la droite saute en l'air et appuie, pendant que tu es en l'air, sur la gauche et relache => le sprite se déplace tout seul vers la gauche, va vers la droite et relache le bouton, il va tout seul à gauche :wink:

** EDIT ** : Cela n'est vrai que sous GNU/Linux, sous Windows c'est OK
De plus, sous Nux on peut changer de direction pendant que l'on saute (pas sous Windows) :?

** EDIT II ** : Idem sous Windows quand on vient de la droite et que l'on va vers la gauche :? x 2

Publié : mar. 11/sept./2007 17:17
par Chris
Ce que j'ai posté, c'est uniquement un principe de base, le plus simplifié possible (enfin... le plus simplifié que j'ai pu faire, surtout!). Il y a d'autre moyens un peu plus compliqués tenant compte d'une pseudo gravité. Je ne sais même pas si ce serait réellement utilisable "tel quel" dans un jeu.
Pour les bugs, je ne les ai même pas cherchés. Ce qui est sur, c'est que c'est largement optimisable.

Publié : mar. 11/sept./2007 21:06
par beauregard
Chris a écrit :Ce que j'ai posté, c'est uniquement un principe de base, le plus simplifié possible (enfin... le plus simplifié que j'ai pu faire, surtout!). Il y a d'autre moyens un peu plus compliqués tenant compte d'une pseudo gravité. Je ne sais même pas si ce serait réellement utilisable "tel quel" dans un jeu.
Si j'osai, j'affirmerai qu'il faut faire simple. surtout au début, parce qu'après ça se complique inéluctablement... et voici sur cette page, un code tombé dans l'oubli...
http://www.purebasic.fr/french/viewtopi ... c&start=15