DC - Quand le temps passe
Publié : dim. 12/juil./2009 17:23
Comme je vous en ai fait part dans mon sujet sur DarkCastle
J'ai recommencé une fois de plus a faire un clone de Dark Castle.
Cette fois si je vais y aller doucement, mais surement, étape part étape. Et pour m'obliger a faire ça bien je vous montrerais mes avancé étape part étape.
Pour commencer j'ai travailler sur la base du temps du jeu....
Et voilà ce que ça donne


Dans le fond du jeu s'anime le jour, la nuit, le soleil, la lune.Pour les test j'ai accélérer un peu plus le temps. si vous désirez changer cela rien de plus facile ça se passe a la ligne 123
Edit: Nouveau Code le Lundi 13 Juillet a 9h09
Cliquez ici pour télécharger le code et les images
Voilà, n'hésitez pas de vos commentaires, suggestions ou autre !!
Et Voici le code
J'ai recommencé une fois de plus a faire un clone de Dark Castle.
Cette fois si je vais y aller doucement, mais surement, étape part étape. Et pour m'obliger a faire ça bien je vous montrerais mes avancé étape part étape.
Pour commencer j'ai travailler sur la base du temps du jeu....
Et voilà ce que ça donne


Dans le fond du jeu s'anime le jour, la nuit, le soleil, la lune.Pour les test j'ai accélérer un peu plus le temps. si vous désirez changer cela rien de plus facile ça se passe a la ligne 123
Code : Tout sélectionner
LayerA\RealTimeForADay=90000 ;Nombre de millisecondes pour une journée
Cliquez ici pour télécharger le code et les images
- * Changement en profondeur sur la façon dont les nuages et le ciel change ! Merci au Soldat Inconnu
*Il y a un décalage entre l'affichage du décore et l'heure. Ex: A midi le couché de soleil commence déjà. Il faudrait décallé l'affichage du décors demais j'y arrive pasCode : Tout sélectionner
RealTimePerImage/2
* J'ai fait des tests avec l'alpha blending pour l'intégration des nuages mais je comme je fais ça au pifometre car j'ai pas trop compris comment ça marchait et bien j'ai rien eu de concluant. Vous pouvez jouer avec (ligne 219 et 223 )
*Pour le calcul des minutes (Ligne 174) je suis obligé de rajouté un +30 et je sais pas pourquoi ... si quelqu'un a une idée (Comprends toujours pas pourquoi)
*Il y a surement possibilité d'optimiser tout ça donc si vous avez des suggestions n'hésitez pas.
- *Le placement du soleil et de la lune est maintenant bon. Merci zaphod. Tu m'a trouvé une solution que j'ai légèrement optimisé
*La nuit il y a des étoiles qui apparaisse maintenant
Voilà, n'hésitez pas de vos commentaires, suggestions ou autre !!
Et Voici le code
Code : Tout sélectionner
;****************************************************************
; Program: DarkCastle
; Author: Thyphoon (Yann LEBRUN)
; Date: Dimanche 12 Juillet 2009
; Version: V0.2
;****************************************************************
#Version="0.01"
#AppName="DarkCastle"+#Version
EnableExplicit
Structure Prefs
ScreenWidth.l
ScreenHeight.l
FullScreen.b
Log.b
EndStructure
Global Prefs.Prefs
Prefs\ScreenWidth.l=800
Prefs\ScreenHeight.l=600
Prefs\FullScreen.b=#False
Prefs\Log=#True
Procedure DebugLog(txt.s)
Debug "Log:"+txt
If Prefs\Log=#True
If FindString(LCase(txt),"error",1)
MessageRequester("Error", txt, 0)
EndIf
If OpenFile(0, "Log.txt") ; Ouvre un fichier existant ou en crée un nouveau s'il n'existait pas
FileSeek(0, Lof(0)) ; Place le pointeur à la fin du fichier en utilisant le résultat de Lof()
WriteStringN(0, FormatDate("%yyyy/%mm%dd %hh:%ii:%ss", Date())+" "+txt)
CloseFile(0)
EndIf
EndIf
EndProcedure
;On initialise
If InitSprite()=0
DebugLog("Error:Can't Initialize DirectX Sprite")
End
EndIf
If InitKeyboard()=0
DebugLog("Error:Can't Initialize DirectX input")
End
EndIf
If InitSprite3D()=0
DebugLog("Error:Can't Initialize DirectX 3D")
EndIf
UsePNGImageDecoder()
Select Prefs\FullScreen
Case #True ; Ouverture en plein ecran
If OpenScreen(Prefs\ScreenWidth, Prefs\ScreenHeight,32,#AppName)
DebugLog("Screen is open "+Str(Prefs\ScreenWidth)+"x"+Str(Prefs\ScreenHeight)+" 32bits")
Else
DebugLog("Error:Can't open Screen with "+Str(Prefs\ScreenWidth)+"x"+Str(Prefs\ScreenHeight)+" 32bits")
EndIf
Case #False ; Ouverture dans une Fenêtre
#W_Screen=0
If OpenWindow(#W_Screen, 0, 0, Prefs\ScreenWidth, Prefs\ScreenHeight, #AppName, #PB_Window_ScreenCentered) And OpenWindowedScreen(WindowID(#W_Screen), 0, 0, Prefs\ScreenWidth, Prefs\ScreenHeight, 1, 0, 0)
DebugLog("Window is open "+Str(Prefs\ScreenWidth)+"x"+Str(Prefs\ScreenHeight))
Else
DebugLog("Error:Can't open Window with "+Str(Prefs\ScreenWidth)+"x"+Str(Prefs\ScreenHeight))
EndIf
Case 3
#W_Screen=0
If OpenWindow(#W_Screen, 0, 0, Prefs\ScreenWidth, Prefs\ScreenHeight, #AppName, #PB_Window_ScreenCentered|#PB_Window_BorderLess ) And OpenWindowedScreen(WindowID(#W_Screen), 0, 0, Prefs\ScreenWidth, Prefs\ScreenHeight, 1, 0, 0)
DebugLog("Window BorderLess is open "+Str(Prefs\ScreenWidth)+"x"+Str(Prefs\ScreenHeight))
Else
DebugLog("Error:Can't open Window BorderLess with "+Str(Prefs\ScreenWidth)+"x"+Str(Prefs\ScreenHeight))
EndIf
EndSelect
;#################################################################
;# Layer A
;#################################################################
Structure star
x.l
y.l
size.l
EndStructure
Structure LayerA
FirstSprite.l ;Contient le premier sprite du decor
StartTime.l
Day.l
Hour.l
Min.l
star.star[100]
RealTimeForADay.l
RealTimePerImage.l
RealTimePerHour.l
RealTimePerMin.l
EndStructure
Global LayerA.LayerA
Procedure InitBackground()
Protected z.l
LoadSprite(LayerA\FirstSprite,"night.png",#PB_Sprite_Texture);
CreateSprite3D(LayerA\FirstSprite, LayerA\FirstSprite)
LoadSprite(LayerA\FirstSprite+1,"sunrise.png",#PB_Sprite_Texture);
CreateSprite3D(LayerA\FirstSprite+1, LayerA\FirstSprite+1)
LoadSprite(LayerA\FirstSprite+2,"day.png",#PB_Sprite_Texture);
CreateSprite3D(LayerA\FirstSprite+2, LayerA\FirstSprite+2)
LoadSprite(LayerA\FirstSprite+3,"sunset.png",#PB_Sprite_Texture);
CreateSprite3D(LayerA\FirstSprite+3, LayerA\FirstSprite+3)
LoadSprite(LayerA\FirstSprite+4,"sun.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
CreateSprite3D(LayerA\FirstSprite+4, LayerA\FirstSprite+4)
LoadSprite(LayerA\FirstSprite+5,"moon.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
CreateSprite3D(LayerA\FirstSprite+5, LayerA\FirstSprite+5)
LoadSprite(LayerA\FirstSprite+6,"stars.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
CreateSprite3D(LayerA\FirstSprite+6, LayerA\FirstSprite+6)
LoadSprite(LayerA\FirstSprite+7,"clouds.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
CreateSprite3D(LayerA\FirstSprite+7, LayerA\FirstSprite+7)
LayerA\RealTimeForADay=90000 ;Nombre de millisecondes pour une journée
LayerA\RealTimePerImage=LayerA\RealTimeForADay>>2 ; Temps de vie d'un image du décore; Optimisation >>2 =/4
LayerA\RealTimePerHour=LayerA\RealTimeForADay/24 ; Temps réelle d'une heure dans le jeu ;Optimisation >>4 = /24
LayerA\RealTimePerMin=LayerA\RealTimePerHour/60 ;Temps réelle d'une minute dans le jeu
EndProcedure
Procedure.s GameDate()
ProcedureReturn "Temps écoulé :"+Str(LayerA\Day)+" jour(s). Il est "+Str(LayerA\Hour)+"h"+Str(LayerA\Min)
EndProcedure
#D3DBLEND_ZERO = 1
#D3DBLEND_ONE = 2
#D3DBLEND_SRCCOLOR = 3
#D3DBLEND_INVSRCCOLOR = 4
#D3DBLEND_SRCALPHA = 5
#D3DBLEND_INVSRCALPHA = 6
#D3DBLEND_DESTALPHA = 7
#D3DBLEND_INVDESTALPHA = 8
#D3DBLEND_DESTCOLOR = 9
#D3DBLEND_INVDESTCOLOR = 10
#D3DBLEND_SRCALPHASAT = 11
#D3DBLEND_BOTHSRCALPHA = 12
#D3DBLEND_BOTHINVSRCALPHA = 13
Procedure DisplayBackground()
Protected SpriteA.l,SpriteB.l,fade.w,scroll.l,time.l,currenttime.l
Protected tmp.f ;Une variable temporaire pour les calcul a virgule
If LayerA\StartTime=0
LayerA\StartTime=ElapsedMilliseconds()
EndIf
currenttime=(ElapsedMilliseconds()-LayerA\StartTime)%LayerA\RealTimeForADay
LayerA\Day=Int((ElapsedMilliseconds()-LayerA\StartTime)/LayerA\RealTimeForADay) ; Nombre de Jour depuis le debut du jeu
;- Calcul de l'image a affiché
SpriteA=Int(currenttime/LayerA\RealTimePerImage)
SpriteB=SpriteA+1
If SpriteB>3
SpriteB=0
EndIf
;-Calcul du niveau de fondu de la prochaine image
tmp=currenttime/LayerA\RealTimePerImage
fade=(tmp-SpriteA)*255
;-Calcule de l'heure
LayerA\hour=Int(currenttime/LayerA\RealTimePerHour)
;-Calcule des minutes
LayerA\min=(currenttime-LayerA\hour*LayerA\RealTimePerHour)/LayerA\RealTimePerMin;Merci Le Soldat Inconnu :)
;Je redimmensionne en fonction de l'écran
ZoomSprite3D(LayerA\FirstSprite+SpriteA, Prefs\ScreenWidth, Prefs\ScreenHeight)
ZoomSprite3D(LayerA\FirstSprite+SpriteB, Prefs\ScreenWidth, Prefs\ScreenHeight)
;-Affichage du fond
DisplaySprite3D(LayerA\FirstSprite+SpriteA,0,0,255-fade)
DisplaySprite3D(LayerA\FirstSprite+SpriteB,0,0,fade)
;Affichage des Astres
Protected x.l,y.l,ch.l,cw.l,sp.l,fadeb.l,stars.b
tmp=currenttime*#PI/(LayerA\RealTimeForADay/2)
cw=(Prefs\ScreenWidth-50)/2 ;Largeur de la revolution des astres
ch=Prefs\ScreenHeight-100 ;Hauteur de la revolution des astres
y=Prefs\ScreenHeight+2*Cos(tmp)*(ch) ;calcul de la position vertical de l'Astre
; La LUNE
If y>Prefs\ScreenHeight
sp=LayerA\FirstSprite+5
x=Prefs\ScreenWidth/2+Sin(tmp)*(cw)-SpriteWidth(LayerA\FirstSprite+4)/2
y=Prefs\ScreenHeight-Cos(tmp)*(ch)
fadeb=255;255-(y*255/Prefs\ScreenHeight)
stars=#True ; On affiche les étoiles
; LE SOLEIL
Else
stars=#False ; Pas d'étoiles en plein jour
fadeb=255;
sp=LayerA\FirstSprite+4
x=Prefs\ScreenWidth/2-Sin(tmp)*(cw)-SpriteWidth(LayerA\FirstSprite+4)/2
y=Prefs\ScreenHeight+Cos(tmp)*(ch)
EndIf
;-Affichage des Etoiles
Protected z.l
If stars=#True
DisplaySprite3D(LayerA\FirstSprite+6,0,0,Cos(tmp)*155+Random(100))
EndIf
DisplaySprite3D(sp,x,y,fadeb)
;-Affichage des nuages
scroll=(Prefs\ScreenWidth*currenttime)/LayerA\RealTimeForADay; Calcul du scrolling
;Sprite3DBlendingMode(5, 9)
ZoomSprite3D(LayerA\FirstSprite+7, Prefs\ScreenWidth, Prefs\ScreenHeight)
DisplaySprite3D(LayerA\FirstSprite+7,-scroll,0,255)
DisplaySprite3D(LayerA\FirstSprite+7,Prefs\ScreenWidth-scroll,0,255)
;Sprite3DBlendingMode(#D3DBLEND_SRCALPHA, #D3DBLEND_INVSRCALPHA)
EndProcedure
InitBackground()
;#################################################################
Debug "coucou"
Define Event.l
Define Second.l,fps.f,Frame_Counter.l ;Pour le FPS
;Boucle Principal
Repeat
;Si nous somme dans une fenêtre il faut traiter tout les elements
If Prefs\FullScreen=#False
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
Start3D()
DisplayBackground()
Stop3D()
;#####
;-FPS
;#####
If Second < ElapsedMilliseconds()
Second = ElapsedMilliseconds()+1000
fps = Frame_Counter
Frame_Counter = 0
Else
Frame_Counter + 1
EndIf
StartDrawing(ScreenOutput())
DrawText(16,16,"FPS : "+Str(fps)+" "+GameDate())
;Box(0,Prefs\ScreenHeight-150,Prefs\ScreenWidth,150,#Black)
StopDrawing()
FlipBuffers(#PB_Screen_NoSynchronization)
Delay(1)
ForEver