[2D] Drag Sprite

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

[2D] Drag Sprite

Message par falsam »

Un code volontairement minimaliste et pas très complexe (Au moins je n'ai eu pas mal à la tête pour le faire) qui permet de déplacer un sprite avec la souris dans un tableau. Une base pour un jeu de mémorisation par exemple.

Sélectionner un carré (Jaune, vert ou rouge) et déplacer le sur un emplacement libre (En gris).

Code : Tout sélectionner

Enumeration Form
  #MainForm
EndEnumeration

Enumeration Sprite  
  #Empty
  #Square_Red
  #Square_Green
  #Square_Yellow
  
  #Cursor
EndEnumeration

Global Dim Sprites(4, 4), Col, Row, SelCol=-1, SelRow=-1 ;5 Colonnes et 5 lignes

Procedure GamePreload()
  Protected BorderColor = RGB(128, 128, 128)
  
  ;Creation du sprite vide
  CreateSprite(#Empty, 100, 100)
  StartDrawing(SpriteOutput(#Empty))
  Box(0, 0, 100, 100, BorderColor)
  RoundBox(2, 2, 96, 96, 10, 10, BorderColor)  
  StopDrawing()
    
  ;Creation du carré Rouge
  CreateSprite(#Square_Red, 100, 100)
  StartDrawing(SpriteOutput(#Square_Red))
  Box(0, 0, 100, 100, BorderColor)
  RoundBox(2, 2, 96, 96, 10, 10, RGB(255, 0, 0))
  StopDrawing()
  
  ;Creation du carré Vert
  CreateSprite(#Square_Green, 100, 100)
  StartDrawing(SpriteOutput(#Square_Green))
  Box(0, 0, 100, 100, BorderColor)
  RoundBox(2, 2, 96, 96, 10, 10, RGB(50, 205, 50))
  StopDrawing()
  
  ;Creation du carré Jaune
  CreateSprite(#Square_Yellow, 100, 100)
  StartDrawing(SpriteOutput(#Square_Yellow))
  Box(0, 0, 100, 100, BorderColor)
  RoundBox(2, 2, 96, 96, 10, 10, RGB(255, 215, 0))
  StopDrawing()
 
  ;Creation du curseur de sélection
  CreateSprite(#Cursor, 25, 25)
  StartDrawing(SpriteOutput(#Cursor))
  Box(0, 0, 25, 25, RGB(250, 128, 114))
  StopDrawing()
  
EndProcedure

Procedure GameUpdate()
  Protected Mx = MouseX()
  Protected My = MouseY()
  
  ;Affichage des différents carrés de couleurs
  For Col = 0 To 4
    For Row = 0 To 4
      DisplaySprite(Sprites(Col, Row), Col*100, Row*100)
    Next
  Next
  
  ;Affichage du curseur
  DisplayTransparentSprite(#Cursor, Mx, My, 128) 
  
  If MouseButton(#PB_MouseButton_Left)
    ;Le bouton gauche de la souris est préssé :
    ; ? Il y a un sprite sue cette case (Sprites(Col, Row) <> 0)
    ; ? ET il n'y a pas de sprite en cours de selection (SelCol = -1) 
    ; OUI => Mémorisation des coordonnées du sprite 
    For Col = 0 To 4
      For Row = 0 To 4
        If Sprites(Col, Row) <> 0 And (Mx > Col*100 And Mx < (Col+1)*100) And (My > Row*100 And My < (Row+1)*100) And SelCol = -1
          SelCol = Col
          SelRow = Row          
        EndIf  
      Next
    Next 
    
  Else
    ;Le bouton de la souris est relaché : 
    ; ? La Case ou se trouve la souris est libre 
    ; ? ET Relacher un sprite (SelCol <> -1)
    ; OUI ==> Permutation des cellules
    For Col = 0 To 4
      For Row = 0 To 4
        If Sprites(Col, Row) = 0 And (Mx > Col*100 And Mx < (Col+1)*100) And (My > Row*100 And My < (Row+1)*100) And SelCol <> -1 
          
          Swap Sprites(Col, Row), Sprites(SelCol, SelRow)
          
        EndIf  
      Next
    Next
        
    ;Plus aucune sélection en cours
    SelCol = -1
    SelRow = -1  
  EndIf  
EndProcedure

Procedure GameStart()
  Protected cr.b = #True
  Protected Width = 500
  Protected Height = 500
    
  ;Initialisation de l'environnement 2D
  If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 And InitSound() = 0
    MessageRequester("Error", "Sprite system can't be initialized", 0)
    cr=#False
  EndIf
  
  
  If OpenWindow(#mainform, 0, 0, Width, Height, "New Game", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    If OpenWindowedScreen(WindowID(#mainform), 0, 0, Width, Height)
      
      ;Creation des sprites
      GamePreload()
      
      ;Ajout des sprites dans le jeu
      For Col=0 To 4
        For Row=0 To 4
          Sprites(Col, Row) = Random(3, 0)
        Next
      Next
      
    EndIf
  EndIf
  
  ;-Boucle evenementielle
  Repeat  
    Repeat
      Event = WindowEvent()
     
      Select event    
        Case #PB_Event_CloseWindow
          End
      EndSelect  
    Until event=0
    
    FlipBuffers()
    ClearScreen(RGB(0,0,0))
                
    ExamineKeyboard()
    ExamineMouse()
    GameUpdate()
  
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure

GameStart()
Dernière modification par falsam le jeu. 20/mars/2014 16:57, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: [2D] Drag Sprite

Message par Fig »

Jeu de taquin :P

Par contre, je vais me faire rouspéter, mais j'ai des problèmes de souris, le déplacement n'est pas fluide... (j'ai une une vieille souris optique mais ça fait pareil au pad...)

(Windows 8.1 souris logitech ... heu... la marque n'est plus lisible... vieille quoi!)

Pour les échanges de cases, il y a l'instruction "swap" qu'on oublie trop souvent...

Vivement le jeu complet 8)
Dernière modification par Fig le jeu. 20/mars/2014 14:13, modifié 1 fois.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Drag Sprite

Message par falsam »

Fig a écrit :J'ai des problèmes de souris, le déplacement n'est pas fluide... (j'ai une une vieille souris optique mais ça fait pareil au pad...)
C'est bizarre ces soucis de souris. Je vais essayer sous Windows 8 pour voir ce qu'il se passe. De mon cotés j'ai aussi une souris logitech optique sans installation des drivers logitech. J'ai essayé au pad et pas de problème de fluidité.
Fig a écrit :Pour les échanges de cases, il y a l'instruction swap() qu'on oublie trop souvent...
Oui tu as raison !
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: [2D] Drag Sprite

Message par Fig »

Non, ça vient de ma souris visiblement... elle fonctionne mais pas avec la bonne sensibilité peut être.
Au pad, ça marche impeccablement !
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Drag Sprite

Message par falsam »

Fig merci de m'avoir rappeler l'instruction Swap. le code de mon premier message est modifié.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [2D] Drag Sprite

Message par blendman »

c'est sympa ;).
Mais je ne vois pas trop quel type de jeux ça pourrait être lol ^^

Y'aurait moyen d'avoir l'ancien bout de code pour voir ce que swap a remplacé ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Drag Sprite

Message par falsam »

blendman a écrit :Y'aurait moyen d'avoir l'ancien bout de code pour voir ce que swap a remplacé ?
J'ai remplacé

Code : Tout sélectionner

Sprites(Col, Row) = Sprites(SelCol, SelRow)
Sprites(SelCol, SelRow) = 0 
par

Code : Tout sélectionner

Swap Sprites(Col, Row), Sprites(SelCol, SelRow)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [2D] Drag Sprite

Message par Backup »

ça me rappel un defi "d'ecole"

changez le contenu de 2 variables sans utiliser une troisieme ....

d'habitude c'est le principe des 3 seaux d'eau qu'on utilise ...

Code : Tout sélectionner


a=10
b=50

debug "A=" +str(a)
debug "B="+str(b)

C =a  ; intervention d'un troisieme seau .....  on vide A dans le seau C (le troisieme seau )
a=b ; on peut verser B dans le seau A (qui est vide )
b=C ; puis on reverse le contenu de notre "buffer" (troisieme seau) dans B (qui etait vide )
debug "**********"
debug "A=" +str(a)
debug "B="+str(b)

; Epb

et voila , la magie de l'informatique ..... le seau a contenance variable
du coup , plus besoin de troisieme seau

Code : Tout sélectionner


a=10
b=50

debug "A=" +str(a)
debug "B="+str(b)

a=a+b  ; on ajoute dans le Seau A qui est deja rempli ... le contenu du seau B (le seau A deviens elastic , il contient TOUT :D
b=a-b ; on remet la difference dans B  (on viens deffectuer la moitié du boulot )
a=a-b ; on retabli le contenu du seau A par opération mathematique ... on est plus dans le monde Reel , on est dans la  4em Dimension ! :)
debug "**********"
debug "A=" +str(a)
debug "B="+str(b)
; Epb

Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [2D] Drag Sprite

Message par Ar-S »

Sauf qu'en PB ça pourrait s’écrire :

Code : Tout sélectionner

(...)
a+b  ; on ajoute dans le Seau A qui est deja rempli ... le contenu du seau B (le seau A deviens elastic , il contient TOUT :D
b=a-b ; on remet la difference dans B  (on viens deffectuer la moitié du boulot )
a-b ; on retabli le contenu du seau A par opération mathematique ... on est plus dans le monde Reel , on est dans la  4em Dimension ! :)
Les vieilles habitudes ont la tête dure :)
~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [2D] Drag Sprite

Message par Backup »

Ar-S a écrit :Sauf qu'en PB ça pourrait s’écrire :

Code : Tout sélectionner


a+b  ; on ajoute dans le Seau A qui est deja rempli ... le contenu du seau B (le seau A deviens elastic , il contient TOUT :D
b=a-b ; on remet la difference dans B  (on viens deffectuer la moitié du boulot )
a-b ; on retabli le contenu du seau A par opération mathematique ... on est plus dans le monde Reel , on est dans la  4em Dimension ! :)
Les vieilles habitudes ont la tête dure :)
sauf que j'ai toujours dis, que pour moi, cela n'etait pas logique !
voir meme une erreur de conception de Fred ...

A+b ne devrait pas signifier "a=a+b"

car lorsque tu fait "a=a+b" ... tu signifie clairement l'affectation du resultat de l'operation a+b a la variable a... grace au signe "="
cela revient a ecrire a=(a+b) .... ou bien le resultat de a+b on le met dans a !
cette formulation est tres claire ! ....

alors que :

a+b , ne signifie en aucun cas (enfin ça ne devrait pas... ) qu'on affecte un resultat a une variable ... (pas de signe d'affectation "=" .....

cela signifie seulement qu'on execute une addition ..... ça n'a pas de sens tout seul ...
pas d'affectation d'indiqué .... Purebasic Invente une affectation .... (je cherche encore a comprendre pourquoi )

dans certain language si tu fait "a+b" ... ça ne fait que l'opération point barre ..

si tu veux l'affecter tu peux faire C=a+b ..... pour mettre le resultat de l'operation dans C
d'ailleurs dans mon code , tu as du te résoudre a garder "b=.....a-b" :)

s'il y avait fallu mettre le resultat dans A .... en suivant la meme logique on fait a=.... (a-b)

donc a=a-b ....

c'est Purebasic qui déconne ... pas moi .... :)

apres que cela offre une liberté d’écriture ... bof, je ne suis pas sur de ça ... pour ma part (Old School ) je reste avec ma logique

je trouve que l'ecriture que tu Aimes apporte plutot une source d'embrouilles !

d'ailleurs comment tu differencies :

Code : Tout sélectionner

a=10
b=5

if a+b  ; sans affectation donc .... hum 
debug a
endif
calldebugger

Code : Tout sélectionner

a=10
b=5
a+b   ; alors que là on affecte ???  cherchez l'erreur
debug a 
calldebugger



je sais que certains ancien basic proposait ce genre de chose, mais c'etait plutot minoritaire ...

la logique de Fred est impénétrable :mrgreen:
Répondre