Il s'agit de flinguer les canards, et seulement les canards ! Au départ on a 10 points, et il faut arriver à 50, sans descendre en dessous de 0.
Voici le lien pour le zip : http://djes.free.fr/purebasic/minigames/ ou là : https://docs.google.com/open?id=0B5nDvK ... FlYWI3NmU5
Le source (je sais, c'est moche!). Le PBI est dans le zip
Code : Tout sélectionner
;******************************************************************************************************
;*
;* PUREBR3AKER (c)BGAMES 2005
;* Lead coder : djes@free.fr
;* Dux Minigame
;*
;* http://www.shootingcrew.com/
;* http://djes.free.fr
;*
;******************************************************************************************************
#CREATEPACKS = #False
XIncludeFile "packlib_release.pbi"
;******************************************************************************************************
;- *** CONSTANTS ***
;******************************************************************************************************
;- Sprites
Enumeration #PB_Compiler_EnumerationValue Step 1
#DUCK_GUN
#DUCK_AMMO
#DUCK_DUCK0
#DUCK_DUCK1
#DUCK_DUCK2
#DUCK_CADDIE
#DUCK_ESCARGOT
#DUCK_POULE
#DUCK_VEAU
#DUCK_DUCK0F
#DUCK_DUCK1F
#DUCK_DUCK2F
#DUCK_CADDIEF
#DUCK_ESCARGOTF
#DUCK_POULEF
#DUCK_VEAUF
EndEnumeration
;- Sprites Fonts
Enumeration #PB_Compiler_EnumerationValue Step 256
#SILVERFONT
EndEnumeration
;- Sounds
Enumeration
#M2EXPLOSION
#EXTRALIFE
#NEXTLEVELSND
#CREDITS
#CLOCK
#TOC
EndEnumeration
;******************************************************************************************************
;- *** STRUCTURES ***
;******************************************************************************************************
Structure Duck
x.f
y.l
XSpeed.f
SpriteNb.l
EndStructure
Structure DuckAmmo
x.l
y.l
EndStructure
Structure Anim
X.f
XSpeed.f
Y.f
YSpeed.f
Zoom.f
ZoomSpeed.f
CurrentSpriteNb.f
AnimSpeed.f
FirstSprite.l
LastSprite.l
CurrentFade.f
FadeSpeed.f
CurrentTime.l
Duration.l ;in frames
PauseIn.l ;before Anim start
PauseOut.l ;after Anim
EndStructure
;******************************************************************************************************
;- *** GLOBALS ***
;******************************************************************************************************
Global Dim SilverFont.l(255)
Global NewList Anims.Anim()
Global ScreenWidth = 1024
Global ScreenHeight = 768
Global ScreenDepth = 32
Global RefreshRate = 60
Global IngameMusic = #True
Global InGameSound = #True
;******************************************************************************************************
;- *** PROCEDURES ***
;******************************************************************************************************
Procedure.i RealRound(nb.f)
!cvtss2si eax, [p.v_nb]
ProcedureReturn
EndProcedure
;******************************************************************************************************
Procedure LoadMidi(Nb, file.s)
i = mciSendString_("open " + file.s + " type sequencer alias mid" + Str(Nb), 0, 0, 0)
ProcedureReturn i
EndProcedure
Procedure PlayMidi(Nb)
i = mciSendString_("play mid" + Str(Nb), 0, 0, 0)
ProcedureReturn i
EndProcedure
Procedure StopMidi(Nb)
i = mciSendString_("stop mid" + Str(Nb), 0, 0, 0)
ProcedureReturn i
EndProcedure
Procedure FreeMidi(Nb)
i = mciSendString_("close mid" + Str(Nb), 0, 0, 0)
ProcedureReturn i
EndProcedure
Procedure SetMidivolume(Nb, volume)
i = mciSendString_("set volume" + Str(Nb) + " volume " + Str(volume), 0, 0, 0)
ProcedureReturn i
EndProcedure
;******************************************************************************************************
; Draw an Animated screen centered Text
Procedure CenteredText(Text.s, PauseIn.l)
xs = 0 + ScreenWidth / 2 - ((Len(Text) - 1) * 40) / 2
ys = 0 + ScreenHeight / 2 - 19
For u = 1 To Len(Text)
AddElement(Anims())
Anims()\x = xs
Anims()\XSpeed = 0
Anims()\y = ys
Anims()\YSpeed = 2
Anims()\CurrentSpriteNb = #SILVERFONT + Asc(Mid(Text, u, 1))
Anims()\AnimSpeed = 0
Anims()\CurrentTime = - PauseIn
Anims()\Duration = 85 ;(255 / 3)
Anims()\CurrentFade = 255
Anims()\FadeSpeed = - 3
Anims()\PauseIn = 1.5 * RefreshRate
Anims()\PauseOut = 0
Anims()\Zoom = 1
Anims()\ZoomSpeed = 0
AddElement(Anims())
Anims()\x = xs
Anims()\XSpeed = 0
Anims()\y = ys
Anims()\YSpeed = - 2
Anims()\CurrentSpriteNb = #SILVERFONT + Asc(Mid(Text, u, 1))
Anims()\AnimSpeed = 0
Anims()\CurrentTime = - PauseIn
Anims()\Duration = 85 ;(255 / 3)
Anims()\CurrentFade = 255
Anims()\FadeSpeed = - 3
Anims()\PauseIn = 1.5 * RefreshRate
Anims()\PauseOut = 0
Anims()\Zoom = 1
Anims()\ZoomSpeed = 0
xs + 40
Next u
EndProcedure
Procedure TextXY(Text.s, x.l, y.l)
For u = 1 To Len(Text)
s.l = #SILVERFONT + Asc(Mid(Text, u, 1))
ZoomSprite3D(s, 64, 64)
RotateSprite3D(s, 0, 0)
DisplaySprite3D(s, x, y)
x + 32
Next u
EndProcedure
;******************************************************************************************************
;play specified sound specifying parameters
Procedure MyPlaySound(sound.l, pan.l = - 1, volume.l = - 1, frequency.l = - 1)
If InGameSound
If pan<> - 1
SoundPan(sound, pan)
EndIf
If volume<> - 1
SoundVolume(sound, volume)
EndIf
If frequency<> - 1
SoundFrequency(sound, frequency)
EndIf
PlaySound(sound, #PB_Sound_MultiChannel)
EndIf
EndProcedure
;******************************************************************************************************
Procedure GameLoading()
PackName.s = "packs/Ducks.pak"
PackCounter = 0
Media$ = ""
; Media$ = ""
PackLoadSprite3D(#DUCK_GUN, Media$ + "gfx/canon.png")
PackLoadSprite3D(#DUCK_AMMO, Media$ + "gfx/balle.png")
PackLoadSprite3D(#DUCK_DUCK0, Media$ + "gfx/canard0.png")
PackLoadSprite3D(#DUCK_DUCK1, Media$ + "gfx/canard1.png")
PackLoadSprite3D(#DUCK_DUCK2, Media$ + "gfx/canard2.png")
PackLoadSprite3D(#DUCK_CADDIE, Media$ + "gfx/caddie.png")
PackLoadSprite3D(#DUCK_ESCARGOT, Media$ + "gfx/escargot.png")
PackLoadSprite3D(#DUCK_POULE, Media$ + "gfx/poule.png")
PackLoadSprite3D(#DUCK_VEAU, Media$ + "gfx/veau.png")
PackLoadSprite3D(#DUCK_DUCK0F, Media$ + "gfx/canard0_f.png")
PackLoadSprite3D(#DUCK_DUCK1F, Media$ + "gfx/canard1_f.png")
PackLoadSprite3D(#DUCK_DUCK2F, Media$ + "gfx/canard2_f.png")
PackLoadSprite3D(#DUCK_CADDIEF, Media$ + "gfx/caddie_f.png")
PackLoadSprite3D(#DUCK_ESCARGOTF, Media$ + "gfx/escargot_f.png")
PackLoadSprite3D(#DUCK_POULEF, Media$ + "gfx/poule_f.png")
PackLoadSprite3D(#DUCK_VEAUF, Media$ + "gfx/veau_f.png")
n.l = 1
For u = Asc("A") To Asc("Z")
SilverFont(u) = n
n + 1
Next u
SilverFont(Asc("!")) = n : n + 1
SilverFont(Asc("'")) = n : n + 1
SilverFont(Asc("(")) = n : n + 1
SilverFont(Asc(")")) = n : n + 1
SilverFont(Asc(" - ")) = n : n + 1
SilverFont(Asc(".")) = n : n + 1
SilverFont(Asc("?")) = n : n + 1
SilverFont(Asc(":")) = n : n + 1
SilverFont(Asc("0")) = n : n + 1
SilverFont(Asc("1")) = n : n + 1
SilverFont(Asc("2")) = n : n + 1
SilverFont(Asc("3")) = n : n + 1
SilverFont(Asc("4")) = n : n + 1
SilverFont(Asc("5")) = n : n + 1
SilverFont(Asc("6")) = n : n + 1
SilverFont(Asc("7")) = n : n + 1
SilverFont(Asc("8")) = n : n + 1
SilverFont(Asc("9")) = n : n + 1
SilverFont(Asc(", ")) = n : n + 1
SilverFont(Asc(" ")) = n : n + 1
For u = 0 To 255
If SilverFont(u)<>0
PackLoadSprite3D(#SILVERFONT + u, "gfx/fonts/silver/silver-" + StrU(SilverFont(u), #PB_Byte) + ".png")
EndIf
Next u
ClosePack()
PackName = "packs/sounds.pak"
PackCounter = 0
PackLoadSound(#M2EXPLOSION, "sfx/m2fire.wav")
PackLoadSound(#EXTRALIFE, "sfx/HAPPYBEL.WAV")
PackLoadSound(#NEXTLEVELSND, "sfx/SOUND827.WAV")
PackLoadSound(#CLOCK, "sfx/inter.WAV")
PackLoadSound(#TOC, "sfx/bounce1.wav")
ClosePack()
EndProcedure
;******************************************************************************************************
Procedure FullScreenCheck()
If IngameMusic
StopMidi(1)
EndIf
ReleaseMouse(1)
CloseScreen()
OpenWindow(0, 0, 0, 256, 256, "Dux", #PB_Window_Minimize)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_ActivateWindow
CloseWindow(0)
OpenScreen(ScreenWidth, ScreenHeight, ScreenDepth, "Ducks")
ReleaseMouse(0)
GameLoading()
If IngameMusic
playMidi(1)
EndIf
EndProcedure
;******************************************************************************************************
;- INIT
;******************************************************************************************************
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseJPEGImageDecoder()
UseOGGSoundDecoder()
If (InitSprite() And InitSprite3D() And InitKeyboard() And InitMouse() And InitSound()) = #False
End
EndIf
ScreenWidth = 1024
ScreenHeight = 768
ScreenDepth = 32
RefreshRate = 60
IngameMusic = #True
Quit = #False
OpenScreen(ScreenWidth, ScreenHeight, ScreenDepth, "Dux", #PB_Screen_WaitSynchronization, RefreshRate)
Sprite3DQuality(1)
;******************************************************************************************************
;- *** MAIN ***
;******************************************************************************************************
START_DUX:
Global NewList Ducks.Duck()
Global NewList DucksAmmos.DuckAmmo()
Global DuckScore = 10
SpeedUp.f = 0
GameLoading()
If IngameMusic
LoadMidi(1, "sfx\ballgame.mid")
SetMidivolume(1, 150)
PlayMidi(1) ; le joue
EndIf
ClearList(Anims())
CenteredText("DUX !", 2 * RefreshRate)
DuckWin = #False
Repeat
If Not IsScreenActive()
FullScreenCheck()
Else
Gosub INPUTS
Gosub DUX_LOGIC
EndIf
Gosub DRAWING
FlipBuffers() ;vbl synchro ON : better
FrameCounter + 1
Until Quit = #True Or ((DuckScore >= 50 Or DuckScore <= 0) And ListSize(Anims()) = 0)
If IngameMusic
StopMidi(1)
FreeMidi(1)
EndIf
ClearList(Anims())
End
;******************************************************************************************************
;- *** SUBROUTINES ***
;******************************************************************************************************
;-DRAWING
DRAWING:
ClearScreen($550000)
StartDrawing(ScreenOutput())
For u = 0 To 512 Step 32
LineXY(u, 64, 1023 - u, 64, (Int(150.1 + u/10 * Sin( FrameCounter / 20 )) & $FF ) * $100 )
LineXY(u, 160, 1023 - u, 160, (Int(150.1 + u/10 * Sin( FrameCounter / 25 )) & $FF ) * $10000 )
LineXY(u, 256, 1023 - u, 256, (Int(150.1 + u/10 * Sin( FrameCounter / 15 )) & $FF ))
Next u
StopDrawing()
If Start3D()
Gosub ANIMATIONS_DISPLAY
ForEach Ducks()
RotateSprite3D(Ducks()\SpriteNb, 10 * Sin(Ducks()\x / 8), 0)
DisplaySprite3D(Ducks()\SpriteNb, Ducks()\x - SpriteWidth(#DUCK_DUCK0) / 2, Ducks()\y - SpriteHeight(#DUCK_DUCK0) / 2)
Next
Sprite3DQuality(0)
ForEach DucksAmmos()
DisplaySprite3D(#DUCK_AMMO, DucksAmmos()\x - SpriteWidth(#DUCK_AMMO) / 2, DucksAmmos()\y - SpriteHeight(#DUCK_AMMO) / 2)
Next
DisplaySprite3D(#DUCK_GUN, XMouse - SpriteWidth(#DUCK_GUN) / 2, YMouse)
Sprite3DQuality(1)
If DuckScore >= 0
TextXY(Str(DuckScore), 900 - Len(Str(DuckScore)) * 32 / 2, 768 - 100)
EndIf
Stop3D()
EndIf
Return
;******************************************************************************************************
;-DUX LOGIC
DUX_LOGIC:
ForEach Ducks()
Select Ducks()\y
Case 32
Ducks()\x = Ducks()\x + Ducks()\XSpeed + SpeedUp
If Ducks()\x >= ScreenWidth + SpriteWidth(#DUCK_DUCK0) / 2
Ducks()\y = 128
Ducks()\XSpeed + 1
If Ducks()\SpriteNb = #DUCK_DUCK0F
Ducks()\SpriteNb = #DUCK_DUCK1
Else
Ducks()\SpriteNb - 7 ;flip vertically
EndIf
EndIf
Case 128
Ducks()\x = Ducks()\x - Ducks()\XSpeed - SpeedUp
If Ducks()\x <= - SpriteWidth(Ducks()\SpriteNb) / 2
Ducks()\y = 224
Ducks()\XSpeed + 1
If Ducks()\SpriteNb = #DUCK_DUCK1
Ducks()\SpriteNb = #DUCK_DUCK2F
Else
Ducks()\SpriteNb + 7 ;flip vertically
EndIf
EndIf
Case 224
Ducks()\x = Ducks()\x + Ducks()\XSpeed + SpeedUp
If Ducks()\x >= ScreenWidth + SpriteWidth(#DUCK_DUCK0) / 2
If Ducks()\SpriteNb = #DUCK_DUCK2F
If DuckScore > 0
DuckScore - 3
MyPlaySound(#CLOCK, - 1, - 1, 500 )
If DuckScore <= 0
CenteredText("GAME OVER !", 2 * RefreshRate)
ClearList(DucksAmmos())
EndIf
;Beep_(500, 1)
EndIf
EndIf
DeleteElement(Ducks(), 1)
EndIf
EndSelect
Next
;new Duck
If FrameCounter%RefreshRate = 0
AddElement(Ducks())
Ducks()\x = - SpriteWidth(#DUCK_DUCK0F)
Ducks()\y = 32
Ducks()\XSpeed = 1
If Random(10)<5
Ducks()\SpriteNb = #DUCK_DUCK0F
Else
Ducks()\SpriteNb = #DUCK_CADDIEF + Random(3)
EndIf
EndIf
;every 30 secs, SpeedUp
If FrameCounter%(RefreshRate * 30) = 0
SpeedUp + 0.1
EndIf
If DuckScore > 0 And DuckScore < 50
;draw ammos, and compute collisions
ForEach DucksAmmos()
DucksAmmos()\y - 10
If DucksAmmos()\y <= - 10
DeleteElement(DucksAmmos())
Else
ForEach Ducks()
If DucksAmmos()\x >= Ducks()\x - 16 And DucksAmmos()\x <= Ducks()\x + 16 And DucksAmmos()\y >= Ducks()\y - 16 And DucksAmmos()\y <= Ducks()\y + 16
Select Ducks()\SpriteNb
Case #DUCK_DUCK0, #DUCK_DUCK0F
DuckScore + 1
;Beep_(5000, 10)
MyPlaySound(#TOC, - 1, - 1, 5000 )
Case #DUCK_DUCK1, #DUCK_DUCK1F
DuckScore + 2
;Beep_(5000, 10)
MyPlaySound(#TOC, - 1, - 1, 5000 )
Case #DUCK_DUCK2, #DUCK_DUCK2F
DuckScore + 3
;Beep_(5000, 10)
MyPlaySound(#TOC, - 1, - 1, 5000 )
Case #DUCK_CADDIE, #DUCK_CADDIEF
DuckScore - 4
;Beep_(50, 30)
MyPlaySound(#TOC, - 1, - 1, 50 )
Case #DUCK_POULE, #DUCK_POULEF
DuckScore - 2
;Beep_(60, 30)
MyPlaySound(#TOC, - 1, - 1, 60 )
Case #DUCK_VEAU, #DUCK_VEAUF
DuckScore - 3
;Beep_(80, 30)
MyPlaySound(#TOC, - 1, - 1, 80 )
Case #DUCK_ESCARGOT, #DUCK_ESCARGOTF
DuckScore - 1
;Beep_(100, 30)
MyPlaySound(#TOC, - 1, - 1, 100 )
EndSelect
DeleteElement(Ducks(), 1)
DeleteElement(DucksAmmos(), 1)
Break 2
EndIf
Next
EndIf
Next
If DuckScore <= 0
CenteredText("GAME OVER !", 2 * RefreshRate)
ClearList(DucksAmmos())
EndIf
If DuckScore >= 50
MyPlaySound(#EXTRALIFE, 0, 100, 20000)
CenteredText("WELL DONE !", 2 * RefreshRate)
EndIf
EndIf
Return
;******************************************************************************************************
;-INPUTS
INPUTS:
ExamineKeyboard()
ExamineMouse()
If JoystickSwitch
joyGetPosEx_(#JOYSTICKID1, joyInfoEx.JOYINFOEX)
EndIf
If KeyboardReleased(#PB_Key_J)
JoystickSwitch = ~JoystickSwitch
EndIf
If KeyboardReleased(#PB_Key_Escape)
Quit = #True
EndIf
If KeyboardReleased(#PB_Key_S)
u = GrabSprite(#PB_Any, 0, 0, 1024, 768)
SaveSprite(u, "c:\screenshot.bmp")
EndIf
;gun, and fire
If KeyboardPushed(#PB_Key_Left)
KeyXSpeed - 1
ElseIf KeyboardPushed(#PB_Key_Right)
KeyXSpeed + 1
Else
KeyXSpeed / 2
EndIf
;Joystick or mouse control
If JoystickSwitch
If JoyXamp<>0
u = RealRound((joyInfoEx\dwXpos - (JoyXamp / 2)) / 2048) ;this little operation to optimise precision
XMouse + ((u * 2048) * 64) / JoyXamp
EndIf
Else
XMouse = XMouse + MouseDeltaX() + KeyXSpeed
;XMouse.l = MouseX()
EndIf
If XMouse<0 : XMouse = 0 : EndIf
If XMouse>1023 : XMouse = 1023 : EndIf
YMouse = 768 - SpriteHeight(#DUCK_GUN)
If mb = #True And (MouseButton(1) = 0 Or ((joyInfoEx\dwButtons&1 = 0) And JoystickSwitch))
;évite la répétition
mb = #False
EndIf
If DuckFireDelay>0
DuckFireDelay - 1
EndIf
If (MouseButton(1) Or KeyboardPushed(#PB_Key_Return) Or ((joyInfoEx\dwButtons&1) And JoystickSwitch)) And mb = #False And DuckFireDelay = 0 And DuckScore > 0
AddElement(DucksAmmos())
MyPlaySound(#M2EXPLOSION)
;Beep_(1000, 2)
DucksAmmos()\x = XMouse
DucksAmmos()\y = YMouse + 10
mb = #True
DuckFireDelay = RefreshRate / 8
EndIf
Return
;******************************************************************************************************
;- ANIMATIONS_DISPLAY
; Multi purposes (why not for explosions? maybe later ;)
ANIMATIONS_DISPLAY:
Sprite3DQuality(1)
With Anims()
; If FirstElement(Anims())<>0
; ResetList(Anims())
ForEach Anims()
If \CurrentTime<\Duration
;hint to start displaying after a while : make CurrentTime negative
If \CurrentTime<0
\CurrentTime + 1
Else
u = \CurrentSpriteNb
sw.f = \Zoom * SpriteWidth(u)
sh.f = \Zoom * SpriteHeight(u)
ZoomSprite3D(u, sw, sh)
DisplaySprite3D(u, \x - sw / 2, \y - sh / 2, \CurrentFade)
;DisplaySprite3D(u, \x - SpriteWidth(u) / 2, \y - SpriteHeight(u) / 2, \CurrentFade)
;pause before Anim?
If \PauseIn = 0
;Anim
\CurrentSpriteNb + \AnimSpeed
If \LastSprite<>\FirstSprite
;if sprite is Animated, and for a certain amount of frames, test boundaries
If \CurrentSpriteNb>\LastSprite
\CurrentSpriteNb = \FirstSprite
EndIf
EndIf
\CurrentFade + \FadeSpeed
\CurrentTime + 1
\x + \XSpeed
\y + \YSpeed
\Zoom + \ZoomSpeed
Else
\PauseIn - 1
EndIf
EndIf
Else
If \PauseOut<>0
;pause after Anim?
u = \CurrentSpriteNb
sw.f = \Zoom * SpriteWidth(u)
sh.f = \Zoom * SpriteHeight(u)
ZoomSprite3D(u, sw, sh)
DisplaySprite3D(u, \x - sw / 2, \y - sh / 2, \CurrentFade)
;DisplaySprite3D(u, \x - SpriteWidth(u) / 2, \y - SpriteHeight(u) / 2, \CurrentFade)
\PauseOut - 1
Else
;no, delete
DeleteElement(Anims())
EndIf
EndIf
; EndIf
Next
EndWith
Return