[RESOLU] Soucis de KeyboardReleased

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

[RESOLU] Soucis de KeyboardReleased

Message 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)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Soucis de KeyboardReleased

Message 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) :|
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Soucis de KeyboardReleased

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Soucis de KeyboardReleased

Message 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 ?





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Soucis de KeyboardReleased

Message 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.)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Soucis de KeyboardReleased

Message 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
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Soucis de KeyboardReleased

Message 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...
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Soucis de KeyboardReleased

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Soucis de KeyboardReleased

Message par Ar-S »

Après test, boby ta solution marche impec.
Merci encore
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre