Scrolling étoilé reprise d'un ancien tuto de Crystal Noir

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Scrolling étoilé reprise d'un ancien tuto de Crystal Noir

Message par Bernie »

Bonsoir

j'ai repris un tuto de Crystal Noir:
http://www.purebasic.fr/french/viewtopic.php?t=882

j'ai simplement mis dans une fenêtre écran et j'ai dessiné les étoiles :

Code : Tout sélectionner

;**** Scrolling dans une fenetre jeux  ****

;---Initilisation 
EnableExplicit
If InitSprite()=0 Or InitKeyboard()=0 
  MessageRequester("Erreur", "Impossible d'initialiser le programme ")
  End
EndIf

;---Constantes
Enumeration Windows
  #Main_Form
EndEnumeration  
Enumeration Sprites
  #Star0
  #Star1
EndEnumeration

;--- Structure star1
Structure Etoile
  PosX.f
  PosY.f
  Vitesse.f
EndStructure
Global NewList Stars.Etoile()
;---Structure Star2
Structure Etoile2
  PosX.f
  PosY.f
  Vitesse.f
EndStructure
Global NewList Stars2.Etoile2()
Global i ,gEvent,gW=800,gH=600
;--- Création de l'écran 
;OpenScreen(800,600,32,"Test")
OpenWindow(#Main_Form,0,0,gW,gH,"Space Shooters ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Form),0,0,gW,gH)

SetFrameRate(60)

;---Création de l'etoile 1 blanche 
CreateSprite(#Star0,2,2)
StartDrawing(SpriteOutput(#Star0))
Box(0, 0, 2, 2, $FFFFFF)
StopDrawing()
;---Création de l'etoile 2 Grise
CreateSprite(#Star1,2,2)
StartDrawing(SpriteOutput(#Star1))
Box(0, 0, 2, 2, $A9A9A9)
StopDrawing()

;---Procedure pour afficher les étoiles
Procedure DisplayEtoile()
  ;---Etoile 1  
  ResetList(Stars())
  While NextElement(Stars())
    If Stars()\PosY > 600
      Stars()\PosY = -5
    EndIf
    DisplaySprite(#Star0,Stars()\PosX,Stars()\PosY)
    Stars()\PosY + Stars()\Vitesse
  Wend  
  ;---Etoile2
  ResetList(Stars2())
  While NextElement(Stars2())
    If Stars2()\PosY > 600
      Stars2()\PosY = -5
    EndIf
    DisplaySprite(#Star1,Stars2()\PosX,Stars2()\PosY)  
    Stars2()\PosY + Stars2()\Vitesse 
  Wend
EndProcedure
Procedure toto()
For i = 1 To 150
  AddElement(Stars())
  AddElement(Stars2())
  Stars()\PosX = Random(800)
  Stars()\PosY = Random(600)
  Stars()\Vitesse = 2
  ;---
  Stars2()\PosX = Random(800)
  Stars2()\PosY = Random(600)
  Stars2()\Vitesse = 1
Next 
EndProcedure 
    toto()
Repeat
   Repeat
    gEvent=WindowEvent()
    Select gEvent
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until gEvent=0
  ClearScreen(RGB(0,0,0))
    DisplayEtoile()
    ExamineKeyboard()
    FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Ar-S »

La même chose (et le même code) avec une seule étoile.
Mais un scrolling (défilement) plus aléatoire qui fait moins "bloc" en ajoutant un random(4,1) à la vitesse plutôt qu'une valeur fixe.

Code : Tout sélectionner

;**** Scrolling dans une fenetre jeux  ****

;---Initilisation
EnableExplicit
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("Erreur", "Impossible d'initialiser le programme ")
  End
EndIf

;---Constantes
Enumeration Windows
  #Main_Form
EndEnumeration 
Enumeration Sprites
  #Star0
EndEnumeration

;--- Structure star1
Structure Etoile
  PosX.f
  PosY.f
  Vitesse.f
EndStructure

 Global NewList Stars.Etoile()
Global i ,gEvent,gW=800,gH=600
;--- Création de l'écran
;OpenScreen(800,600,32,"Test")
OpenWindow(#Main_Form,0,0,gW,gH,"Space Shooters ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Form),0,0,gW,gH)

SetFrameRate(60)

;---Création de l'etoile 1 blanche
CreateSprite(#Star0,2,2)
StartDrawing(SpriteOutput(#Star0))
Box(0, 0, 2, 2, $FFFFFF)
StopDrawing()

;---Procedure pour afficher les étoiles
Procedure DisplayEtoile()
  ;---Etoile 1 
  ResetList(Stars())
  While NextElement(Stars())
    If Stars()\PosY > 600
      Stars()\PosY = -5
      Stars()\Vitesse = Random (4,1) ; On redonne une vitesse aléatoire à la future étoile quand elle sort de l'ecran
    EndIf
    DisplaySprite(#Star0,Stars()\PosX,Stars()\PosY)
    Stars()\PosY + Stars()\Vitesse
    
  Wend 
  
EndProcedure





Procedure toto()
For i = 1 To 150
  AddElement(Stars())
  Stars()\PosX = Random(800)
  Stars()\PosY = Random(600)
  Stars()\Vitesse = Random (4,1) ; ; On donne une vitesse aléatoire à la future étoile 

Next
EndProcedure
    toto()
Repeat
   Repeat
    gEvent=WindowEvent()
    Select gEvent
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until gEvent=0
  ClearScreen(RGB(0,0,0))
    DisplayEtoile()
    ExamineKeyboard()
    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
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Bernie »

merci Ar/s perso je prefere ta méthode avec tableau
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par falsam »

J'ai une préférence pour la méthode d'Ar-s.

Amélioration pour ton code Bernie.

Ta structure Etoile2 ne sert à rien car c'est la même que la structure Etoile.

Tu peux créer tes deux listes chaînées Stars et Star2 avec la même structure Etoile.

Code : Tout sélectionner

Structure Etoile
  PosX.f
  PosY.f
  Vitesse.f
EndStructure
Global NewList Stars.Etoile()
Global NewList Stars2.Etoile()
Remplace

Code : Tout sélectionner

ResetList(Stars())
While NextElement(Stars())
par

Code : Tout sélectionner

ForEach (Stars()
Tu devrais avoir

Code : Tout sélectionner

;---Procedure pour afficher les étoiles
Procedure DisplayEtoile()
  ;---Etoile 1  
  ForEach Stars()
    If Stars()\PosY > 600
      Stars()\PosY = -5
    EndIf
    DisplaySprite(#Star0,Stars()\PosX,Stars()\PosY)
    Stars()\PosY + Stars()\Vitesse
  Next
  
  ;---Etoile2
  ForEach Stars2()
    If Stars2()\PosY > 600
      Stars2()\PosY = -5
    EndIf
    DisplaySprite(#Star1,Stars2()\PosX,Stars2()\PosY)  
    Stars2()\PosY + Stars2()\Vitesse 
  Next
  
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Bernie »

Merci Falsam pour ton cours
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Ar-S »

Nouvelle version.

Remplacement de la liste chainée par un tableau.

Code : Tout sélectionner

Global Dim Etoile.Etoile(#MAX_ETOILE)
- Ajout d'une constante #MAX_ETOILE pour choisir le nombre max d'étoile.

Code : Tout sélectionner

#MAX_ETOILE = 250
- Ajout d'un peu plus de paramètres aléatoires en X & Y lors du repositionnement des étoiles

Code : Tout sélectionner

; on repositionne l'etoile au dessus de l'ecran de 10 à 20 pixel au dessus
      Etoile.Etoile(i)\PosY = Random(20,10)
      Etoile.Etoile(i)\PosY = -Etoile.Etoile(i)\PosY
      ; Position de l'etoile horizontalement
      Etoile.Etoile(i)\PosX = Random(800)
Ce qui donne

Code : Tout sélectionner

;**** Scrolling dans une fenetre jeux  ****

;---Initilisation
EnableExplicit
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("Erreur", "Impossible d'initialiser le programme ")
  End
EndIf

;---Constantes
Enumeration Windows
  #Main_Form
EndEnumeration
Enumeration Sprites
  #Star0
EndEnumeration

;--- Structure star1
Structure Etoile
  PosX.f
  PosY.f
  Vitesse.f
EndStructure

#MAX_ETOILE = 250
Global i ,gEvent,gW=800,gH=600

; tableau de 251 emplacements
Global Dim Etoile.Etoile(#MAX_ETOILE)


;--- Création de l'écran

OpenWindow(#Main_Form,0,0,gW,gH,"Space Shooters ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Form),0,0,gW,gH)

SetFrameRate(60)

;---Création de l'etoile 1 blanche
CreateSprite(#Star0,2,2)
StartDrawing(SpriteOutput(#Star0))
Box(0, 0, 2, 2, $FFFFFF)
StopDrawing()


Procedure DisplayEtoile()
  
  ;---Etoile 1
  For i = 0 To #MAX_ETOILE
    
    ; SI une etoile sort sou l'ecran
    If Etoile.Etoile(i)\PosY > 600
      ; on repositionne l'etoile au dessus de l'ecran de 10 à 20 pixel au dessus
      Etoile.Etoile(i)\PosY = Random(20,10)
      Etoile.Etoile(i)\PosY = -Etoile.Etoile(i)\PosY
      ; Position de l'etoile horizontalement
      Etoile.Etoile(i)\PosX = Random(800)
      ; On redonne une vitesse aléatoire à la future étoile quand elle sort de l'ecran
      Etoile.Etoile(i)\Vitesse = Random (4,1) 
    EndIf
    
    ; Affichage des etoiles
    DisplaySprite(#Star0,Etoile.Etoile(i)\PosX,Etoile.Etoile(i)\PosY)
    Etoile.Etoile(i)\PosY + Etoile.Etoile(i)\Vitesse
   
  Next
 
EndProcedure



Procedure toto()
  For i = 0 To #MAX_ETOILE
    Etoile.Etoile(i)\PosX = Random(800)
    Etoile.Etoile(i)\PosY = Random(600)
    Etoile.Etoile(i)\Vitesse = Random (4,1) ; ; On donne une vitesse aléatoire à la future étoile    
  Next
EndProcedure


toto()


Repeat
   Repeat
    gEvent=WindowEvent()
    Select gEvent
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until gEvent=0
  
  ClearScreen(RGB(0,0,0))
    DisplayEtoile()
    ExamineKeyboard()
    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
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Bernie »

Merci ar/s pour ton cours cela va me servir pour mon jeu ..
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Micoute »

Bonjour à tous,

pourquoi mettre plusieurs fois Etoile.Etoile(i), alors que le tableau est déclaré à la ligne 29 ?
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Bernie »

Micoute a écrit :Bonjour à tous,

pourquoi mettre plusieurs fois Etoile.Etoile(i), alors que le tableau est déclaré à la ligne 29 ?
Il y a une postion X et une position Y
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par falsam »

Bernie a écrit :Il y a une postion X et une position Y
:mrgreen:

Ce que voulait dire micoute (Et il avait qu'à donner la réponse car il le savait Monsieur Micoute ^^) c'est qu'il est inutile de mettre Etoile.Etoile(i)\PosX = Random(800) en effet, Etoile(i)\PosX = Random(800) fonctionnait tout aussi bien.

■ Pourquoi ?
Tu as déclaré la structure Etoile

Code : Tout sélectionner

Structure Etoile
  PosX.f
  PosY.f
  Vitesse.f
EndStructure
Tu as déclaré ton tableau Etoile ayant la Structure Etoile

Code : Tout sélectionner

; tableau de 251 emplacements
Global Dim Etoile.Etoile(#MAX_ETOILE)
Pour la clarté du code et bien que cela fonctionne, c'est une mauvaise habitude de donner le même nom à la structure et au tableau.

Dans ton code tu peux remplacer Etoile.Etoile(i) par Etoile(i)
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Micoute »

C'est tout à fait ça, mais je n'ai pas voulu être mesquin, je voulais juste indiquer une erreur et c'est vrai aussi que j'aurais pu donner la réponse, ce sera pour une autre fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par falsam »

Micoute a écrit :C'est tout à fait ça, mais je n'ai pas voulu être mesquin
Ha mince donc je suis mesquin parce que j'ai donnée la solution :wink:
Micoute a écrit :je voulais juste indiquer une erreur
Ce n'est pas une erreur en tant que tel puisque ça fonctionne.

Le code en tenant compte de ce que je viens de dire précédemment. J'ai changé le nom du tableau. Etoile() devient Etoiles()

Code : Tout sélectionner

;**** Scrolling dans une fenetre jeux  ****

;---Initilisation
EnableExplicit
If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("Erreur", "Impossible d'initialiser le programme ")
  End
EndIf

;---Constantes
Enumeration Windows
  #Main_Form
EndEnumeration
Enumeration Sprites
  #Star0
EndEnumeration

;--- Structure star1
Structure Etoile
  PosX.f
  PosY.f
  Vitesse.f
EndStructure

#MAX_ETOILE = 250
Global i ,gEvent,gW=800,gH=600

; tableau de 251 emplacements
Global Dim Etoiles.Etoile(#MAX_ETOILE)


;--- Création de l'écran

OpenWindow(#Main_Form,0,0,gW,gH,"Space Shooters ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Form),0,0,gW,gH)

SetFrameRate(60)

;---Création de l'etoile 1 blanche
CreateSprite(#Star0,2,2)
StartDrawing(SpriteOutput(#Star0))
Box(0, 0, 2, 2, $FFFFFF)
StopDrawing()


Procedure DisplayEtoile()
  
  ;---Etoile 1
  For i = 0 To #MAX_ETOILE
    
    ; SI une etoile sort sou l'ecran
    If Etoiles(i)\PosY > 600
      ; on repositionne l'etoile au dessus de l'ecran de 10 à 20 pixel au dessus
      Etoiles(i)\PosY = Random(20,10)
      Etoiles(i)\PosY = -Etoiles(i)\PosY
      ; Position de l'etoile horizontalement
      Etoiles(i)\PosX = Random(800)
      ; On redonne une vitesse aléatoire à la future étoile quand elle sort de l'ecran
      Etoiles(i)\Vitesse = Random (4,1) 
    EndIf
    
    ; Affichage des etoiles
    DisplaySprite(#Star0, Etoiles(i)\PosX, Etoiles(i)\PosY)
    Etoiles(i)\PosY + Etoiles(i)\Vitesse
   
  Next

EndProcedure



Procedure toto()
  For i = 0 To #MAX_ETOILE
    Etoiles(i)\PosX = Random(800)
    Etoiles(i)\PosY = Random(600)
    Etoiles(i)\Vitesse = Random (4,1) ; ; On donne une vitesse aléatoire à la future étoile    
  Next
EndProcedure


toto()


Repeat
   Repeat
    gEvent=WindowEvent()
    Select gEvent
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until gEvent=0
  
  ClearScreen(RGB(0,0,0))
    DisplayEtoile()
    ExamineKeyboard()
    FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Une autre astuce pour un code plus léger à lire et l'utilisation de With quand on parcours un tableau ou une liste chainée ou une map.

Exemple dans le code précédent.

Au lieu d'écrire

Code : Tout sélectionner

Procedure toto()
  For i = 0 To #MAX_ETOILE
    Etoiles(i)\PosX = Random(800)
    Etoiles(i)\PosY = Random(600)
    Etoiles(i)\Vitesse = Random (4,1) ; ; On donne une vitesse aléatoire à la future étoile    
  Next
EndProcedure
tu peux remplacer par

Code : Tout sélectionner

Procedure toto()
  For i = 0 To #MAX_ETOILE
    With Etoiles(i)
      \PosX = Random(800)
      \PosY = Random(600)
      \Vitesse = Random (4,1) ; ; On donne une vitesse aléatoire à la future étoile    
    EndWith
  Next
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Ar-S »

Pour le raccord etoile.etoile mea culpa, c'est en effet se compliquer la vie ^^
Concernant le with, je n'ai toujours pas pris l'habitude de l'utiliser, j'ai du mal à commencer une ligne par un antislash, ça me pique les yeux :mrgreen:
~~~~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
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Scrolling étoilé reprise d'un ancien tuto de Crystal N

Message par Micoute »

Ha mince donc je suis mesquin parce que j'ai donnée la solution :wink:
Non, pas du tout ! Je parlais pour moi qui aurais pu le faire.
Concernant le with, je n'ai toujours pas pris l'habitude de l'utiliser
Il n'y a pas de manière spécifique pour programmer, tous les goûts sont dans la nature. Pour ma part je l'utilise aussi souvent que possible, car ça allège l'écriture
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre