Page 1 sur 1

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

Publié : sam. 02/avr./2016 17:53
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)

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

Publié : sam. 02/avr./2016 20:02
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)

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

Publié : sam. 02/avr./2016 20:11
par Bernie
merci Ar/s perso je prefere ta méthode avec tableau

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

Publié : sam. 02/avr./2016 21:39
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

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

Publié : dim. 03/avr./2016 6:32
par Bernie
Merci Falsam pour ton cours

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

Publié : dim. 03/avr./2016 10:37
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)

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

Publié : dim. 03/avr./2016 18:06
par Bernie
Merci ar/s pour ton cours cela va me servir pour mon jeu ..

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

Publié : lun. 04/avr./2016 8:34
par Micoute
Bonjour à tous,

pourquoi mettre plusieurs fois Etoile.Etoile(i), alors que le tableau est déclaré à la ligne 29 ?

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

Publié : lun. 04/avr./2016 9:15
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

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

Publié : lun. 04/avr./2016 9:33
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)

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

Publié : lun. 04/avr./2016 9:43
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.

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

Publié : lun. 04/avr./2016 9:49
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

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

Publié : lun. 04/avr./2016 11:01
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:

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

Publié : lun. 04/avr./2016 11:25
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