[game 2D] éclair

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[game 2D] éclair

Message par blendman »

salut

voici un petit code un peu pourri ^^ pour réaliser une sorte d'éclair en 2D.
L'idéal serait d'utiliser les sprite3D sur un fond gris pour bénéficier du blendmode lumineux.

J'essaierai de changer ça prochainement, mais bon c'est déjà un début :)

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(0, 0, 0, 340, 285, "Game- eclair", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0), 0, 0, 340, 285, 0, 0, 0) = 0
      MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf

startX = 100
startY = 150
Repeat
  
  Event = WindowEvent()
  ExamineKeyboard()  
    
  ClearScreen(RGB(0,0,0))
  StartDrawing(ScreenOutput())
  X = 10
  Y = 100
  nX = 0
  nY = 0
  stopLine = Random(10,3)
  
  For i = 0 To stopLine  
    nX + 2 + Random(2)   
    nY + Random(1) - Random(1)  
    LineXY(X,Y,X+nX,Y+nY,#White) 
    X + nX 
    Y + NY
  Next i 
    
  LineXY(X,Y,250,100,#White) 
  StopDrawing()  
  FlipBuffers()  
 
  Delay (20)  
Until  Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
EndIf
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: [game 2D] éclair

Message par Huitbit »

Hello,

Pour l'instant, c'est plus une étincelle (d'un éclateur par exemple) :mrgreen: .

http://arsene.perez-mas.pagesperso-oran ... MKORFF.gif
http://www.shtsf.com/wp-content/uploads ... G_9735.jpg

http://upload.wikimedia.org/wikipedia/c ... 00kV_1.JPG

En tout cas, ça vaut le coup de persévérer, ça peut être du meilleur effet dans un jeu !

Hasta la vista !
Elevé au MSX !
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [game 2D] éclair

Message par graph100 »

C'est rigolo :)

J'aimerais bien voir comment tu utilises les sprites 3D dans ce cas .. Faut le recréer à chaque fois ? un peu long non ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [game 2D] éclair

Message par blendman »

graph100 a écrit :J'aimerais bien voir comment tu utilises les sprites 3D dans ce cas .. Faut le recréer à chaque fois ? un peu long non ?
non, on le transforme plutôt.

JE n'ai pas trop réfléchi à d'autres possibilités ^^
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [game 2D] éclair

Message par G-Rom »

- L'idéal pour ce genre d'opération est effectivement le sprite 3D , sur le forum , j'avais posté il y a fort longtemps maintenant une courbe de bézier à base de sprite 3D , le rendu était génial.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [game 2D] éclair

Message par Backup »

pour les Eclairs type Orage que pensez vous de ça :)

Code : Tout sélectionner

Enumeration
	#win
	#sprite
	#police
EndEnumeration
; ***********************************
Declare.f RotationX(x, angle.f, dist)
Declare.f RotationY(y, angle.f, dist)
Declare.s arc(x.s,y.s,niv)


Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
ExamineDesktops()
EcranX =DesktopWidth(0);=largeur de l'ecran
EcranY = DesktopHeight(0):;=hauteur de l'ecran
x1=EcranX/2
y1=10


WindowID = OpenWindow(#win, 0, 0, 800,600, "click bouton droit pour quitter", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
InitKeyboard()

WindowID = WindowID(#win)
Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0) 
Resultat = InitMouse()


Repeat
	
	ExamineMouse()  :ExamineKeyboard()
	Event=WaitWindowEvent(2)  
	StartDrawing( ScreenOutput())   
		dist= random(80,30)
		;disty=random(140,1)
		angle.f=random(130,30)
		angle_x.f=random(130,30)
		ret$=arc(str(x1),str(y1),3)
		x1=val(StringField(ret$,1,","))
		y1=val(StringField(ret$,2,","))
	StopDrawing()
	
	FlipBuffers():; affiche l'ecran
	if co>50
		ClearScreen(rgb(0,0,0)) :;efface l'ecran
		x1=EcranX/2 ; remise a zero
		y1=10
		co=0
	Endif
	co=co+1
	
	;}
	
	If MouseButton(2) or KeyboardPushed(#PB_Key_Space)
		End
	EndIf
Until Event=#PB_Event_CloseWindow

Procedure.f RotationX(x, angle.f, dist)
	; on fourni le X actuel plus un angle, et une distance
	; ça retourne le nouveau X
	ProcedureReturn x + Cos (angle.f* #PI /180)*dist
EndProcedure


Procedure.f RotationY(y, angle.f, dist)
	; on fourni le Y actuel plus un angle, et une distance
	; ça retourne le nouveau Y
	ProcedureReturn y + Sin (angle.f* #PI /180)*dist
EndProcedure

procedure.s arc(x.s,y.s,niv)
	; Recursif power
	; By Dobro
	
	x1=val(x.s)
	y1=val(y.s)
	
	For o=1 to niv
		de=random(2,1)
		dist=random(80,1)
		disty= dist
		angle.f=random(130,1)
		angle_x.f=random(130,30)
		If de=2
			angle_x.f=-angle_x.f
		Endif
		
		x2=RotationX(x1, angle_x.f, dist)
		y2=RotationY(y1, angle.f, disty)
		lineXY(x1+2, y1-2,x2+2,y2-2,RGB(50,0,150))
		lineXY(x1+1, y1+1,x2+1,y2+1,RGB(50,0,200))
		lineXY(x1, y1,x2,y2,RGB(100,150,255))
		lineXY(x1-1, y1-1,x2-1,y2-1,RGB(50,0,200))   
		lineXY(x1-2, y1+2,x2-2,y2+2,RGB(50,0,150)) 
		x.s=str(x2) :y.s=str(y2)
		x_s.s=x.s  :y_s.s=y.s
	Next o
	x.s=x_s.s:y.s=y_s.s
	niv=niv-1
	if niv>0
		
		ret$=arc(x.s,y.s,niv)
		x.s=StringField(ret$,1,",")
		y.s=StringField(ret$,2,",")
	Endif
	ProcedureReturn x.s+","+y.s
	
Endprocedure

;

; EPB
Dernière modification par Backup le dim. 16/juin/2013 15:41, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [game 2D] éclair

Message par Ar-S »

L'effet de couleur bleu/blanc est pas terrible mais les formes sont très bien !
~~~~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
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: [game 2D] éclair

Message par Huitbit »

On se croirait dans Zorro...

dOBro, DobrOOO, renard rusé qui fait sa loi,
DObro, DoBro, vainqueur tu l'es à chaque fois
Dobro, dobroOOOOOOOOOO :lol:

Tant qu'à faire, il faut faire la totale : la pluie, le vent et les éclairs !
:mrgreen:
Elevé au MSX !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [game 2D] éclair

Message par Backup »

voici la version avec la pluie

bon sur mon Portable MSi GT 780 DXR ça speed un max
malgres ralentissement volontaire ..

si vous trouvez un moyen d'apporter une Temporisation fluide :)

ps : on quite avec barre D'espace ou click bouton droit

ça pourrai faire un Screen Saver :)

Code : Tout sélectionner

Enumeration
	#win
	#sprite_pluie
	#sprite_eclair
	#police
EndEnumeration
; ***********************************
Declare.f RotationX(x, angle.f, dist)
Declare.f RotationY(y, angle.f, dist)
Declare.s arc(x.s,y.s,niv)



Structure pluie
	x.i
	y.i
	pas.i
EndStructure
Global Dim pluie.pluie(500)

Structure eclair
	x.i
	y.i
EndStructure
Global Dim eclair.eclair(1)


Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
ExamineDesktops()
EcranX =DesktopWidth(0);=largeur de l'ecran
EcranY = DesktopHeight(0):;=hauteur de l'ecran
x1=EcranX/2
y1=10


; ********* prepare la puie ****************
For i=0 to 500-1
	pluie(i)\x.i=Random(EcranX)
	pluie(i)\y.i=Random(EcranY)
	pluie(i)\pas.i=Random(30,10)
Next i
; ***************************************

; ********* prepare les eclairs****************
For i=0 to 1
	eclair(i)\x.i=0; Random(EcranX)
	eclair(i)\y.i=0; Random(EcranY)
Next i
; ***************************************




WindowID = OpenWindow(#win, 0, 0, Ecranx,Ecrany, "click bouton droit pour quitter", #PB_Window_BorderLess |#PB_Window_ScreenCentered )
InitKeyboard()

WindowID = WindowID(#win)
Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0) 
Resultat = InitMouse()

; *** creation sprite pluie ***************
CreateSprite(#sprite_pluie,32,32)
StartDrawing(SpriteOutput(#sprite_pluie))
	LineXY(16,1,8,32,rgb(125,125,125))
StopDrawing()
; ***********************************
; *** creation sprite eclair ***************
CreateSprite(#sprite_eclair,EcranX,EcranY)
; ***********************************

FrameTime.f = 0


Repeat
	TimeStart = elapsedMilliseconds()
	ExamineMouse()  :ExamineKeyboard()
	Event=WaitWindowEvent(20)  
	if flag_clear2=1
		flag_clear2=0
	endif
	
	co=co+1
	
	; ************** les eclairs ******************************
	
	if co>random(800,150)
		If ElapsedMilliseconds() - timer_eclair > 40
			x1=EcranX/2 ; remise a zero
			y1=0
			co=0
			StartDrawing(SpriteOutput(#sprite_eclair))
				for u=1 to 50
					dist= random(80,30)
					angle.f=random(130,30)
					angle_x.f=random(130,30)
					ret$=arc(str(x1),str(y1),3)
					x1=val(StringField(ret$,1,","))
					y1=val(StringField(ret$,2,","))
				next u
			StopDrawing()
			timer_eclair = ElapsedMilliseconds()
		Endif
		DisplaySprite(#sprite_eclair,eclair(0)\x.i,eclair(0)\y.i)
		
		FlipBuffers():; affiche l'ecran
		flag_clear=flag_clear+1
		if flag_clear>2
			StartDrawing(SpriteOutput(#sprite_eclair))
				box(1,1,SpriteWidth(#sprite_eclair),SpriteHeight(#sprite_eclair),rgb(0,0,0))
			StopDrawing()
			flag_clear=0
		Endif
	Endif
	
	
	
	; **********  pluie  ****************
	If ElapsedMilliseconds() - timer_pluie > 10
		for i=0 to 500-1
			;X + Vitesse * FrameTime
			;Y + Vitesse * FrameTime
			
			pluie(i)\y.i=pluie(i)\y.i+pluie(i)\pas.i
			pluie(i)\x.i=pluie(i)\x.i-pluie(i)\pas.i/2
			if pluie(i)\y.i>=EcranY
				pluie(i)\y.i=0
			Endif
			
			if pluie(i)\x.i<=0
				pluie(i)\x.i=Ecranx
			Endif
		next i
		timer_pluie = ElapsedMilliseconds()
	Endif
	
	for i=0 to 500-1
		DisplayTransparentSprite(#sprite_pluie,pluie(i)\x.i,pluie(i)\y.i)
	next i
	
	FlipBuffers():; affiche l'ecran
	
	
	if flag_clear2=0
		ClearScreen(rgb(0,0,0)) :;efface l'ecran
	endif
	
	
	; **********************************
	
	
	;}
	
	If MouseButton(2) or KeyboardPushed(#PB_Key_Space)
		End
	EndIf
	
	;delay(60)
	
	
Until Event=#PB_Event_CloseWindow

Procedure.f RotationX(x, angle.f, dist)
	; on fourni le X actuel plus un angle, et une distance
	; ça retourne le nouveau X
	ProcedureReturn x + Cos (angle.f* #PI /180)*dist
EndProcedure


Procedure.f RotationY(y, angle.f, dist)
	; on fourni le Y actuel plus un angle, et une distance
	; ça retourne le nouveau Y
	ProcedureReturn y + Sin (angle.f* #PI /180)*dist
EndProcedure

procedure.s arc(x.s,y.s,niv)
	; Recursif power
	; By Dobro
	
	x1=val(x.s)
	y1=val(y.s)
	
	For o=1 to niv
		de=random(2,1)
		dist=random(80,1)
		disty= dist
		angle.f=random(130,1)
		angle_x.f=random(130,30)
		If de=2
			angle_x.f=-angle_x.f
		Endif
		
		x2=RotationX(x1, angle_x.f, dist)
		y2=RotationY(y1, angle.f, disty)
		lineXY(x1+2, y1-2,x2+2,y2-2,RGB(50,0,150))
		lineXY(x1+1, y1+1,x2+1,y2+1,RGB(50,0,200))
		lineXY(x1, y1,x2,y2,RGB(100,150,255))
		lineXY(x1-1, y1-1,x2-1,y2-1,RGB(50,0,200))   
		lineXY(x1-2, y1+2,x2-2,y2+2,RGB(50,0,150)) 
		x.s=str(x2) :y.s=str(y2)
		x_s.s=x.s  :y_s.s=y.s
	Next o
	x.s=x_s.s:y.s=y_s.s
	niv=niv-1
	if niv>0
		
		ret$=arc(x.s,y.s,niv)
		x.s=StringField(ret$,1,",")
		y.s=StringField(ret$,2,",")
		
	Endif
	ProcedureReturn x.s+","+y.s
	
Endprocedure

;



; 

; EPB
Dernière modification par Backup le dim. 16/juin/2013 19:38, modifié 1 fois.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [game 2D] éclair

Message par G-Rom »

si vous trouvez un moyen d'apporter une Temporisation fluide
Tu prends le frameTime d'une boucle en ms, tu la divises par 1000 ( stocke le résultat dans un float )
et tu t'en sert de facteur de vitesse.
FrameTime.f = 0

Repeat
TimeStart = elapsedMilliseconds()

X + Vitesse * FrameTime
Y + Vitesse * FrameTime

FrameTime = (elapsedMilliseconds() - TimeStart) / 1000
Forever
Ca devrais fonctionner sur n'importe quel bécane à la même vitesse.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [game 2D] éclair

Message par graph100 »

@Dobro : bel effet !

Cependant un truc dans le code m'a interpellé ! Tu fais des appels de procédure avec du texte pour les paramètres, et du texte pour le retour de paramètre.
J'ai trouvé ça tellement inapproprié, que j'ai fait la version avec ce que Purebasic nous offre, c'est à dire des pointeurs structuré...

Il ne faut pas donner aux gens de mauvaises habitudes. Les chaines pour passer des paramètres numériques, c'est une fausse "astuce"
Je vais m'arrêter là, :P , mais il y a d'autre choses qui m'ont surpris dans ton code, comme : #PB_Window_SystemMenu|#PB_Window_BorderLess ??? Pourquoi, mais pourquoi ?

En toutes amitiés, et pour tenter de nous faire tous avancer,

Graph100
[edit] : rédigé avant le postage du code de la pluie

Code : Tout sélectionner

Enumeration
	#win
EndEnumeration


; ***********************************
Declare.i arc(*coord.POINT, niv)


If InitSprite() = 0 Or InitKeyboard() = 0
	End
EndIf

;{ Récupération de la taille du bureau (j'vois pas trop bien à quoi ça sert puisque qu'ensuite la fenetre fait 800x600... Avec mon bureau de 1920x1200 c'est zarb !

ExamineDesktops()
EcranX = DesktopWidth(0);=largeur de l'ecran
EcranY = DesktopHeight(0):;=hauteur de l'ecran

;}


Define coord_eclair.POINT, Draw_eclair.b = #False


OpenWindow(#win, 0, 0, 800,600, "Click bouton droit pour quitter", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
WindowID = WindowID(#win)

If OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0, 0) = 0
	End
EndIf


Repeat
	
	ExamineKeyboard()
	Event = WaitWindowEvent(20)
	
	StartDrawing( ScreenOutput()) 
		
		If coord_eclair\y < EcranY
			arc(coord_eclair, 3)
			
		ElseIf Draw_eclair = #True
			timer = ElapsedMilliseconds()
			Draw_eclair = #False
		EndIf
		
	StopDrawing()
	
	FlipBuffers(); affiche l'ecran
	
	If Draw_eclair = #False And ElapsedMilliseconds() - timer > 200 ; ms
		ClearScreen(RGB(0,0,0))	;	efface l'ecran

		; 		coord_eclair\x = Random(EcranX - 40) + 20	; Remise à zéro aléatoire
		coord_eclair\x = EcranX / 2 ; Remise à zéro
		coord_eclair\y = 10
		
		Draw_eclair = #True
		
		; Controle du dessin de l'éclair pendant une durée indépendante du traitement des évènements windows
		; Le dessin ne continu plus lorsqu'il sort de l'écran.
	EndIf
	
	
	If KeyboardPushed(#PB_Key_Space)
		Event = #PB_Event_CloseWindow
	EndIf
Until Event = #PB_Event_CloseWindow

End


Procedure.i arc(*coord.POINT, niv)
	; Recursif power
	; By Dobro
	
	; Pointeur & Structure power
	; By Graph100
	
	
	For o=1 To niv
		de=Random(2,1)
		dist=Random(80,1)
		angle.f=Random(130,1)
		angle_x.f=Random(130,30)
		
		If de=2
			angle_x.f=-angle_x.f
		EndIf
		
		x2 = *coord\x + Cos(angle_x * #PI / 180) * dist
		y2 = *coord\y + Sin(angle * #PI / 180) * dist
		
		LineXY(*coord\x+2, *coord\y-2, x2+2, y2-2, RGB(50,0,150))
		LineXY(*coord\x+1, *coord\y+1, x2+1, y2+1, RGB(50,0,200))
		LineXY(*coord\x+0, *coord\y+0, x2+0, y2+0, RGB(100,150,255))
		LineXY(*coord\x-1, *coord\y-1, x2-1, y2-1, RGB(50,0,200))   
		LineXY(*coord\x-2, *coord\y+2, x2-2, y2+2, RGB(50,0,150))
		
	Next o
	
	*coord\x = x2
	*coord\y = y2
	
	niv = niv-1
	
	If niv > 0
		arc(*coord, niv)
	EndIf
	
EndProcedure

Dernière modification par graph100 le dim. 16/juin/2013 17:43, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [game 2D] éclair

Message par Backup »

Merci , mais

quoique je fasse avec mon code ci dessus, j'ai toujours la pluie qui tombe a la vitesse de l'eclair (jeux de mot )

bref si je voulais faire tomber mes goutes comme des flocons de neige .. je suis mal barré , j'y arrive pas 8O
(p'tetes fatigué moi :lol:)

@graph100
#PB_Window_SystemMenu|#PB_Window_BorderLess
c'est parceque je suis parti d'un vieux code :)
et ça fait deja plusieurs versions que je poste ou la correction avait ete faites :)

pour le passage de parrametres , oui... le probleme c'est que chez moi c'est deja trop rapide alors si j'utilise les pointeurs :lol:

note que l'utilisation des String n'est pas une mauvaise habitude a mon sens
c'est une autre façon de voir les choses :)

on est plus avec des 6502 , maintenant les proc , dépotent ! :)

de plus si tu utilises le derniers code que j'ai posté (avec la pluie) , tu verra une amélioration de l'eclair :)
j'utilise de 2 fois sur trois le meme sprite ( d'ailleurs je suis passé aux sprites ) , sans le nettoyer
ce qui permet d'afficher plusieurs Eclairs sur la meme racine ... comme dans la réalité :)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [game 2D] éclair

Message par graph100 »

Yep :D j'ai vu que t'avais changé les éclairs, ça rend vraiment bien quand yen a 3 superposés :)

Pour l'histoire des chaines, c'est juste que c'est bcp plus long à traiter qu'un nombre, alors si on peut, pourquoi se priver. Même si j'ai un i7 je veux pas me chauffer avec :lol:
Et puis pense à tout les gens qui ont un pc "merdique", de nos jours les gens utilisent la puissance qu'on à disposition sans plus chercher à l'optimiser. Merci pour la planète :twisted: (je parle des gros logiciels) Alors si on peut faire quelque chose dans notre coin...

Tiens, un cadeau :lol: Ça doit se rapprocher de ce que tu voulais obtenir pour la pluie

Code : Tout sélectionner

Enumeration
		#win
		#sprite_pluie
		#sprite_eclair
		#police
EndEnumeration
; ***********************************
Declare.f RotationX(x, angle.f, dist)
Declare.f RotationY(y, angle.f, dist)
Declare.s arc(x.s,y.s,niv)



Structure pluie
		x.i
		y.i
		pas.i
EndStructure
Global Dim pluie.pluie(100)

Structure eclair
		x.i
		y.i
EndStructure
Global Dim eclair.eclair(1)


Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
ExamineDesktops()
EcranX =DesktopWidth(0);=largeur de l'ecran
EcranY = DesktopHeight(0):;=hauteur de l'ecran
x1=EcranX/2
y1=10


; ********* prepare la puie ****************
For i=0 To 100-1
		pluie(i)\x.i=Random(EcranX)
		pluie(i)\y.i=Random(EcranY)
		pluie(i)\pas.i=Random(30,15)
Next i
; ***************************************

; ********* prepare les eclairs****************
For i=0 To 1
		eclair(i)\x.i=0; Random(EcranX)
		eclair(i)\y.i=10; Random(EcranY)
Next i
; ***************************************




WindowID = OpenWindow(#win, 0, 0, Ecranx,Ecrany, "click bouton droit pour quitter", #PB_Window_BorderLess |#PB_Window_ScreenCentered )
InitKeyboard()

WindowID = WindowID(#win)
Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0) 
Resultat = InitMouse()

; *** creation sprite pluie ***************
CreateSprite(#sprite_pluie,32,32)
StartDrawing(SpriteOutput(#sprite_pluie))
		LineXY(16,1,8,32,RGB(125,125,125))
StopDrawing()
; ***********************************
; *** creation sprite eclair ***************
CreateSprite(#sprite_eclair,EcranX,EcranY)
; ***********************************


Repeat
		
		ExamineMouse()  :ExamineKeyboard()
		Event=WindowEvent()  
		If flag_clear2=1
				flag_clear2=0
		EndIf
		
		co=co+1
		
		; ************** les eclairs ******************************
		If co>Random(800,50)
				
				x1=EcranX/2 ; remise a zero
				y1=10
				co=0
				StartDrawing(SpriteOutput(#sprite_eclair))
						For u=1 To 50
								dist= Random(80,30)
								angle.f=Random(130,30)
								angle_x.f=Random(130,30)
								ret$=arc(Str(x1),Str(y1),3)
								x1=Val(StringField(ret$,1,","))
								y1=Val(StringField(ret$,2,","))
						Next u
				StopDrawing()
				
				DisplaySprite(#sprite_eclair,eclair(0)\x.i,eclair(0)\y.i)
				
				FlipBuffers():; affiche l'ecran
				flag_clear=flag_clear+1
				If flag_clear>2
						StartDrawing(SpriteOutput(#sprite_eclair))
								Box(1,1,SpriteWidth(#sprite_eclair),SpriteHeight(#sprite_eclair),RGB(0,0,0))
						StopDrawing()
						flag_clear=0
				EndIf
		EndIf
		
		
		
		; **********  pluie  ****************
		
		If ElapsedMilliseconds() - timer_pluie > 10
			; on gère le déplacement PAS à chaque boucle
			For i=0 To 100-1
				pluie(i)\y.i=pluie(i)\y.i+pluie(i)\pas.i
				pluie(i)\x.i=pluie(i)\x.i-pluie(i)\pas.i/2
				
				If pluie(i)\y >=EcranY
					pluie(i)\y =0
				EndIf
				If pluie(i)\x < 0
					pluie(i)\x + Ecranx
				EndIf
			Next i
			
			timer_pluie = ElapsedMilliseconds()
		EndIf
		
		; on gère l'affichage à chaque boucle
		For i=0 To 100-1
				DisplayTransparentSprite(#sprite_pluie,pluie(i)\x.i,pluie(i)\y.i)
		Next i
		
		
		
		;delay(100)
		
		FlipBuffers():; affiche l'ecran
		
		If flag_clear2=0
				ClearScreen(RGB(0,0,0)) :;efface l'ecran
		EndIf
		
		
		; **********************************
		
		
		;}
		
		If MouseButton(2) Or KeyboardPushed(#PB_Key_Space)
				End
		EndIf
		
		
Until Event=#PB_Event_CloseWindow

Procedure.f RotationX(x, angle.f, dist)
		; on fourni le X actuel plus un angle, et une distance
		; ça retourne le nouveau X
		ProcedureReturn x + Cos (angle.f* #PI /180)*dist
EndProcedure


Procedure.f RotationY(y, angle.f, dist)
		; on fourni le Y actuel plus un angle, et une distance
		; ça retourne le nouveau Y
		ProcedureReturn y + Sin (angle.f* #PI /180)*dist
EndProcedure

Procedure.s arc(x.s,y.s,niv)
		; Recursif power
		; By Dobro
		
		x1=Val(x.s)
		y1=Val(y.s)
		
		For o=1 To niv
				de=Random(2,1)
				dist=Random(80,1)
				disty= dist
				angle.f=Random(130,1)
				angle_x.f=Random(130,30)
				If de=2
						angle_x.f=-angle_x.f
				EndIf
				
				x2=RotationX(x1, angle_x.f, dist)
				y2=RotationY(y1, angle.f, disty)
				LineXY(x1+2, y1-2,x2+2,y2-2,RGB(50,0,150))
				LineXY(x1+1, y1+1,x2+1,y2+1,RGB(50,0,200))
				LineXY(x1, y1,x2,y2,RGB(100,150,255))
				LineXY(x1-1, y1-1,x2-1,y2-1,RGB(50,0,200))   
				LineXY(x1-2, y1+2,x2-2,y2+2,RGB(50,0,150)) 
				x.s=Str(x2) :y.s=Str(y2)
				x_s.s=x.s  :y_s.s=y.s
		Next o
		x.s=x_s.s:y.s=y_s.s
		niv=niv-1
		If niv>0
				
				ret$=arc(x.s,y.s,niv)
				x.s=StringField(ret$,1,",")
				y.s=StringField(ret$,2,",")
				
		EndIf
		ProcedureReturn x.s+","+y.s
		
EndProcedure

;

; EPB
Dernière modification par graph100 le dim. 16/juin/2013 18:14, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [game 2D] éclair

Message par Backup »

oui ! :D
c'est exactement ça ....

par contre, je comprends pas ce que tu as fait :roll:
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [game 2D] éclair

Message par graph100 »

bah dans ton code original tu téléportes la pluie sur l'axe X à chaque boucle :

Code : Tout sélectionner

				If pluie(i)\x.i<=EcranX
						pluie(i)\x.i=Random(Ecranx,1)
				EndIf
Cette condition est Toujours vrai, donc elle ne sert à rien.

Comme la pluie se déplace toujours vers la gauche on peut écrire ça :

Code : Tout sélectionner

								If pluie(i)\x < 0
										pluie(i)\x + Ecranx
								EndIf
Ce qui va modifier la position en X uniquement si elle sort de l'écran.
L'autre condition en Y n'est active que lorsque la pluie sort de l'écran en bas.

Et d'un autre coté, j'ai dé-commenté le déplacement en X :

Code : Tout sélectionner

								pluie(i)\y.i=pluie(i)\y.i+pluie(i)\pas.i
								pluie(i)\x.i=pluie(i)\x.i-pluie(i)\pas.i/2
Pour avoir le bon déplacement.
Ensuite j'ai augmenté l'amplitude du pas :

Code : Tout sélectionner

				pluie(i)\pas.i=Random(30,15)
sinon s'étais bcp trop lent :lol:
et enfin, pour que le déplacement soit indépendant du temps de traitement de la boucle :

Code : Tout sélectionner

				; **********  pluie  ****************
				
				If ElapsedMilliseconds() - timer_pluie > 10
						; on gère le déplacement PAS à chaque boucle
						For i=0 To 100-1
								pluie(i)\y.i=pluie(i)\y.i+pluie(i)\pas.i
								pluie(i)\x.i=pluie(i)\x.i-pluie(i)\pas.i/2
								
								If pluie(i)\y >=EcranY
										pluie(i)\y =0
								EndIf
								If pluie(i)\x < 0
										pluie(i)\x + Ecranx
								EndIf
						Next i
						
						timer_pluie = ElapsedMilliseconds()
				EndIf
				
				; on gère l'affichage à chaque boucle
				For i=0 To 100-1
								DisplayTransparentSprite(#sprite_pluie,pluie(i)\x.i,pluie(i)\y.i)
				Next i
J'ai séparé l'affichage qui se fait à chaque boucle, du déplacement.
Ici ce n'est pas vraiment utile... Ca à plus d'effet lorsque le delay voulu (ici réglé à 10ms) est plus grand que le temps de traitement de la boucle ici limité par FlipBuffers() à 60 ou 30 fps.

Dans la même optique, on peut utiliser WindowEvent(), car c'est FlipBuffers() qui rend la main au proc ! Alors que WaitWindowEvent(20) ne va que générer un retard superflu et à l'identique de Delay(20), ce n'est pas très précis et ça fluctu.

G-Rom pourrait même ajouter qu'il faudrait traiter tout les event de la pile avant de rendre la main pour être sur de ne pas en manquer :roll: mais ici c'est pas trop le problème.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre