Page 1 sur 2

DC - Quand le temps passe

Publié : dim. 12/juil./2009 17:23
par Thyphoon
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
ImageImage
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
Edit: Nouveau Code le Lundi 13 Juillet a 9h09
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 de

    Code : Tout sélectionner

    RealTimePerImage/2
    mais j'y arrive pas :(
    * 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.
Dimanche 12 Juillet a 22h44
  • *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
Mais il me reste quelques problèmes que je n'arrive pas (pour l'instant a corriger)

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

Publié : dim. 12/juil./2009 18:52
par case
superbe, pas réaliste du tout niveau couleurs et course lune/soleil mais c'est joli :)

Publié : dim. 12/juil./2009 18:56
par Thyphoon
case a écrit :superbe, pas réaliste du tout niveau couleurs et course lune/soleil mais c'est joli :)
Merci ! :D Lolllllll j'essaie pas d'avoir un truc super réalise, juste beau, et pas trop groumant en puissance lolllllllll Mais Si tu as des suggestions pour améliorer ça, que ça soit coté code, coté graphique n'hésite pas :P

Publié : dim. 12/juil./2009 19:05
par case
ce qui me gène c'est la course soleil, lune, a mon avis ils devraient avoir une course plus longue plus éloignée du sol en fait :) quite a ce que l'on ne les voient pas se lever et se coucher

Publié : dim. 12/juil./2009 19:07
par Thyphoon
case a écrit :ce qui me gène c'est la course soleil, lune, a mon avis ils devraient avoir une course plus longue plus éloignée du sol en fait :) quite a ce que l'on ne les voient pas se lever et se coucher
Je pense comme toi, J'essaye d'améliorer ça mais j'avoue que j'arrive pas pour l'instant a faire exactement ce que je veux ... ;) mais je vais trouver ... (enfin j'éspère :roll: )

Publié : dim. 12/juil./2009 19:16
par zaphod
Salut,

J'ai modifié le code pour la course du soleil/lune et pour le scroll des nuages.
Je sais pas si c'est ce que tu cherches.
J'ai pas trouvé pour l'affichage des minutes.
Les modifs sont suivies de ;zaphod

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=#False

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
;#################################################################

#RealTimeForADay=90000  ;Nombre de millisecondes pour une journée

Structure LayerA
  FirstSprite.l     ;Contient le premier sprite du decor
  StartTime.i
  Day.i
  Hour.i
  Min.i
EndStructure

Global LayerA.LayerA
Global vscroll.f ;zaphod

Procedure InitBackground()
  LoadSprite(LayerA\FirstSprite,"Night Sky.png",#PB_Sprite_Texture);
  CreateSprite3D(LayerA\FirstSprite, LayerA\FirstSprite)
  LoadSprite(LayerA\FirstSprite+1,"Sunrise Sky.png",#PB_Sprite_Texture);
  CreateSprite3D(LayerA\FirstSprite+1, LayerA\FirstSprite+1)
  LoadSprite(LayerA\FirstSprite+2,"Day Sky.png",#PB_Sprite_Texture);
  CreateSprite3D(LayerA\FirstSprite+2, LayerA\FirstSprite+2)
  LoadSprite(LayerA\FirstSprite+3,"Sunset Sky.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)
EndProcedure

Procedure.s GameDate()

  ProcedureReturn "Temps écoulé :"+Str(LayerA\Day)+" jour(s). Il est "+Str(LayerA\Hour)+"h"+Str(LayerA\Min)
EndProcedure

Procedure DisplayBackground()
  Protected day.f,bck.f,SpriteA.l,SpriteB.l,fade.w,scroll.l,time.l,currenttime.l,RealTimeForOneHour.f,RealTimeForOneMin.f
  Protected tmp.f ;Une variable temporaire pour les calcul a virgule
  Protected RealTimePerImage.f; Temps de vie d'un image du décore
  Protected RealTimePerHour.f
  Protected RealTimePerMin.f
   
    If LayerA\StartTime=0
      LayerA\StartTime=ElapsedMilliseconds()
    EndIf
    currenttime=(ElapsedMilliseconds()-LayerA\StartTime)%#RealTimeForADay
    day=((ElapsedMilliseconds()-LayerA\StartTime)/#RealTimeForADay)   ; Nombre de Jour depuis le debut du jeu 
    LayerA\Day=Int(day) 
    ;Calcul de l'image a affiché
    RealTimePerImage=#RealTimeForADay/4
    tmp=currenttime/RealTimePerImage;
    SpriteA=Int(currenttime/RealTimePerImage)
    SpriteB=SpriteA+1
    If SpriteB>3
      SpriteB=0
    EndIf
    fade=(tmp-SpriteA)*255
    ;Calcule de l'heure
    RealTimePerHour=#RealTimeForADay/24
    LayerA\Hour=currenttime/RealTimePerHour
    ;Calcule des minutes
    RealTimePerMin=RealTimePerHour/60
    LayerA\Min=(currenttime-LayerA\Hour*RealTimePerHour)/RealTimePermin+30
    ;
    ;zaphod
    vscroll+0.4
    If vscroll>=799 
    vscroll=0
    EndIf
    scroll=vscroll ;(Prefs\ScreenWidth*currenttime)/10 ;/#RealTimeForADay

  ;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,-scroll,0,255-fade)
  DisplaySprite3D(LayerA\FirstSprite+SpriteB,-scroll,0,fade)
  
  DisplaySprite3D(LayerA\FirstSprite+SpriteA,Prefs\ScreenWidth-scroll,0,255-fade)
  DisplaySprite3D(LayerA\FirstSprite+SpriteB,Prefs\ScreenWidth-scroll,0,fade)
  
  Protected x.l,y.l,ch.l,cw.l,SunTime.l,sp.l
  
  SunTime=#RealTimeForADay/2
  tmp=currenttime*#PI/SunTime

  cw=(Prefs\ScreenWidth-50)/2
  ch=(Prefs\ScreenHeight-50)/2
  x=Prefs\ScreenWidth/2-Sin(tmp)*(cw)-SpriteWidth(LayerA\FirstSprite+4)/2
  y=Prefs\ScreenHeight+2*Cos(tmp)*(ch);zaphod
  If y>Prefs\ScreenHeight
    sp=LayerA\FirstSprite+5
    x=Prefs\ScreenWidth/2+Sin(tmp)*(cw)-SpriteWidth(LayerA\FirstSprite+4)/2
    y=Prefs\ScreenHeight-2*Cos(tmp)*(ch);zaphod
    Else
    sp=LayerA\FirstSprite+4
    x=Prefs\ScreenWidth/2-Sin(tmp)*(cw)-SpriteWidth(LayerA\FirstSprite+4)/2
    y=Prefs\ScreenHeight+2*Cos(tmp)*(ch);zaphod
  EndIf
  
  DisplaySprite3D(sp,x,y,255)
  

  
EndProcedure

InitBackground()

;#################################################################


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()
	ClearScreen(0);
	Delay(1)
ForEver

Publié : dim. 12/juil./2009 19:31
par Thyphoon
zaphod a écrit :Salut,

J'ai modifié le code pour la course du soleil/lune et pour le scroll des nuages.
Je sais pas si c'est ce que tu cherches.
J'ai pas trouvé pour l'affichage des minutes.
Les modifs sont suivies de ;zaphod
Merci beaucoup c'est tres sympa :D !! Et c'est certain que la course de la lune et du soleil est bien meilleur ... Je vais étudier ton code !Par contre pour l'enchainement des images je vais tenter de faire totalement différemment pour que les images correspondent vraiment a l'heure....

Publié : dim. 12/juil./2009 21:58
par Thyphoon
J'ai Edité le premier message vous pourrez télécharger le Nouveau Code
Image
  • Au programme :
    *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 apparaissent maintenant
Mais il me reste quelques problèmes que je n'arrive pas (pour l'instant a corriger)
  • *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 de

    Code : Tout sélectionner

    RealTimePerImage/2
    mais j'y arrive pas :(
    *Pour le calcul des minutes (Ligne 139 a 141) 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.Pour faire le scrolling ça m'oblige a afficher 4 images fullscreen, mais j'ai pas trouvé de meilleur solution

Publié : dim. 12/juil./2009 22:28
par Le Soldat Inconnu
les étoiles sont devant la lune :lol:

je pense que tu peux optimisé ton affichage :
Dans l'ordre :

- le fond de couleur en fonction de l'heure SANS les nuages et SANS scroll

- Les étoiles

- La lune ou le soleil sans effet de transparence

- Les nuages avec effets de transparence et de scroll

Pas plus de sprite à afficher, moins de transparence (il n'y a plus sur la lune et le soleil), mais ce sera plus réaliste, les étoiles derrière la lune, les nuages devant le soleil et la lune

Publié : lun. 13/juil./2009 2:39
par Thyphoon
pas bête je n'avais jamais pensé a séparer le fond et les nuages....
Bon les images sont d'origine du jeu et je ne voulais pas me prendre la tête avec les graphisme pour l'instant mais rien ne m'empêche d'essayer:P:.. Bon j'ai plus qu'a faire mu-muse avec photoshop...
Merci en tout cas

Publié : lun. 13/juil./2009 8:27
par Thyphoon
Voilà c'est fait ! J'ai mis a jour le premier message, et vous pouvez retelecharger l'archive avec les images et le code
Cliquez ici pour télécharger le code et les images
J'ai rajouter pas mal de commentaire dans le code, et j'ai fait un peu d'optimisation (on peut surement faire mieux), j'ai suivit aussi les conseilles du Soldat Inconnu :D. J'ai améliorer aussi le systèmes des étoiles (mais on doit pouvoir faire encore mieux)
  • * 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 de

    Code : Tout sélectionner

    RealTimePerImage/2
    mais j'y arrive pas :(
    * J'ai fait des tests avec l'alpha blending pour l'intégration des nuages mais je comme je fais ça au pifomètre 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.

Publié : lun. 13/juil./2009 22:40
par Le Soldat Inconnu
* J'ai fait des tests avec l'alpha blending pour l'intégration des nuages mais je comme je fais ça au pifomètre 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 )
touche à rien, c'est très bien comme ça
*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)
ton calcul de l'heure est faux, c'est pour ça, manquait un int

Code : Tout sélectionner

;-Calcule de l'heure
  LayerA\hour=Int(currenttime/LayerA\RealTimePerHour)
    
  ;-Calcule des minutes
  LayerA\min=(currenttime-LayerA\hour*LayerA\RealTimePerHour)/LayerA\RealTimePerMin
*Il y a surement possibilité d'optimiser tout ça donc si vous avez des suggestions n'hésitez pas.
Optimiser, une seule chose, mets des nom de variables qui veulent dire qlqchose, et pas des abréviations dans tous les sens.
Pour un petit code, ça va bien, mais pour un jeux, si tu commences à mettre des trucs du genre CW, CH, etc... tu vas vite être perdu
Hésite à mettre un nom à rallonge, l'auto-complétion des variables va ensuite t'aider à les taper vite

Publié : mar. 14/juil./2009 6:55
par Thyphoon
Le Soldat Inconnu a écrit : ton calcul de l'heure est faux, c'est pour ça, manquait un int
Aaaaaaaaaa mon sauveur !!! :D Quand je pense au temps que j 'ai passé dessus...ça me crevait les yeux !!!
Le Soldat Inconnu a écrit : Optimiser, une seule chose, mets des nom de variables qui veulent dire qlqchose, et pas des abréviations dans tous les sens.
Pour un petit code, ça va bien, mais pour un jeux, si tu commences à mettre des trucs du genre CW, CH, etc... tu vas vite être perdu
Hésite à mettre un nom à rallonge, l'auto-complétion des variables va ensuite t'aider à les taper vite
Merci pour ces précieux conseils c'est un peu ce que j'ai essayé de faire. Mon plus grand problème étant sur tout de trouver le bon nom de la variable... Dans le cas de
CW et CH ils s'agit du rayon horizont et vertical pour le passage de la lune/soleil
je devrais peut être les appeler RadiusHorizontal et RadiusVertical.

Merci beaucoup en tout cas !:D


Il me reste plus qu'un détail a régler a savoir qu'a Midi il faut que ça soit au moment ou le ciel est le plus bleu ! Alors que actuellement a 12h00 le ciel commence a passer au couleur du couché de soleil ...Il faut que j'arrive a décalé le fondu entre image d' 1/2 LayerA\RealTimePerImage Une fois ça corrigé je pense que cette partie là sera terminé !! :)

Publié : mar. 14/juil./2009 8:44
par zaphod
Salut,
pour la couleur du ciel, j'ai fait :

Code : Tout sélectionner

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=Int(tmp-SpriteA)*255  ;<<<<<<<<<<<<<<<<<<<<<ici
ca à l'air de coller ??

Publié : mar. 14/juil./2009 10:20
par Thyphoon
zaphod a écrit :Salut,
pour la couleur du ciel, j'ai fait :

Code : Tout sélectionner

  ;-Calcul du niveau de fondu de la prochaine image
  tmp=currenttime/LayerA\RealTimePerImage
  fade=Int(tmp-SpriteA)*255  ;<<<<<<<<<<<<<<<<<<<<<ici
ca à l'air de coller ??
Merci , mais ça ne marche pas.Là il n'y a plus de fondu vu qu'avec int() le fade ne varie pas ...
Et si tu regarde bien avec ton code on change d'image au moment ou le soleil est au plus haut. or on devrait être au milieu de l'affichage du ciel bleu lorsque le soleil est au plus haut.. je sais pas si je suis claire :P

Tient j'ai fait un petit dessin !! :)Image
Tient d'ailleur en faisant ce petit dessin ... je me rend compte que mon problème vient peut être du choix des couleurs de chaque dessin, et il faudrait peut être que le ciel, du couché de soleil soit plus bleu pour ralongé le jour .... C'est peut être ça la solution lollllllllll :P