[TUTO] Scroll Stars - défilement d'étoiles

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

[TUTO] Scroll Stars - défilement d'étoiles

Message par Ar-S »

Comme Micheao n'a toujours pas pigé le scrolling de mon punch, j'ai décidé de montrer un exemple simplicime de scrolling d'étoiles

Tout ceci à pour but de montrer qu'avec peu, on peut faire tout un espace en PB :mrgreen:
Le scrolling est grossier mais il ne tiens qu'à vous d'en faire un tout beau avec cette base, c'est le but. :twisted:

Ce code utilise :
1 structure
1 tableau
2 sprites
1 macro (facultative)


Je ne vais pas m’épancher ici car j'ai sur-commenté le code.

Code : Tout sélectionner

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Petit tuto de Noël dédicacé à Michaeo
; Exemple de scroll stars 2D basic 
; par Ar-S / 27/12/2015
; utilisation d'une structure, une macro, deux sprites et un tableau
; Pressez ECHAP pour quitter
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


; ////////////// INITIALISATION //////////////////////

InitSprite()
InitKeyboard()

Enumeration 0
  #ET0
  #ET1
EndEnumeration

; nombre d'étoiles désirées
#MAXETOILE = 99

; Structure qui va regrouper les infos de nos étoiles
Structure ETOILE
  X.i ; Position X
  Y.i ; Position Y
  V.b ; Vitesse
  ID.b ; définira etoile blanche ou rouge
EndStructure

; Création d'un tableau ou seront stockées les infos de toutes les étoiles
Global Dim ETOILE.ETOILE(#MAXETOILE)

; Cette macro sert JUSTE à simplier l'écriture du tableau
Macro ET(Numero_Etoile) ; <=== on ecrira ça
  ETOILE.Etoile(Numero_Etoile) ; <==== au lieu de ça
EndMacro


; ////////////// PROCEDURES //////////////////////

; Dessinons les étoiles
Procedure CreationEtoile()
  ; On crée 2 sprites vides  
  CreateSprite(#ET0,2,2)
  CreateSprite(#ET1,2,2)
  
  ; Dessin de l'etoile 0 qui sera blanche
  StartDrawing(SpriteOutput(#ET0))
  Box(0,0,2,2,$FFFFFF)
  StopDrawing()
  
  ; Dessin de l'etoile 1 qui sera rouge
  StartDrawing(SpriteOutput(#ET1))
  Box(0,0,2,2,$0000FF)
  StopDrawing()
EndProcedure


; Initialisation des paramètres de départ des étoiles
Procedure Initialisation()
For i = 0 To #MAXETOILE ; nombre d'étoiles
  ; On définit N endroits au hazard de façon vertical de 0 à 600 (hauteur de notre screen)
  ET(i)\Y = Random(600)    
  ; On définit N positions en X d'etoiles de 0 à 100 (car random ne permet pas les négatifs)
  ET(i)\X = Random(100,0) 
  ; Une fois la valeur au hazard choisit on la passe en négative pour que les étoiles débutent avant le début de notre screen
  ET(i)\X = -ET(i)\X      
  ; On choisit au hazard si ce sera l'étoile rouge ou blanche
  ET(i)\ID = Random(1,0)   
  ; On choisit au hazard la vitesse de défilement des étoiles de 2 à 8
  ET(i)\V = Random(8,2)    
Next  
EndProcedure



; On Fait défiler les étoiles
Procedure deplacement()
  For i = 0 To #MAXETOILE
    DisplaySprite(ET(i)\ID, ET(i)\X, ET(i)\Y) ; On affiche le sprite etoile à ces coordonnées
    ET(i)\X + ET(i)\V ; On ajout la vitesse à l'etoile
    If ET(i)\X > 800 ; Si l'etoile sort de l'ecran
      ET(i)\X = Random(100,0) ; On positionne les etoiles avant l'ecran de façon aléatoire
      ET(i)\X = -ET(i)\X      ; Une fois la valeur au hazard choisit on la passe en négative
    EndIf  
  Next
EndProcedure

; /////////////////////////////////////////////////


; ////////////// PROGRAMME PRINCIPAL //////////////////////


OpenScreen(800,600,32,"STARS")

CreationEtoile()
Initialisation()

Repeat
  FlipBuffers()
  ClearScreen(RGB(0, 0, 0))
  ExamineKeyboard()
  
  If KeyboardReleased(#PB_Key_Escape)
    EXIT = 1
  EndIf
  
  
  deplacement() ; On déplace les étoiles
 

  
  Until EXIT = 1
~~~~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
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: [TUTO] Scroll Stars - défilement d'étoiles

Message par Micheao »

Merci Ar-S
juste une petite question :
Pourquoi tu mets Enumeration 0? moi je mets Enumeration Stars ( comme j'ai appris avec Microweb
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: [TUTO] Scroll Stars - défilement d'étoiles

Message par TazNormand »

@Micheao : C'est pour dire que l'énumération commence à 0 (zéro), mais c'est vrai que c'est inutile ici, puisque de toute façon Enumeration commence par défaut à 0.
Image
Image
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [TUTO] Scroll Stars - défilement d'étoiles

Message par Ar-S »

Oui c'est pour que ce sois vraiment claire.
#ET0 = 0
#ET1 = 1

J'aurai pu mettre Enumeration Etoile ou seulement Enumeration, c'est pour bien montré qu'on part à 0
~~~~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
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [TUTO] Scroll Stars - défilement d'étoiles

Message par djes »

Salut Ar-S, c'est une très bonne initiative que tu as prise là ! Ça a titillé mon instinct de démomaker :)

Du coup, je me suis pris au jeu de modifier un peu ton code et d'ajouter deux trois trucs à apprendre (comme le With). J'ai aussi modifié le positionnement des étoiles, afin qu'il y ait moins d'effet de "vagues d'étoiles".
Pour la position initiale, le mieux (mais que je n'ai pas fait pour ne pas compliquer), afin d'éviter d'avoir des étoiles qui se trouvent les unes à côté des autres, est d'utiliser une suite de nombres que tu vas mélanger. Par exemple, si ton écran fait 800 de large et que tu as 8 étoiles -> 0, 100, 200, 300, 400, 500, 600, 700 -> 300, 600, 100, 700, 400, 0, 500, 200. Je laisse à d'autres le soin de rajouter leur grain de sel ;)

Code : Tout sélectionner

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Petit tuto de Noël dédicacé à Michaeo
; Exemple de scroll stars 2D basique
; par Ar-S / 27/12/2015
; ajouts par djes 29/12/2015
; Utilisation de Enumeration, d'une structure, d'une macro, de With, de deux sprites et d'un tableau
; Pressez ECHAP pour quitter
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


;-////////////// INITIALISATION //////////////////////

InitSprite()
InitKeyboard()

; Exemple d'utilisation de Enumeration
Enumeration 0 ; On commence à 0
  #ET0 ; #ET0 = 0
  #ET1 ; #ET1 = 1
EndEnumeration

; Nombre d'étoiles désiré
#MAXETOILES = 99 ; Le nombre désiré - 1 car nos boucles commencent à 0 (qui est inclus)

; Structure des infos de nos étoiles
Structure etoile
  X.i  ; Position X : type de données integer (.i) -> "entiers longs" (voir Variables, Types et Opérateurs dans l'aide) 
  Y.i  ; Position Y en entiers longs
  V.i  ; Vitesse (on reste en entiers longs pour que le compilateur ne soit pas obligé de convertir quand on va additionner la vitesse à la position)
  ID.b ; définira étoile blanche ou rouge : type de données entiers courts .b (ici, on gagne un peu d'espace mémoire par rapport au .i)
EndStructure

; Création d'un tableau où seront stockées les infos de toutes les étoiles
Global Dim etoiles.etoile(#MAXETOILES)

; Dimensions de l'affichage (pourraient provenir du programme ScreenRequester.pb)
Global LargeurEcran = 800, HauteurEcran = 600, ProfondeurEcran = 32

; Cette macro exemple sert à simplier l'écriture du tableau
Macro ET(NumeroEtoile) ; <=== on écrira ça
  etoiles.etoile(NumeroEtoile) ; <==== au lieu de ça
EndMacro

;-////////////// PROCEDURES //////////////////////

; Créons et dessinons les étoiles
Procedure CreationEtoiles()
  
  ; On crée 2 sprites vides  
  CreateSprite(#ET0, 2, 2)
  CreateSprite(#ET1, 2, 2)
  
  ; Dessin de l'étoile 0 qui sera blanche
  StartDrawing(SpriteOutput(#ET0))
  Box(0, 0, 2, 2, $FFFFFF)
  StopDrawing()
  
  ; Dessin de l'étoile 1 qui sera rouge
  StartDrawing(SpriteOutput(#ET1))
  Box(0, 0, 2, 2, $0000FF)
  StopDrawing()
  
EndProcedure


; Initialisation des paramètres de départ des étoiles
Procedure Initialisation()
  
  With etoiles(i)  ;Exemple d'utilisation de With, qui permet d'éviter de taper etoiles(i) à chaque ligne ci-dessous
    For i = 0 To #MAXETOILES ; nombre d'étoiles
      ; On définit les endroits au hasard
      \Y = Random(HauteurEcran)     ;verticalement de 0 à la hauteur de notre écran
      \X = Random(LargeurEcran, 0)  ;horizontalement de 0 à la largeur de notre écran
      ; On choisit au hasard si ce sera l'étoile rouge ou blanche
      \ID = Random(1, 0)   
      ; On choisit au hasard la vitesse de défilement des étoiles de 2 à 8, donc les étoiles iront de gauche à droite
      \V = Random(8, 2)    
    Next
  EndWith  
  
EndProcedure


; On fait défiler les étoiles
Procedure deplacement()
  
  For i = 0 To #MAXETOILES
    DisplaySprite(ET(i)\ID, ET(i)\X, ET(i)\Y) ; On affiche le sprite étoile à ces coordonnées
    ET(i)\X + ET(i)\V                         ; On ajoute la vitesse à l'étoile
    If ET(i)\X >= LargeurEcran                ; Si l'étoile sort de l'écran à droite
      ET(i)\X - LargeurEcran                  ; On repositionne l'étoile avant l'écran à gauche
    EndIf  
  Next
  
EndProcedure

;- ////////////// PROGRAMME PRINCIPAL //////////////////////

;Ouverture de l'écran
OpenScreen(LargeurEcran, HauteurEcran, ProfondeurEcran, "STARS")

CreationEtoiles()
Initialisation()

;- Boucle d'événements la plus simple possible
Repeat
  
  FlipBuffers() ; On gère l'affichage
  ClearScreen(RGB(0, 0, 0)) ; On efface l'écran
  deplacement() ; On appelle la procédure pour déplacer les étoiles
  ExamineKeyboard() ; On gère le clavier
  
Until KeyboardReleased(#PB_Key_Escape) ; On répète la boucle jusqu'à ce que l'utilisateur appuye sur la touche "Echappe"
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [TUTO] Scroll Stars - défilement d'étoiles

Message par Ar-S »

Tu as bien fait, d'ailleurs j'oublie à tord d'utiliser ce With qui se prête pourtant très bien à ça :)
~~~~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
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: [TUTO] Scroll Stars - défilement d'étoiles

Message par Micheao »

Juste une question :

Code : Tout sélectionner

  ET(i)\X
j'ai compris que l'on appelle ma Macro ET qui contient la variable de boucle i est ce que le \X cela appelle le X .i qui se trouve dans le structure?
par exemple si dans ma structure j'ai pos_X.i

je dois l'écrire comme ça :
ET(i)\pos_X ?

#MAXETOILES est une variable ou une constantes?
Merci de votre aide
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [TUTO] Scroll Stars - défilement d'étoiles

Message par Ar-S »

Pas bien sûr d'avoir compris ta phrase ma je pense que oui.

On définit dans la structure un X en .i

Lorsqu'on appel le tableau :
etoiles.etoile(NumeroEtoile)\X
resumé en ET(NumeroEtoile)\X grâce à la macro, le X est bien le X.i de la structure

Le i à la place de NumeroEtoile lui c'est le numéro de l'élément du tableau
on le trouve là For i = 0 To #MAXETOILES

On pourrait tout à fait ecrire

Code : Tout sélectionner

For ELEMENT_DU_TABLEAU = 0 To #MAXETOILES
ET(ELEMENT_DU_TABLEAU )\X = ;etc etc
Next
J'espère que ça allume ta chandelle. :wink:
~~~~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
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: [TUTO] Scroll Stars - défilement d'étoiles

Message par Micheao »

Ar-S a écrit :Pas bien sûr d'avoir compris ta phrase ma je pense que oui.

On définit dans la structure un X en .i

Lorsqu'on appel le tableau :
etoiles.etoile(NumeroEtoile)\X
resumé en ET(NumeroEtoile)\X grâce à la macro, le X est bien le X.i de la structure

Le i à la place de NumeroEtoile lui c'est le numéro de l'élément du tableau
on le trouve là For i = 0 To #MAXETOILES

On pourrait tout à fait ecrire

Code : Tout sélectionner

For ELEMENT_DU_TABLEAU = 0 To #MAXETOILES
ET(ELEMENT_DU_TABLEAU )\X = ;etc etc
Next
J'espère que ça allume ta chandelle. :wink:


merci de ton aide
Répondre