Déplacer, Bloquer, Relacher

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Déplacer, Bloquer, Relacher

Message par venom »

Bonjour,

voilà une chose simple que je n'arrive pas a faire :

j'ai un sprit de 100x100 je souhaiterais le déplacer de 100 en 100 dans l'axe des x

en gros qu'il va de 0 a 800 de 100 en 100. Sa j'y arrive, mais la ou je n'y arrive pas c'est que si je reste appuyer sur la touche du clavier il défile a vitesse rapide :) moi je voudrais un relâchement obligatoire entre 2 action de touches.
j'ai essayé de bidouiller un truck avec KeyboardReleased(IdentifiantTouche) mais sans succees :( .

j'espère m'avoir fait comprendre.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Déplacer, Bloquer, Relacher

Message par SPH »

donne ton code qui marche pas. Je pense savoir comment on fait mais je ne sais pas si on parle de la meme chose
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Déplacer, Bloquer, Relacher

Message par G-Rom »

Avec un Flag ! :D

Code : Tout sélectionner

if Keyboardpushed(...)<>0 And Flag_Makey = 0
Flag_Makey = 1
Action
endif

if Keyboardpushed(...)=0
Flag_Makey = 0
endif 
@+
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Déplacer, Bloquer, Relacher

Message par venom »

oui désolé je met pas le code sa va aller moins bien :D

Code : Tout sélectionner

Enumeration
#pion
EndEnumeration

If InitKeyboard() = 0 Or InitSprite() = 0
  MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
  End
EndIf

  If OpenScreen(800, 600, 16, "")
   x = 355
   y = 0
   LoadSprite(#pion, "C:/pion.bmp", 0)
  EndIf 

  Repeat
    FlipBuffers()
    ClearScreen(RGB(0,0,0))
    ExamineKeyboard()
    
    If KeyboardPushed(#PB_Key_Left)
     If x > 70
      x-5
     EndIf 
     If x < 75
      x = 75
     EndIf
    EndIf
    
    If KeyboardPushed(#PB_Key_Right)
     If x = 710
      x = 710
     ElseIf x < 710
      x+5
     EndIf
    EndIf

    If KeyboardPushed(#PB_Key_Down)
      y=510
    EndIf
     DisplaySprite(#pion, x, y)

  Until KeyboardPushed(#PB_Key_Escape)
End   
des flags kesako sa :)







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Déplacer, Bloquer, Relacher

Message par Backup »

chez moi ceci marche ! (sous Linux !)

Code : Tout sélectionner

Enumeration
#pion
EndEnumeration

If InitKeyboard() = 0 Or InitSprite() = 0
  MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
  End
EndIf

  If OpenScreen(800, 600, 16, "")
   x = 355
   y =100
  ; LoadSprite(#pion, "C:/pion.bmp", 0)
  CreateSprite(#pion,100,100)
  StartDrawing(SpriteOutput(#pion))
  Circle(50,50,50)
  StopDrawing()
  EndIf

  Repeat
   
    KeyboardMode(#PB_Keyboard_International)
    ExamineKeyboard()
   
    If KeyboardReleased(#PB_Key_Left)
    x=x-100
    If x<0:x=0:EndIf
    EndIf
   
    If KeyboardReleased(#PB_Key_Right)
    x=x+100
    If x>700:x=700:EndIf
    EndIf

    If KeyboardReleased(#PB_Key_Down)
      y=510
    EndIf
     DisplaySprite(#pion, x, y)
FlipBuffers()
    ClearScreen(RGB(0,0,0))
    
    
  Until KeyboardPushed(#PB_Key_Escape)
   
    
End   
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Déplacer, Bloquer, Relacher

Message par G-Rom »

Dobro a écrit :chez moi ceci marche ! (sous Linux !)
on doit pas avoir la même definition du verbe marcher :mrgreen:



Avec des flags :

Code : Tout sélectionner

Enumeration
#pion
EndEnumeration

If InitKeyboard() = 0 Or InitSprite() = 0
  MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
  End
EndIf

  If OpenScreen(800, 600, 16, "")
   x=300
   y=100
  ; LoadSprite(#pion, "C:/pion.bmp", 0)
  CreateSprite(#pion,100,100)
  StartDrawing(SpriteOutput(#pion))
  
    For r = 1 To 50
      G = r * 255 / 50
      Circle(50,50,50-r,RGB(G,G,G))
    Next 
  
  StopDrawing()
  EndIf

  KeyboardMode(#PB_Keyboard_International)
  Repeat
    ClearScreen(0) 
    ExamineKeyboard()
   
    If KeyboardPushed(#PB_Key_Left)  And flag_left = 0
      flag_left = 1
      x-100
      If x<0:x=0:EndIf
    EndIf
    
    If KeyboardPushed(#PB_Key_Left)=0  And flag_left = 1
      flag_left = 0
    EndIf 
    
    
    If KeyboardPushed(#PB_Key_Right) And flag_right = 0
      flag_right = 1
      x+100
      If x>700:x=700:EndIf
    EndIf
    
    If KeyboardPushed(#PB_Key_Right)=0 And flag_right = 1
      flag_right = 0
    EndIf 
    
    If KeyboardPushed(#PB_Key_Down) And flag_down = 0
      flag_down = 1
      y+100
      If y>500 : y=500 : EndIf 
    EndIf
    
    If KeyboardPushed(#PB_Key_Down)=0 And flag_down = 1
      flag_down = 0
    EndIf 
    
    If KeyboardPushed(#PB_Key_Up) And flag_up = 0
      flag_up = 1
      y-100
      If y<0 : y=0 : EndIf 
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)=0 And flag_up = 1
      flag_up = 0
    EndIf 
    
     DisplaySprite(#pion, x, y)
     
     FlipBuffers()

   
  Until KeyboardPushed(#PB_Key_Escape)
   
   
End   
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Déplacer, Bloquer, Relacher

Message par venom »

en effet Dobro ton code plante chez moi aussi :wink:

@G-Rom
Merci pour ton exemple je rechercher effectivement ce genre de réponse.
Pourtant le code de Dobro est beaucoup plus court et d'après lui sa fait le même :)

Bref je ne suis pas la pour sa. n'empêche que je voyer sa plus court quand même genre une fonction lier a purebaisc par exemple :P

je vais étudier tout cela merci.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Déplacer, Bloquer, Relacher

Message par SPH »

Regarde. Tu declare ca avant ta boucle :

Code : Tout sélectionner

left.b=0
  
Et tu fais comme ca. Examine bien le mecanisme :

Code : Tout sélectionner

   If KeyboardPushed(#PB_Key_Left)
      If left=0
        left=1
        If x > 70
        x-5
        EndIf 
        If x < 75
        x = 75
        EndIf
      EndIf
    Else
      left=0
    EndIf
  
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Déplacer, Bloquer, Relacher

Message par G-Rom »

plus court , plus simple :

Tu redefinis en quelque sorte la fonction KeyboardPushed() :

Code : Tout sélectionner

Global NewMap KeyFlag.b()

Procedure.b KeyboardPushedEX(Const.i)
  If KeyboardPushed(Const) And KeyFlag(Str(Const)) = 0
    KeyFlag(Str(Const)) = 1
    ProcedureReturn #True 
  EndIf 
  If KeyboardPushed(Const)=0 And KeyFlag(Str(Const)) = 1
    KeyFlag(Str(Const)) = 0
  EndIf 
  ProcedureReturn #False 
EndProcedure

et tu l'utilises :

Code : Tout sélectionner

Enumeration
#pion
EndEnumeration

Global NewMap KeyFlag.b()

Procedure.b KeyboardPushedEX(Const.i)
  If KeyboardPushed(Const) And KeyFlag(Str(Const)) = 0
    KeyFlag(Str(Const)) = 1
    ProcedureReturn #True 
  EndIf 
  If KeyboardPushed(Const)=0 And KeyFlag(Str(Const)) = 1
    KeyFlag(Str(Const)) = 0
  EndIf 
  ProcedureReturn #False 
EndProcedure




If InitKeyboard() = 0 Or InitSprite() = 0
  MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
  End
EndIf

  If OpenScreen(800, 600, 16, "")
   x=300
   y=100
  ; LoadSprite(#pion, "C:/pion.bmp", 0)
  CreateSprite(#pion,100,100)
  StartDrawing(SpriteOutput(#pion))
  
    For r = 1 To 50
      G = r * 255 / 50
      Circle(50,50,50-r,RGB(G,G,G))
    Next 
  
  StopDrawing()
  EndIf

  KeyboardMode(#PB_Keyboard_International)
  Repeat
    ClearScreen(0) 
    ExamineKeyboard()
   
    If KeyboardPushedEX(#PB_Key_Left)
      flag_left = 1
      x-100
      If x<0:x=0:EndIf
    EndIf
    
    If KeyboardPushedEX(#PB_Key_Right)
      flag_right = 1
      x+100
      If x>700:x=700:EndIf
    EndIf
    
    If KeyboardPushedEX(#PB_Key_Down)
      flag_down = 1
      y+100
      If y>500 : y=500 : EndIf 
    EndIf

    If KeyboardPushedEX(#PB_Key_Up)
      flag_up = 1
      y-100
      If y<0 : y=0 : EndIf 
    EndIf
    
    
     DisplaySprite(#pion, x, y)
     
     FlipBuffers()

   
  Until KeyboardPushed(#PB_Key_Escape)
   
   
End   

@+ :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Déplacer, Bloquer, Relacher

Message par Backup »

non non ! rectification le code que j'ai posté fonctionne bien sous Linux ! :)

au debut j'avais pensé a un bug, mais c'est parceque j'avais laissé Pushed a la touche left !
mais j'ai corrigé , en mettant tout en released , ça marche bien ... (j'avais réédité mon code.. ;) )

ce code fonctionne sous Linux !!

Code : Tout sélectionner

Enumeration
#pion
EndEnumeration

If InitKeyboard() = 0 Or InitSprite() = 0
  MessageRequester("Erreur", "Ouverture de sprit impossible", 0)
  End
EndIf

  If OpenScreen(800, 600, 16, "")
   x = 355
   y =100
  ; LoadSprite(#pion, "C:/pion.bmp", 0)
  CreateSprite(#pion,100,100)
  StartDrawing(SpriteOutput(#pion))
  Circle(50,50,50)
  StopDrawing()
  EndIf

  Repeat
   
    KeyboardMode(#PB_Keyboard_International)
    ExamineKeyboard()
   
    If KeyboardReleased(#PB_Key_Left)
    x=x-100
    If x<0:x=0:EndIf
    EndIf
   
    If KeyboardReleased(#PB_Key_Right)
    x=x+100
    If x>700:x=700:EndIf
    EndIf

    If KeyboardReleased(#PB_Key_Down)
      y=510
    EndIf
     DisplaySprite(#pion, x, y)
FlipBuffers()
    ClearScreen(RGB(0,0,0))
   
   
  Until KeyboardPushed(#PB_Key_Escape)
   
   
End   
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Déplacer, Bloquer, Relacher

Message par venom »

Sous windows ton code ne fonctionne pas.
Je suis même obliger de faire Ctrl+alt+supp pour quitter :D









@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Déplacer, Bloquer, Relacher

Message par G-Rom »

Avec mon code 8O ?
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Déplacer, Bloquer, Relacher

Message par SPH »

Franchement, ca, c'est tres tres court et ca marche :

Code : Tout sélectionner

   If KeyboardPushed(#PB_Key_Left)
      If left=0
        left=1
        Beep_(1000,5)
      EndIf
    Else
      left=0
    EndIf
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Déplacer, Bloquer, Relacher

Message par G-Rom »

Plus court ma procédure :

Code : Tout sélectionner

Global NewMap KeyFlag.b()

Procedure.b KeyboardPushedEX(Const.i)
  If KeyboardPushed(Const) And KeyFlag(Str(Const)) = 0
    KeyFlag(Str(Const)) = 1
    ProcedureReturn #True
  EndIf
  If KeyboardPushed(Const)=0 And KeyFlag(Str(Const)) = 1
    KeyFlag(Str(Const)) = 0
  EndIf
  ProcedureReturn #False
EndProcedure
tu n'a plus qu'a appeler cette fonction après :

Code : Tout sélectionner

 KeyboardPushedEX(Const.i)
elle fait exactement ceci ( sans le bip bien sur ^^ ):

Code : Tout sélectionner

If KeyboardPushed(#PB_Key_Left)
      If left=0
        left=1
        Beep_(1000,5)
      EndIf
    Else
      left=0
    EndIf
car tu es obligé d'avoir une variable par touche , ici left...
le code deviendra vite lourd :)
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Déplacer, Bloquer, Relacher

Message par SPH »

Il y a une legere difference G-rom : mon code fait un seul test par boucle. Le tiens en fait 2 (4 meme !) constament. J'AIIIIIIME les choses optimisé :wink:

C'est une broutille hein, mais j'arrive pas a me séparer du mot "rapidité" a chaque fois que je code :!:

edit : je viens de faire des tests et ma routine est plus rapide de peut etre 20%
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Répondre