Code : Tout sélectionner
; ***********************
; * Shadow of the Blitz *
; ***********************
;
; C/SDL & Blitz version :
; http://www.glop.org/software/sotb
;
; PureBasic version : Flaith 23/03/06
; http://flaith.free.fr
#WIDTH = 320
#HEIGHT = 200
#SPEED_FACTOR = 0.5
#TICK_INTERVAL = 20
Enumeration
#herbe0
#herbe1
#herbe2
#herbe3
#herbe4
#nuages0
#nuages1
#nuages2
#nuages3
#nuages4
#barriere
#montagnes
#lune
EndEnumeration
Enumeration
#Window_Main_Form
#Sky
EndEnumeration
; **********************************************
Declare CreateSky()
Declare DrawSky()
Declare DrawPlane(surface, time, scale.f, y)
Declare TimeLeft()
;-Initialise l'environnement nécessaire au fonctionnement des sprites et pour ouvrir un écran.
InitSprite()
;-Initialise l'environnement propre à la gestion du clavier.
InitKeyboard()
;-Ouvre un nouvel écran avec les caractéristiques Largeur, Hauteur et Profondeur.
Resultat = MessageRequester("Shadow Of The Blitz","Full Screen ?",#PB_MessageRequester_YesNo)
If Resultat = 6
FullScreen=1
Else
FullScreen=0
EndIf
If Fullscreen
OpenScreen(320,200,16,"Shadow Of The Blitz")
Else
OpenWindow(#Window_Main_Form, 20, 50, #WIDTH, #HEIGHT, "Shadow Of The Blitz")
OpenWindowedScreen(WindowID(#Window_Main_Form), 0, 0, #WIDTH, #HEIGHT, 0, 0, 0)
SmartWindowRefresh(0, 1)
EndIf
;-Charge en mémoire les sprites
LoadSprite(#herbe0,"gfx/herbe0.bmp");
LoadSprite(#herbe1,"gfx/herbe1.bmp");
LoadSprite(#herbe2,"gfx/herbe2.bmp");
LoadSprite(#herbe3,"gfx/herbe3.bmp");
LoadSprite(#herbe4,"gfx/herbe4.bmp");
LoadSprite(#nuages0,"gfx/nuages0.bmp");
TransparentSpriteColor(#nuages0, RGB(255,0,255))
LoadSprite(#nuages1,"gfx/nuages1.bmp");
TransparentSpriteColor(#nuages1, RGB(255,0,255))
LoadSprite(#nuages2,"gfx/nuages2.bmp");
TransparentSpriteColor(#nuages2, RGB(255,0,255))
LoadSprite(#nuages3,"gfx/nuages3.bmp");
TransparentSpriteColor(#nuages3, RGB(255,0,255))
LoadSprite(#nuages4,"gfx/nuages4.bmp");
TransparentSpriteColor(#nuages4, RGB(255,0,255))
LoadSprite(#barriere,"gfx/barriere.bmp");
TransparentSpriteColor(#barriere, RGB(255,0,255))
LoadSprite(#montagnes,"gfx/montagnes.bmp");
TransparentSpriteColor(#montagnes, RGB(255,0,255))
LoadSprite(#lune,"gfx/lune.bmp");
TransparentSpriteColor(#lune, RGB(255,0,255))
;-Créé le fond
CreateSky()
;-boucle
exitkey = 0
iScroll = 0
Repeat
DrawSky()
;ClearScreen(RGB($0D, $0D, $30))
DisplayTransparentSprite(#lune, 184, 16)
DrawPlane( #montagnes, iScroll, 1, 97)
DrawPlane( #herbe0, iScroll, 2, 170)
DrawPlane( #herbe1, iScroll, 3, 172)
DrawPlane( #herbe2, iScroll, 4, 175)
DrawPlane( #herbe3, iScroll, 5, 182)
DrawPlane( #herbe4, iScroll, 6, 189)
DrawPlane( #barriere, iScroll, 7, 179)
DrawPlane( #nuages0, iScroll, 2, 0)
DrawPlane( #nuages1, iScroll, 1, 22)
DrawPlane( #nuages2, iScroll, 1/2, 63)
DrawPlane( #nuages3, iScroll, 1/3, 82)
DrawPlane( #nuages4, iScroll, 1/4, 91)
FlipBuffers()
; pour faire en sorte que le process ne soit pas trop utilisé
; on met un delay (plus le nombre est grand moins on utilise de process)
;Delay(20) ; 20 est un bon compromis
Delay(TimeLeft())
iScroll+1
;// events
EventID = WindowEvent()
Select EventID
Case #PB_Event_CloseWindow
If WindowID=#Window_Main_Form
exitkey=1
EndIf
EndSelect
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
exitkey=1
EndIf
Until exitkey = 1
End
;-Création du ciel
Procedure CreateSky()
If CreateImage(#Sky,#WIDTH,#HEIGHT)
StartDrawing(ImageOutput(#Sky))
x = 0
w = #WIDTH
y = 0
h = 76
Box(x,y,w,h,RGB(99, 113, 132))
y + h
h = 27
Box(x,y,w,h,RGB(115, 113, 132))
y + h
h = 14
Box(x,y,w,h,RGB(132, 113, 132))
y + h
h = 10
Box(x,y,w,h,RGB(148, 113, 132))
y + h
h = 8
Box(x,y,w,h,RGB(165, 113, 132))
y + h
h = 7
Box(x,y,w,h,RGB(181, 113, 132))
y + h
h = 6
Box(x,y,w,h,RGB(198, 113, 132))
y + h
h = 6
Box(x,y,w,h,RGB(214, 113, 132))
y + h
h = 4
Box(x,y,w,h,RGB(231, 113, 132))
y + h
h = 6
Box(x,y,w,h,RGB(247, 113, 132))
StopDrawing()
Else
MessageRequester("Error","Cannot create image")
EndIf
EndProcedure
;-Affichage du ciel
Procedure DrawSky()
StartDrawing(ScreenOutput())
DrawImage(ImageID(#Sky), 0, 0)
StopDrawing()
EndProcedure
;-Affichage d'un sprite
Procedure DrawPlane(surface, time, scale.f, y)
offset.l
tmp = (time * scale * #SPEED_FACTOR)
offset = tmp % #WIDTH
DisplayTransparentSprite( surface, offset - #WIDTH, y )
DisplayTransparentSprite( surface, offset, y )
EndProcedure
Procedure.l TimeLeft()
next_time = 0
now = 0
now = ElapsedMilliseconds()
If next_time <= now
next_time = now + #TICK_INTERVAL
;ProcedureReturn(0)
EndIf
ProcedureReturn(next_time - now)
EndProcedure