Page 1 sur 1

[RESOLU] Soucis de KeyboardReleased

Publié : dim. 28/oct./2018 16:35
par Ar-S
Image

Je fais un mini jeu pour un petit contest d'halloween
Je suis embêté par une historie de KeyboardReleased
Lorsque je tire, un rayon sort des yeux de ma citrouille... Mais ce dernier ne disparait pas quand je relache "espace"..
J'ai essayé via ellapsemillisecond de modifier le statu shoot = 1 en shoot = 0 mais rien ni fait.
Je suis sûr que c'est une connerie débile mais je ne la vois pas.
Vu que c'est pour le 31 j'aimerai que vous jetiez un oeil pour voir si vous choppez le problème.

Merci

Lien de l'archive : http://share.ldvmultimedia.com/DBF_HALLOWEEN_ARS.7z

Code : Tout sélectionner

; Ghost N Pumpkin 
; Code / Gfx / Zik By Ar-S 
; For DBF Halloween contest 2018


InitSound()           

Enumeration 10

  #ZR
  #ZL
  #PR
  #PL
  #LAZR
  #LAZL
  ; BackGround
  #BG
  ; Zik
  #ZIK
  #eua
EndEnumeration

Global shoot.b

Structure SP
  ID.i
  x.i
  y.i
  s.b
  dir.b
  v.b ; velocité
EndStructure



; INTITIALISATION
Shoot = #False
P.SP
P\ID = #PR
P\X = 950
P\Y = 850
Jump = #True

LAZ.SP
LAZ\ID = #LAZR
LAZ\X = P\X -17
LAZ\Y = P\Y - 17

Global Dim Z.SP(9)



InitSprite()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
UseJPEGImageDecoder()
UseOGGSoundDecoder()


; Procedure fill(Array Z.SP(1), 9)
Procedure InitGhost()
  
  For i = 0 To 9
    Z.SP(i)\Dir = Random(1,0)
    Z.SP(i)\Y =  Random(910,0)
    If Z.SP(i)\Dir = 0
      Z.SP(i)\ID = #ZR
      Z.SP(i)\X = -180
      Z.SP(i)\s = Random (5,1)
    Else
      Z.SP(i)\ID = #ZL
      Z.SP(i)\X = 1860
      Z.SP(i)\s = Random (5,1)
    EndIf

  Next i
  
EndProcedure



Procedure DisplayGhost()
  For i = 0 To 9
    If Z.SP(i)\Dir = 0
      Z.SP(i)\X +  Z.SP(i)\S
      If Z.SP(i)\X > 1920 + 170
        Z.SP(i)\X = - Random (300,170)
      EndIf
      
    Else
      Z.SP(i)\X -  Z.SP(i)\S
      If Z.SP(i)\X < -170
        Z.SP(i)\X = Random (2060,1920)
      EndIf
    EndIf
    DisplayTransparentSprite(Z.SP(i)\ID, Z.SP(i)\X, Z.SP(i)\Y, Random(180,140) )
    
    
  Next
  
EndProcedure


Macro UpdateLAZ()
If LAZ\ID = #LAZR
  LAZ\X = P\X -17
  LAZ\Y = P\Y -4
Else
  LAZ\X = P\X -12
  LAZ\Y = P\Y - 4
  
EndIf

EndMacro



InitGhost()

OpenWindow(0, 0, 0, 1920, 1080, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 1920, 1080)


; Music & sound
LoadSound(#Zik, "HALLOWEEN_SONG2018.ogg")
LoadSound(#eua, "eua.ogg")
; BackGround
LoadImage(#bg,"Assets/bg.jpg")
;Sprites
LoadSprite(#ZR, "Assets/zl.png", #PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
LoadSprite(#ZL, "Assets/zl.png", #PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
LoadSprite(#PL, "Assets/spg.png",  #PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
LoadSprite(#PR, "Assets/spr.png",  #PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
LoadSprite(#LAZR, "Assets/lazr.png",  #PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
LoadSprite(#LAZL, "Assets/lazl.png",  #PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)

ClipSprite(#ZL,0,0,170,170)
ClipSprite(#ZR,170,0,170,170)


PlaySound(#zik, #PB_Sound_Loop, 40)
 








Repeat  
  Repeat
    Event = WindowEvent()
     
    Select Event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until Event=0
    
  ClearScreen(0)
  ExamineKeyboard()
  
  ; Position Laser
  UpdateLAZ()
  
  ; MOUVEMENTS CITROUILLE
  If KeyboardPushed(#PB_Key_Left)
    P\ID = #PL
    LAZ\ID = #LAZL
    P\X - 4
  ElseIf KeyboardPushed(#PB_Key_Right)
    P\ID = #PR
    LAZ\ID = #LAZR
    P\X + 4
    
  ElseIf KeyboardPushed(#PB_Key_Up)
    P\v = -4
    P\Y+P\V
  ElseIf KeyboardPushed(#PB_Key_Down)
    P\v = 4
    P\Y+P\V
    
    
    
  ElseIf KeyboardReleased(#PB_Key_Space)
    
    If shoot = #True
      shoot = #False
    Else
      shoot=#True
    EndIf
  
    Debug "EtatShoot" + shoot
    
      
  EndIf
  
 ; BG
  StartDrawing(ScreenOutput())
  DrawImage(ImageID(#bg),0,0)
  StopDrawing()
  
  
  ; Affichage des sprites
  DisplayTransparentSprite(P\ID, P\X, P\Y ,255)
  DisplayGhost()
  
  
  If shoot = #True
    DisplayTransparentSprite(LAZ\ID, LAZ\X, LAZ\Y ,255)
    For i = 0 To 9
      coliL = SpriteCollision(LAZ\ID, LAZ\X, LAZ\Y, Z.SP(i)\ID, Z.SP(i)\X, Z.SP(i)\Y)
      If coliL <> 0
        PlaySound(#eua, #PB_Sound_MultiChannel, 40)
        If Z.SP(i)\ID = #ZR
          Z.SP(i)\X = -180
          Z.SP(i)\s = Random (3,1)
        Else
          Z.SP(i)\ID = #ZL
          Z.SP(i)\X = 1860
          Z.SP(i)\s = Random (3,1)
        EndIf
        
        Score + 1
        Debug "score : "+ score
        
      EndIf
    Next i
;     shoot = #False
    
  EndIf
  
  For g = 0 To 9
  coli = SpriteCollision(P\ID, P\X, P\Y, Z.SP(g)\ID, Z.SP(g)\X, Z.SP(g)\Y)
    If coli <> 0
      If Z.SP(g)\ID = #ZR
          Z.SP(g)\X = -180
          Z.SP(g)\s = Random (3,1)
        Else
          Z.SP(g)\ID = #ZL
          Z.SP(g)\X = 1860
          Z.SP(g)\s = Random (3,1)
        EndIf
        Score - 1
        Debug "boom"
        Debug "score : "+ score
    EndIf
  Next g

  
      
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Re: Soucis de KeyboardReleased

Publié : dim. 28/oct./2018 18:24
par Marc56

Code : Tout sélectionner

Je suis embêté par une historie de KeyboardReleased
Lorsque je tire, un rayon sort des yeux de ma citrouille... Mais ce dernier ne disparait pas quand je relache "espace"..
Je n'ai pas testé, mais il n'y a que les touches combinables (Alt, Maj, Ctrl, Win) qui ont un état appuyé/relâché (je crois?). Si "espace" est la barre d'espace, elle n'a donc pas d'état enfoncé ou relâché, mais juste "pressée".

:?:

Edit: D'après l'aide, non. Je dis n'importe quoi. :mrgreen: (mais je fais jamais de jeu) :|

Re: Soucis de KeyboardReleased

Publié : dim. 28/oct./2018 19:00
par Ar-S
non non.. ça marche avec toutes normalement.

Pour espace j'ai enlevé le KeyboardPush

et ai mis

Code : Tout sélectionner

  ElseIf KeyboardReleased(#PB_Key_Space)
    
    If shoot = #True
      shoot = #False
    Else
      shoot=#True
    EndIf
L'état des boutons est bien pris en compte. Reste maintenant que j'aimerai faire disparaitre mon tire (donc faire passer à #false)
au bout de N sec ou ms et non pas tout de suite après comme actuellement du fait de la ligne 249.

Re: Soucis de KeyboardReleased

Publié : dim. 28/oct./2018 19:20
par venom
Bonsoir,
je n'ai pas pu essayé ton archive (corrompu) :?

Si je comprend la mecanique de ton jeu, tu fait partir un missile via KeyboardPushed et tu souhaite faire disparaitre le missile quand le joueur relâche la barre ? KeyboardReleased C'est bien ça ?





@++

Re: Soucis de KeyboardReleased

Publié : dim. 28/oct./2018 19:28
par Ar-S
Pas vraiment.
En gros je fait apparaitre un sprite lorsque l'on appuye sur Espace..
Je veux que ce sprite disparaisse au bout de N millisecondes afin que le joueur soit obligé d'utiliser space pour chaque apparition sinon c'est trop simple pour lui.

Dans le code je fais en sorte de montrer ce qui ce passe si on appuye sur espace. On rappuy pour faire disparaitre..

(J'ai mis à jour l'archive en 7z.. voir 1er topic.)

Re: Soucis de KeyboardReleased

Publié : lun. 29/oct./2018 9:16
par Christophe
Bonjour Ar-S

j'ai modifié la partie touche 'espace', je ne sais pas si c'est ce que tu souhaites...

Code : Tout sélectionner

ElseIf KeyboardReleased(#PB_Key_Space)
      CreateThread(@shoot(),0)
   
;     If shoot = #True
;       shoot = #False
;     Else
;       shoot=#True
;     EndIf
;  
;     Debug "EtatShoot" + shoot

et rajouter ceci

Procedure Shoot(null)
  
  If shoot = #True
      shoot = #False
    Else
      shoot=#True : Delay(200) : shoot=#False
    EndIf
 
    Debug "EtatShoot" + shoot
    
  EndProcedure
Avec ceci le shoot à lieu pendant 200ms

Re: Soucis de KeyboardReleased

Publié : lun. 29/oct./2018 11:49
par boby

Code : Tout sélectionner

InitSprite()
InitKeyboard()
Global shoot, timer
OpenWindow(0,0,0,100,100,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,100,100)
CreateSprite(0,30,30)
SetFrameRate(60)
Repeat
  ClearScreen($CCCCCC)
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Space)
    If Not shoot And timer = 0 : shoot = 1 : timer = ElapsedMilliseconds() : EndIf
  EndIf
  If KeyboardReleased(#PB_Key_Space)
    shoot = 0 : timer = 0
  EndIf
  
  If shoot
    If ElapsedMilliseconds() - timer > 300
      shoot = 0
    Else
      DisplaySprite(0,30,30)
    EndIf
  EndIf
  
  FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
@Christophe avec ceci "Delay(200)" tu bloque le programe pendant 200 ms, donc si on relache la touche, le sprite reste et tu ne peux pas vérifier les colisions. Un delay c'est fait pour freez un programme, pas pour définire une tempo.

@ar-s j'éspère que c'est ça répond à ta question...

Re: Soucis de KeyboardReleased

Publié : lun. 29/oct./2018 12:01
par Ar-S
Merci à vous.
@Christophe. En effet, je suis pas chaud pour l'usage du delay en "trichant" avec un thread.
@Boby. Je teste ça dès que possible. ça semble correspondre.

Re: Soucis de KeyboardReleased

Publié : lun. 29/oct./2018 14:41
par Ar-S
Après test, boby ta solution marche impec.
Merci encore