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
par
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.
- Ajout d'une constante #MAX_ETOILE pour choisir le nombre max d'
étoile.
- 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
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
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

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

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

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