Code : Tout sélectionner
If InitSprite () = 0 Or InitKeyboard()= 0
MessageRequester ("Erreur", "Impossible d'initialiser directx",#PB_MessageRequester_Ok)
End
EndIf
;---------- Plein écran ----------
#WindowWidth = 640
#WindowHeight = 480
If OpenScreen(#WindowWidth, #WindowHeight, 32, "Starfield") = 0
MessageRequester ("Erreur", "Impossible d'ouvrir l'écran",#PB_MessageRequester_Ok)
End
EndIf
;----------------------------------
UsePNGImageDecoder()
nSprite = CatchSprite(#PB_Any, ?IMGNuages)
If nSprite = 0
MessageRequester ("Erreur", "Erreur à l'ouverture de l'image !", #PB_MessageRequester_Ok)
End
EndIf
Global SpriteWidth = SpriteWidth (nSprite)
Global SpriteHeight = SpriteHeight(nSprite)
Global Dim Hauteur.c (SpriteWidth, SpriteHeight)
Global Dim EnvMap.c (SpriteWidth, SpriteHeight)
DisplaySprite (nSprite, 0, 0)
StartDrawing (ScreenOutput ())
For X = 0 To SpriteWidth-1
For Y = 0 To SpriteHeight-1
Hauteur.c = Point (X,Y)
Hauteur(X,Y) = Red (Hauteur)
Next
Next
nX.f = 0
nY.f = 0
nZ.f = 0
diffuse = 255
ambient = 0
specular = 255
For Y = 0 To #WindowHeight - 1
For X = 0 To #WindowWidth - 1
nX = (X - (SpriteWidth / 2)) / (SpriteWidth / 2)
nY = (Y - (SpriteHeight / 2)) / (SpriteHeight / 2)
nZ=1-Sqr(nX*nX+nY*nY)
If (nZ<0)
nZ=0
EndIf
tmp = nZ * diffuse + nZ * nZ * specular
;tmp = ambient + diffuse * nZ
If tmp > 255
tmp = 255
EndIf
tmp2.c = tmp
EnvMap(X,Y) = ambient + tmp2
Next
Next
;EnableDebugger
;CallDebugger
Procedure Bump (lx.w, ly.w)
; Ajuster la source lumineuse pour qu'elles soient à l'origine
lx = lx + #WindowWidth / 2
ly = ly + #WindowHeight / 2
For Y=1 To #WindowHeight-1
For X=1 To #WindowWidth-1
; Obtenir la "pente" de la bumpmap
nX = (Hauteur(X+1,Y) - Hauteur(X-1,Y))
nY = (Hauteur (X,Y+1) - Hauteur (X, Y-1))
; Ajustement de la normale d'après la source lumineuse
nX = nX - (X-lx)
nY = nY - (Y-ly)
; On s'assure qu'On ne dépasse pas l'envmap
If nX>SpriteWidth Or nX<=0
nX=SpriteWidth
EndIf
If nY>SpriteHeight Or nY<=0
nY=SpriteHeight
EndIf
Plot (X,Y, RGB(EnvMap(nX,nY),EnvMap(nX,nY), EnvMap(nX,nY)))
Next
Next
EndProcedure
StopDrawing()
ClearScreen(0)
FlipBuffers()
ClearScreen (0)
xCentre = #WindowWidth/2
yCentre = #WindowHeight/2
angle.f = 0
Repeat
angle = angle + 0.2
ClearScreen (0)
If StartDrawing (ScreenOutput ())
Bump (xCentre + Cos (angle) * 100, yCentre + Sin (angle) * 100)
StopDrawing ()
EndIf
FlipBuffers ()
ExamineKeyboard ()
Until KeyboardPushed (#PB_Key_Escape) Or WindowEvent() = #PB_Event_CloseWindow
End
DataSection
IMGNuages: IncludeBinary "oldskull2.png"
http://bombseb.free.fr/TEMP/oldskull2.PNG
une question : je ne comprend pas sur mon athlon 3400+ (1go ram) ca marche super bien, c'est super fluide, aucun probleme
par contre sur mon athlon XP 2000+ (1go ram) ca rame à MORT, et je ne pense pas que le processeur est le principal fautif
