Un effet interessant améliorable

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

Un effet interessant améliorable

Message par DjPoke »

Bonjour,

J'ai commencé à programmer un fond animé pour un jeu.
Le code source suit.
Je trouve cela intéressant mais j'aurais aimé mettre, derrière mes effets, un fond genre plasma qui fasse penser à de l'eau couleur orangée.
Je suis mauvais pour les effets plasma... si quelqu'un pouvait m'aider...
ps : mon script est libre de droit, tout comme le jeu que je vais faire. :)
Testé ok sur mac os x.

Code : Tout sélectionner

#scnw=1024
#scnh=768
#scnd=32

If InitSprite()=0 Or InitMouse()=0 Or InitSound()=0 Or InitKeyboard()=0
  MessageRequester("Error","Can't initialize the game !")
  End
EndIf
If OpenScreen(#scnw,#scnh,#scnd,"Plasmanoid")=0
  MessageRequester("Error","Can't initialize "+Str(#scnw)+"x"+Str(#scnh)+"x"+Str(#scnd)+" screen !")
  End
EndIf

Declare reducedcolor(c,re)

RandomSeed(ElapsedMilliseconds())

#GAMEEND=0
#GAMEPLAYING=1

#FPS=50

#DOTLEADERS=5
#MOTORS=50
#DOTSEEKERS=41

Dim ray.f(#MOTORS,#DOTLEADERS)
Dim ang.f(#MOTORS,#DOTLEADERS)
Dim speed.f(#MOTORS,#DOTLEADERS)
Dim sens(#MOTORS,#DOTLEADERS)
Dim color(#DOTLEADERS)

Dim xdot(#DOTLEADERS,#DOTSEEKERS)
Dim ydot(#DOTLEADERS,#DOTSEEKERS)

dotcount=0

For j=1 To #DOTLEADERS
  For i=1 To #MOTORS
    ray.f(i,j)=Random(70)+1
    ang.f(i,j)=Random(359)
    speed.f(i,j)=Random(15)+1
    sens(i,j)=Random(1)
    If sens(i,j)=0
      sens(i,j)=-1
    EndIf
  Next
Next

Restore colorlist

For i=1 To #DOTLEADERS
  Read.i r
  Read.i g
  Read.i b
  color(i)=RGB(r,g,b)
Next

DataSection
  colorlist:
  Data.i 41,0,0,41,25,0,41,40,0,40,41,40,41,25,25
EndDataSection

gamestate=#GAMEPLAYING


FlipBuffers()

While gamestate=#GAMEPLAYING
   
  ClearScreen(RGB(0,0,0))
  
  time=ElapsedMilliseconds()
  
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)=#True
    gamestate=#GAMEEND
  EndIf
  
  ; pour usage futur... appuyer sur 'espace' pour faire vibrer !
  
  If KeyboardPushed(#PB_Key_Space)=#True
    vibrate=1
  Else
    vibrate=0
  EndIf
  
  ;=============================================================
    
  StartDrawing(ScreenOutput())
  
  DrawingMode(#PB_2DDrawing_XOr)
  
  If dotcount<#DOTSEEKERS
    dotcount=dotcount+1
  EndIf
  
  For j=1 To #DOTLEADERS
    px=(#scnw/2)
    py=(#scnh/2)
    For i=1 To #MOTORS
      px=px+(ray.f(i,j)*Cos(Radian(ang.f(i,j))))
      py=py+(ray.f(i,j)*Sin(Radian(ang.f(i,j))))
      ang.f(i,j)=ang.f(i,j)+(speed.f(i,j)*sens(i,j))
      If ang.f(i,j)<0
        ang.f(i,j)=ang.f(i,j)+360
      EndIf
      If ang.f(i,j)>359
        ang.f(i,j)=ang.f(i,j)-360
      EndIf
    Next
    If px>=0 And px<#scnw And py>=0 And py<#scnh
      Plot(px,py,color(j))        
    EndIf
    For k=#DOTSEEKERS-1 To 1 Step -1
      xdot(j,k+1)=xdot(j,k)
      ydot(j,k+1)=ydot(j,k)
    Next
    xdot(j,1)=px
    ydot(j,1)=py
  Next
  For j=1 To #DOTLEADERS
    For i=2 To dotcount
      px=xdot(j,i)
      py=ydot(j,i)
      If px>=0 And px<#scnw And py>=0 And py<#scnh
        vibrationx=(Random(4)-2)*vibrate
        vibrationy=(Random(4)-2)*vibrate
        vibrasize=(i/4)*vibrate
        Circle(px+vibrationx,py+vibrationy,i+vibrasize,reducedcolor(Color(j),(i-1)))        
      EndIf
    Next
  Next
  
  StopDrawing()
  
  FlipBuffers()
  
  While ElapsedMilliseconds()-time<Int(1000/#FPS)
  Wend
  
Wend

CloseScreen()

End

Procedure reducedcolor(c,re)
  rr=Red(c)-re
  gg=Green(c)-re
  bb=Blue(c)-re
  If rr<0
    rr=0
  EndIf
  If gg<0
    gg=0
  EndIf
  If bb<0
    bb=0
  EndIf
  ProcedureReturn RGB(rr,gg,bb)
EndProcedure
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un effet interessant améliorable

Message par Cool Dji »

Hello DjPoke,

Je ne sais pas si c'est ce que tu recherches mais je voulais avoir aussi un fond de style "eau" pour une démo

http://xdji.free.fr/Telechargement/Gaga ... %20Dji.zip

J'avais généré mes caustics avec un générateur trouvé sur la toile...il devait y avoir une douzaine d'image pour l'animation : ça ne mange pas beaucoup de temps de calcul.
Only PureBasic makes it possible
Avatar de l’utilisateur
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

Re: Un effet interessant améliorable

Message par DjPoke »

Merci Cool Dji, c'est une très bonne idée que je vais mettre en pratique de suite. :)
Bon dimanche.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un effet interessant améliorable

Message par Cool Dji »

Cool :D

Dimanche cuisine aujourd'hui
- soupe d'escargots aux girolles
- blanquette de veau à l'ancienne
...
programmation ce soir :mrgreen:
Only PureBasic makes it possible
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Un effet interessant améliorable

Message par Fig »

Incroyablement impressionnant !!! 8O 8O 8O 8O 8O

Je n'ai pas regardé le code, mais les effets de lumières tu les obtiens avec ogre ou des sprites3d blendés ?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Un effet interessant améliorable

Message par djes »

Tu devrais pouvoir obtenir le même effet de façon "câblée" (accélérée), avec les sprites 3d et un blending XOr.
Avatar de l’utilisateur
DjPoke
Messages : 121
Inscription : mar. 02/nov./2010 13:53
Localisation : Corte, Corse, France
Contact :

Re: Un effet interessant améliorable

Message par DjPoke »

C'est vrai que cela peut être plus rapide, djes.
De plus, il est possible de remplacer les circles par des sprites 3d plus complexes.
Cela peut être même plus intéressant.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Un effet interessant améliorable

Message par blendman »

cool dji : ton exemple est sympa, mais ne marche plus en mode fenêtre, hélas.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un effet interessant améliorable

Message par Cool Dji »

@blendman, c'est surtout qu'il est codé avec une ancienne version de PB et ne tourne plus sous 4.6 ; mais ya rien d'extraordinaire pour avoir l'effet plasma/eau qui est en fond d'écran : c'est juste une animation d'images de caustics : le plus long était de paramétrer le générator de caustics pour produire des effets sympas en tenant compte des contraintes (tout devait rentrer dans une image de 512x512).

Pour info, le fichier "Gaga Punch.bmp", contient les32 images de 64x64 qui ont servi à construire l'animation.
Les 32 images sont dans le gros bloc de 512x256 à raison de 8 images dans la longueur sur 4 lignes...

Code : Tout sélectionner

sl5+1

If sl5=32 : sl5=0 : EndIf ; boucle l'animation

ing8=200                     ; effet transparence, dans la demo je le fais varier

; rempli l'écran de carrés de 64x64
For i=0 To 10  ; rempli en lignes (y)
 For j=0 To 12 ; rempli en colonnes (x)
  DisplaySprite3D(6+sl5,j*64,i*64,ing8) ; les 32 images sont sauvegardées dans les sprites de 6 à 38
 Next
Next

Only PureBasic makes it possible
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Un effet interessant améliorable

Message par blendman »

ce qui m'intéressait surtout, ce sont les effets de type particules qu'il y avait qui sont plutôt sympathiques :D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Un effet interessant améliorable

Message par djes »

Avec ce code, il est possible d'aller très loin dans les effets, vu qu'il traite tout au niveau pixel. Y'a matière!
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un effet interessant améliorable

Message par Cool Dji »

@Djes, c'est clair que le code de DjPoke est très puissant car il traite le pixel mais ça prend du temps machine... et la technique n'est peut être pas adaptée pour un fond d'écran de jeu qui ne doit pas faire ralentir le zinzin.

Au besoin, j'ai extrait les animations articles de la Gaga Demo et installé en 4.60.
Ce n'est pas en mode fenetré mais ça doit pas être bien difficile de basculer...

Il faut mettre les 2 images dans le dossier :
Pict01.jpg
Image

Pict02.jpg
Image

Code : Tout sélectionner

; Cool Dji
; Novembre 2011, 4.60 Finale

InitEngine3D()
InitSprite()
InitSprite3D()
InitSound()
InitKeyboard()
InitMouse()



Global ing.f,ing2.f,ing3.f=0.1,ing4,ing5.f,k,sl5,w1,ing6,ing7,ing8=255,ing9
Global Posmouse,nuag,dnuag=1,scenario,activeboule,bx,by,alpha1,ang.f,zs.f
Global Rlfa.d,RlfaX.d,RlfaY.d,RlfaZ.d,n1,dn1,Smtb,Smt,dl,ing8a=-1
Global Dim Rxa.d(100),Dim Rya.d(100),Dim Rza.d(100),dang.f,pla.f,sm
Global Dim Bougix.i(36*5):Global Dim Bougiy.i(36*5):Global Dim Bougiz.i(36*5)
Global Dim coux.f(99),Dim couy.f(99),Dim cx.f(10000),Dim cy.f(10000),Dim cz.f(10000)

OpenScreen(800, 600, 32, "Gaga Punch")




;-- Creation des materials

Add3DArchive("\", #PB_3DArchive_FileSystem)

;----- Flare blanc
CreateMaterial(1, LoadTexture(0,"Pict01.jpg")):DisableMaterialLighting(1, 1)
MaterialBlendingMode(1,#PB_Material_Add)

;----- Flare violet

CreateMaterial(2, LoadTexture(1,"Pict02.jpg")):DisableMaterialLighting(2, 1)
MaterialBlendingMode(2,#PB_Material_Add)


; -- Creation des formes géométriques

;------ Charge les coordonnées des 3 formes géométriques (36 points par forme)
curt=1
Restore Formes
Repeat
  Read.i Bougix(curt)
  Read.i Bougiy(curt)
  Bougiz(curt)=0
  curt+1
Until curt > 36*3

;-------Agrandit les formes
For j= 1 To 36:Rxa(j)=Bougix(j)*3:Rya(j)=Bougiy(j)*3:Rza(j)= Bougiz(j)*3:Next

;-------Création de 36 particles (1 par point)

For j = 1 To 36
  CreateParticleEmitter(j,50,50,50,0)
  ParticleMaterial(j,MaterialID(1)):ParticleTimeToLive  (j, 1,1)
  ParticleEmissionRate(j,20)
  ParticleSize(j, 200, 200)
  ParticleColorRange(j, RGB(255,0,255),RGB(255,255,0))
  ParticleEmitterLocate(j,Bougix(j)*15, 0, Bougiy(j)*15):
  HideParticleEmitter(j,0)
Next


; -- Creation de la grande roue

;-------Construit les coordonnées de la roue (100 bandes de 10 points pour la roue= pour faire les petits traits violets)
For j=0 To 99:a.f=a.f+3.6:If a=360:a=0:EndIf
  coux(j)=Sin(Radian(a.f)):couy(j)=Cos(Radian(a.f))
Next

;---- Construit la roue dans un Billboard
CreateBillboardGroup(0,MaterialID(2),50,50)
For i=0 To 10           ; mettre 100 pour voire la différence de longueur des petits traits violets
  For j=0 To 99
   AddBillboard(j,0,coux(j)*(3000+i*10),coux(j)*(3000+i*10),couy(j)*(3000+i*10))
 Next
Next

; -- Creation de la grande lumière blanche qui tourne dans la roue

;---- Construit la lumière blanche dans un Billboard
CreateBillboardGroup(2, MaterialID(1), 1000, 1000)
For j=0 To 1
  AddBillboard(j, 2,   coux(0)*3050,coux(0)*3050,couy(0)*3050)
Next


CreateCamera(0, 0, 0, 100, 100):ing5=0.01


;-- BIG LOOP
Repeat 
  FlipBuffers()
  
  ;--- Compteur pour faire animer les formes géométriques
  ;----- Principe de zoom et des zoom avec variagle ing2
  
  
  ing2=ing2+ing3
  ;-- la forme a t-elle atteinte sa taille maximum ?
  If ing2>50
    ing3=-0.3   ; oui, alors on dézoom 
  EndIf
  
  ;-- la forme a t-elle atteinte sa taille minimum ?
  
  If ing2<0
    ing3=0.3     ; oui, alors on zoom 
    ing4=ing4+1  ; et on passe à la forme géométrique suivante
  
    If ing4=3    ; est-on à la dernière forme ?
      ing4=0      ; oui, on revient à la première forme
    EndIf
    
  EndIf
  
; variables pour faire tourner la lumière blanche et la caméra
ing6+1:If ing6=1:ing7=ing7+1:If ing7=100:ing7=0:EndIf:ing6=0:ing=ing+ing5
If ing>98 : ing=0 : EndIf :EndIf:
   
  
  a=25+(1+Sin(ing/2))*7500*Sin(ing*0.4):b=4000+4000* Sin(ing)
  c=5000+(1+Sin(ing/2))*1000*Cos(ing*0.4): d=0:e=0:f=0
  
 ;--- animation des formes géométriques 
  For j = 1 To 36
    ParticleEmitterLocate(j,Bougix(j+ing4*36)*ing2, 0, Bougiy(j+ing4*36)*ing2)
  Next
  
  ;--- Positionne la lumière blanche qui tourne
  For j=0 To 1
    BillboardLocate(j, 2, coux(ing7)*3050,coux(ing7)*3050,couy(ing7)*3050)
  Next
  
  
  CameraLocate(0,a,b,c):CameraLookAt(0,d,e,f):RenderWorld()
  
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape):
End

;--- Cordonnées (X,Y) des formes géométriques Coeur, Etoile, France : 36 points par objet

DataSection: Formes :
  ; forme géométrique n°1
  ; x,y du point1, x,y du point2,x,y du point3...
  ;.........
  ; forme géométrique n°2
  ; x,y du point1, x,y du point2,x,y du point3...
  ;.........
  ; forme géométrique n°3
  ; x,y du point1, x,y du point2,x,y du point3...
  ;.........
Data.i -1,-57,-5,-66,-17,-77,-30,-80,-43,-82,-61,-81,-71
Data.i -73,-80,-60,-80,-43,-75,-27,-70,-14,-63,1,-50,15,-42,27,-32,38,-24,46
Data.i -15,56,-8,64,1,72,10,63,21,52,32,42,40,34,47,24,53,14,60,6,68,-6,75,-20
Data.i 81,-35,82,-52,77,-70,64,-80,47,-83,31,-81,17,-75,8,-67,1,-71,5,-60,12
Data.i -45,19,-31,32,-33,49,-34,64,-34,54,-24,45,-12,38,1,45,10,53,22,63,36,48
Data.i 34,33,33,18,31,14,43,6,57,1,72,-5,58,-11,42,-16,31,-33,33,-50,34,-61,34
Data.i -51,22,-41,10,-35,1,-42,-12,-53,-23,-60,-36,-43,-33,-28,-32,-17,-30,-12
Data.i -41,-5,-56,-6,-96,-12,-80,-32,-66,-58,66,-62,-47,-86,-50,-104,-44,-100
Data.i -30,-77,-25,-69,-7,-59,7,-56,26,-59,50,-66,72,-48,80,-25,84,6,93,13,76
Data.i 29,72,56,78,75,68,70,50,79,30,68,15,53,10,63,-6,74,-19,85,-51,61,-56,42
Data.i -62,21,-79,94,92,95,111,92,125,86,118,86,103
EndDataSection
Only PureBasic makes it possible
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Un effet interessant améliorable

Message par Kwai chang caine »

Au besoin, j'ai extrait les animations articles de la Gaga Demo et installé en 4.60.
Y'a pas a tortiller du cul pour chier droit....
Même un extrait de ton code....c'est vraiment beau comme effet 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un effet interessant améliorable

Message par Cool Dji »

Merci KCC,

Au passage, je prie la noble assemblée de bien vouloir excuser les quelques fautes d'orthographes dans le texte précédent :mrgreen:
Je suis en congé aujourd'hui, donc il y a relâche et surtout je mange devant l'ordi (reste du week-end) le tout accompagné d'un sympathique verre de vin rouge... Le ciel est bleu, the Verve en fond musical, les enfants sont à l'école, ma douce au travail... What else !
Only PureBasic makes it possible
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Un effet interessant améliorable

Message par Kwai chang caine »

Soupe d'escargot à midi 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre