Lumière !!! Éclairage !!!

Programmation avancée de jeux en PureBasic
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Lumière !!! Éclairage !!!

Message par Mytic »

Voilà un petit code d’éclairage à améliorer bien sur.
Je l’ai crée en quelques minutes que pour le fun.
Utilisez la souri pour faire bouger la lumière et vous pouvez modifier les paramètres de la lumière dans la procédure pour avoir une lumière plus lumière que Onde (vous allez comprendre quand vous exécuterez le code)
Et si vous avez des améliorations, elles seront les bienvenus.
:wink:

Code : Tout sélectionner

InitSprite()
InitMouse()
InitKeyboard()
Procedure eclairage(px.l,py.l,couleur.l)
Static x.d
Static y.d
StartDrawing(ScreenOutput())
r = 4
distance = 50
champ = 200
div = 300
For i = 0 To champ Step 2
;Debug i
x = px
y = py
For t = 0 To distance
x = x + (Cos(i/div)*r)
y = y + (Sin(i/div)*r)
c = Point(x,y)
If (x<0) Or (y<0) Or (x=>639) Or (y=>479) Or (c = 26345)   :Goto nn:EndIf
Plot(x,y,couleur)
;LineXY(x,y,bx,by,couleur)
;bx = x
;by = y
Next t
nn:
Next i
StopDrawing()
EndProcedure

OpenWindow(0,0,0,640,480,"eclairage")
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
ClearScreen(0)
FlipBuffers()
Repeat
ClearScreen(0)
StartDrawing(ScreenOutput())
Box(300,300,40,55,26345)
StopDrawing()
  ExamineMouse()
eclairage(MouseX(),MouseY(),255)
FlipBuffers()
ExamineKeyboard()
Event = KeyboardPushed(#PB_Key_Escape)
Until  Event
Delay(1500)
End
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

voilà j'ai amélioré mon code : ça donne ça =>

Code : Tout sélectionner

InitSprite()
InitMouse()
InitKeyboard()
Procedure eclairage(px.l,py.l,couleur.l)
Static x.d
Static y.d
StartDrawing(ScreenOutput())
r = 6
distance = 50
champ = 200
div = 300
For i = 0 To champ Step 2
x = px
y = py
For t = 0 To distance
x = x + (Cos(i/div)*r)
y = y + (Sin(i/div)*r)
c = Point(x,y)
If (x<0) Or (y<0) Or (x=>639) Or (y=>479) Or (c = 26345)   :Goto nn:EndIf
Next t
nn:
LineXY(px,py,x,y,couleur)
Next i
StopDrawing()
EndProcedure

Procedure.l fps()
Static bactime.l
Static newtime.l
Static fps
Static fpsf
newtime = ElapsedMilliseconds()
If newtime - bactime => 1000
fpsf = fps
fps = 0
bactime = ElapsedMilliseconds()
Else
fps = fps + 1
EndIf

ProcedureReturn fpsf
EndProcedure

OpenWindow(0,0,0,640,480,"eclairage")
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
ClearScreen(0)
FlipBuffers()
Repeat
ClearScreen(0)
StartDrawing(ScreenOutput())
Box(300,300,40,55,26345)
DrawText(10,10,Str(fps()))
StopDrawing()
  ExamineMouse()
eclairage(MouseX(),MouseY(),255)

FlipBuffers()
ExamineKeyboard()
Event = KeyboardPushed(#PB_Key_Escape)
Until  Event
End
Avatar de l’utilisateur
Polux
Messages : 440
Inscription : mer. 21/janv./2004 11:17
Localisation : france
Contact :

Message par Polux »

très sympa!
par contre tout ce qui est instruction de traçage ( point/ligne ) c'est très lent. De plus quand tu trace ou que tu affiche sur un buffer différent de l'ecran principal ( quand tu utilise usebuffer en somme ), le passage a vista va poser souci ( vitesse encore divisée par 2 ou 3 -coz l'émulation de la couche directx 9 ).
Il faudrait adapter avec des sprites 3d ( ou direct en poly )
en tout cas c cool :wink:
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

sympatique comme tout !
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Merci….
Alors là, Microsoft ne rend la vie dure avec chaque version Windows qui change nos repères.
Ils devraient au moins changer de Windows tous les 10 ans au minimum, et non pas tout les 2 à 3 ans.

@Polux
très sympa!
par contre tout ce qui est instruction de traçage ( point/ligne ) c'est très lent. De plus quand tu trace ou que tu affiche sur un buffer différent de l'ecran principal ( quand tu utilise usebuffer en somme ), le passage a vista va poser souci ( vitesse encore divisée par 2 ou 3 -coz l'émulation de la couche directx 9 ).
Il faudrait adapter avec des sprites 3d ( ou direct en poly )
en tout cas c cool Wink
Tu pourrais m’éclairé un peur sur cette émulation directX sur VISTA ? (si c’est pas trop demander)
:wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pas mal :D

j'avais deja fait un trux comme ça :D
http://www.purebasic.fr/french/viewtopi ... light=plot

4eme post !! terre-lune avec Ray-tracing
(façon pompeuse de dire que je fait du lancé de rayon pour simuler l'eclairage des face de la lune) :D
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

encor quelques modif :D :

Code : Tout sélectionner

; ----------------------------------------
;|                                        |
;|              By  >Mytic<               |
;|                                        |
;|      ...........................       |
; ---------------------------------------- 
InitSprite()
InitMouse()
InitKeyboard()
Procedure eclairage(px.l,py.l,angleA.L,angleB.l,couleur.l)
Static x.d
Static y.d
StartDrawing(ScreenOutput())
r = 10
distance = 50
champ = 200
div = 300 
angleB = angleB + angleA
For i = angleA To angleB Step 2
x = px
y = py
For t = 0 To distance
x = x + (Cos(i/div)*r)
y = y + (Sin(i/div)*r)
;x =  x +(Cos(i/div)*t)
;y = y + (Sin(i/div)*t)
c = Point(x,y)
If (x<0) Or (y<0) Or (x=>639) Or (y=>479) Or (c = RGB(0,0,255))   :Goto nn:EndIf
Next t
nn:
LineXY(px,py,x,y,couleur)
Next i
StopDrawing()
EndProcedure

Procedure.l fps()
Static bactime.l
Static newtime.l
Static fps
Static fpsf
newtime = ElapsedMilliseconds()
If newtime - bactime => 1000
fpsf = fps
fps = 0
bactime = ElapsedMilliseconds()
Else
fps = fps + 1
EndIf

ProcedureReturn fpsf
EndProcedure

OpenWindow(0,0,0,640,480,"eclairage")
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
;OpenScreen(640,480,32,"")
ClearScreen(0)
FlipBuffers()
Repeat
ClearScreen(0)
StartDrawing(ScreenOutput())
Box(300,300,40,55,RGB(0,0,255))
c.l = c.l + 1
cx.l = Cos(c / 10)*60 + 100
cy.L = Sin(c / 10)*60 + 100
Circle(cx,cy,20,RGB(0,0,255))
DrawText(10,10,Str(fps()))
StopDrawing()
  ExamineMouse()
eclairage(MouseX(),MouseY(),0,200,RGB(Sin(h)*255,Cos(h)*255,Sin(h2)*255))
h = h + 10
h2 = h2 + 20
eclairage(400,400,h,200,255)
eclairage(100,400,h2,300,32452)
eclairage(300,150,h2,300,45528)
FlipBuffers()
ExamineKeyboard()
Event = KeyboardPushed(#PB_Key_Escape)
Until  Event
End
:wink:
Dernière modification par Mytic le mer. 01/août/2007 19:44, modifié 1 fois.
Avatar de l’utilisateur
Polux
Messages : 440
Inscription : mer. 21/janv./2004 11:17
Localisation : france
Contact :

Message par Polux »

Mytic a écrit : Tu pourrais m’éclairé un peur sur cette émulation directX sur VISTA ? (si c’est pas trop demander)
:wink:
et bien en fait, Vista embarque la version 10 de directX qui n'est plus entièrement rétrocompatible avec les plus anciennes ( ce qui permet à crosoft d'avoir un code repris de zéro, beaucoup plus propre ).
En fait, elle reste bien sur compatible avec DirectX9.0c mais comme tu peux le voir, Purebasic utilise la couche Directdraw de directx7 pour les sprites et les buffers. Cette couche n'existe plus avec la couche directx9 de vista ( Plus de directdraw, tout passe par Direct3D ).
Donc les commandes sont "émulées" pour être comprises par DX10 et s'ensuit une lenteur implaccable ( mon moteur tournant à 60fps sur un pc XP, peut tourner à 10-25 sur le même sous Vista.. et pourtant j'ai optimisé le truc )...

Il y aurait bien une solution, une couche DX9 à la place de DX7 dans purebasic... J'ai testé certains codes de substitution qui fonctionnaient plus ou moins bien ( Dreammotion semble s'en tirer le mieux ) mais mes developpement sont tellement avancés ( j'ai fini two ce soir ) que je ne pouvais pas me permettre de re-modeler le tout...

De plus, mon petit doigt me dit que Fred est en train d'inclure cette fameuse couche à une prochaine version de purebasic... chut... je n'ai rien dit.... :wink:
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Merci… <Plux> de m’avoir éclairé :D , alors je garde mon XP , et dire que j'allai formater mon DD pour installer vista 8O
Avatar de l’utilisateur
Polux
Messages : 440
Inscription : mer. 21/janv./2004 11:17
Localisation : france
Contact :

Message par Polux »

j'ai fait pareil. pour l'instant je reste sous xp ;)
Répondre