dupliquer sprite avec touche espace

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

dupliquer sprite avec touche espace

Message par venom »

Bonjour,

Je coince sur une chose qui a l'air anodin. Je souhaite afficher un sprite a une position aléatoire quand j'appuie sur la barre espace.
Bon mon code ci-dessous le fait. Le problème c'est que le sprite disparait juste après. je souhaite qu'il reste afficher. 8O Je pense que je n'affiche surement pas le résultat au bon endroit. Du coup flipbuffer l'efface. :oops:

Ou Structure... :roll:

Voici le code pour mieux comprendre :

Code : Tout sélectionner

InitSprite()
InitKeyboard()

Procedure DeplacerObjet()
DisplayTransparentSprite(8, Random(800), Random(600)) 
EndProcedure


If OpenWindow(0, 0, 0, 800, 600, "Gadget and sprites!", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  If OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
   LoadSprite(8, #PB_Compiler_Home + "examples/sources/Data/PureBasicLogo.bmp")
  EndIf 
  
EndIf 
    
Repeat 
  Repeat
   Event = WindowEvent()
      
     Select Event 
      Case #PB_Event_Gadget
       If EventGadget() = 0
        End
       EndIf
        
      Case #PB_Event_CloseWindow
       End 
     EndSelect
  Until Event = 0
  
   
  ClearScreen(RGB(0, 0, 0))
  ExamineKeyboard()
  KeyboardMode(#PB_Keyboard_International)
  
;- on affiche le sprite au demarrage
  DisplayTransparentSprite(8, 50, 50) 

;- deplace le sprite a l'appuie de la touche espace    
   If KeyboardReleased(#PB_Key_Space) 
     DeplacerObjet()
   EndIf 
   

   FlipBuffers()
   
;- appuie sur la touche echap
Until KeyboardPushed(#PB_Key_Escape)
End





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

Re: dupliquer sprite avec touche espace

Message par Ar-S »

Salut.
Dans ta boucle principale tu as DisplayTransparentSprite(8, 50, 50)
Donc tu auras beau faire apparaitre ce même sprite à un autre endroit avec ta proce(), à chaque début de boucle tu le repositionnes en 50x50

Ne pas aussi confondre affichage du sprite (toujours la même fonction) et sa position.
Ton second soucis c'est que même si tu vires ta ligne 50x50, ton code actuel dit :
"Si espace est pressé j'affiche le sprite" Donc lui bêtement il affiche le sprite lorsque tu presses... Mais il n'a pas de raison de le laisser afficher puis qu'on est dans une boucle et que espace n'est plus "pressé".. Donc il l'affiche très furtivement.

En gros ta proce ne doit servir qu'à afficher le sprite et ton ESPACE ne doit que modifier ses coordonnées.

PS : Ton titre de topic devrait être "déplacer un sprite avec espace" :wink:
PS2 : Largeur et Hauteur doivent etre max 800-Largeursprite et 600-hauteursprite sinon le sprite peut déborder.

Code : Tout sélectionner

InitSprite()
InitKeyboard()


Global NewX, NewY

Procedure DeplacerObjet()
  DisplayTransparentSprite(8, NewX, NewY)
EndProcedure


If OpenWindow(0, 0, 0, 800, 600, "Gadget and sprites!", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  If OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
   LoadSprite(8, #PB_Compiler_Home + "examples/sources/Data/PureBasicLogo.bmp")
 EndIf
 
 ;Initialisation de la 1ere position !
 NewX = 50
 NewY = 50
 
EndIf
   
Repeat
  Repeat
   Event = WindowEvent()
     
     Select Event
      Case #PB_Event_Gadget
       If EventGadget() = 0
        End
       EndIf
       
      Case #PB_Event_CloseWindow
       End
     EndSelect
  Until Event = 0
 
   
  ClearScreen(RGB(0, 0, 0))
  ExamineKeyboard()
  KeyboardMode(#PB_Keyboard_International)

;- MODIFIE les coords du sprite a l'appuie de la touche espace   
  If KeyboardReleased(#PB_Key_Space)
        NewX =  Random(800-SpriteWidth(8) )
       NewY = Random(600-SpriteHeight(8) )
   EndIf
   
; Affiche le sprite
   DeplacerObjet()

   FlipBuffers()
   
;- appuie sur la touche echap
Until KeyboardPushed(#PB_Key_Escape)
End
~~~~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 : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: dupliquer sprite avec touche espace

Message par venom »

Merci Ar-S,

Je comprend mon erreur maintenant.
Par contre je pense que mon titre n'est pas mauvais car je souhaite qu'a l'appuie de la barre espace, le sprite qui est afficher ex: x=100 y=150 reste. Mais qu'un autre s'ajoute via un nouveau random ex x=220 y=10 donc en gros si j'appuie 3 fois, je souhaite faire apparaitre 3 sprites en position random :lol: Tordu le gars.






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

Re: dupliquer sprite avec touche espace

Message par Ar-S »

Il te faut copier créer N coordonnées mais tu n'as besoin que d'un sprite.
Je te conseils de te faire une structure sinon tu vas te paumer.
Ensuite tu fais un tableau qui comportera autant d'entrée que ce que tu veux de sprite.
Dans ce tableau, tu n'auras qu'a stockés les coords X et Y générées à chaque "Espace"
Ainsi seule ton sprite 8 sera utilisé
ex:
Tableau(0) utilisera le sprite 8 en x=400 et y=150
Tableau(1) utilisera le sprite 8 en x=200 et y=350
etc..

Code : Tout sélectionner

InitSprite()
InitKeyboard()


Global NumSprite = 0


Structure Sp
  X.i
  Y.i
  id.b
EndStructure

Global Dim SP.SP(4) ; On va dire qu'on aura 5 sprites max


Procedure DeplacerObjet()
  For N = 0 To NumSprite
    DisplayTransparentSprite(sp.sp(N)\ID, sp.sp(N)\x, sp.sp(N)\y)
  Next
EndProcedure



If OpenWindow(0, 0, 0, 800, 600, "Gadget and sprites!", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  If OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
    LoadSprite(8, #PB_Compiler_Home + "examples/sources/Data/PureBasicLogo.bmp")
    
    
    ; Comme pour le 1er sprite on connait les valeurs 50 x 50 on les indique
   
    SP.SP(0)\X = 50
    SP.SP(0)\Y = 50
    
    ; On inscrit dans le tableau 4 autres références de sprite qui utiliseront le même sprite 8
    For i = 0 To 4
      SP.SP(i)\ID = 8
    Next
    
  EndIf
  
  
EndIf

Repeat
  Repeat
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_Gadget
        If EventGadget() = 0
          End
        EndIf
        
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until Event = 0
  
  
  ClearScreen(RGB(0, 0, 0))
  ExamineKeyboard()
  KeyboardMode(#PB_Keyboard_International)
  
  ;- MODIFIE les coords du sprite a l'appuie de la touche espace   
  If KeyboardReleased(#PB_Key_Space)
    NumSprite + 1
    Debug NumSprite
    ; Délimitation du nombre de sprites
      If NumSprite > 4 
        NumSprite = 0
      EndIf
      SP.SP(NumSprite)\X =  Random(800-SpriteWidth(8) )
      SP.SP(NumSprite)\Y =  Random(600-SpriteHeight(8) )
    EndIf
  
  ; Affiche le sprite N FOIS (de 0 à 4 fois)
  DeplacerObjet()
  
  FlipBuffers()
  
  ;- appuie sur la touche echap
Until KeyboardPushed(#PB_Key_Escape)
End
~~~~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 : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: dupliquer sprite avec touche espace

Message par venom »

8) Merci bien Ar-S

Je regarderais ça en détail ce soir. :wink:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre