Voici un code avec reprise du jeu automatique après 3 secondes. A toi de voir pour améliorer
Code : Tout sélectionner
;***************************************************************
;******************** INVADERS ******************************
;Code par Jean-Bernard 2016
;***************************************************************
;--- Initilisation :
EnableExplicit
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseOGGSoundDecoder()
If InitSprite()=0 Or InitKeyboard()=0 Or InitSound()=0
MessageRequester("Erreur", "Impossible d'initialiser le jeux ")
End
EndIf
;--- Les Constantes :
Enumeration Windows
#Main_Window
EndEnumeration
Enumeration Game
#Etoile0
#Etoile1
#BackGround
#Titre
#Music
#Text_PressBar
#TexteSCore
#ValScore
#TexteMunitions
#ValMunitions
#Ship
#Laser
#SoundTir
#SoundExplosion
#Invader
#TextGameOver
#TextYouWin
EndEnumeration
;--- Déclaration des procedures:
;--- Procedure pour le dessin des 2 étoiles
Declare CreationEtoiles()
;---;--- Initialisation des paramètres de départ des étoiles
Declare Initialisation()
;--- Deplacement des étoiles
Declare Deplacement()
;---Dessin pour les textes: press bar , le score , les munitions
Declare Affiche_Text()
;---Dessin pour les sprites Score et Vies
Declare SpriteVariables(ValeurScore.i,ValeurMunitions.i)
;--Structure pour les infos des étoiles, du vaisseau , des invaders et des tirs lasers
Structure NewSprite
Sprite.i
PosX.i
PosY.i
Vitesse.i
Id.b
Life.i
Total.i
EndStructure
;--- Gestion des étoiles
;---Nombre d'étoiles
#MaxEtoiles= 99
;---Création d'un tableau pour les étoiles du scrolling
Global Dim etoiles.NewSprite(#MaxEtoiles)
;---Gestion du vaisseau
Global Ship.NewSprite
;---Gestion des tirs du vaisseau
Global NewList Shoot.NewSprite(),gShootTime,gShootReady=#True
;--- Gestion des invaders
Global NewList Invader.NewSprite(),gDirection.i=1,gRow,gCol
;--- Variables globales diverses
Global Folder.s="Assets/"
Global gEvent,gWidth=800,gHeight=600,gI,gFont,gFont1,gTimeElapsed=ElapsedMilliseconds(),TextOn.b=#False,gScore=0,gMunitions=10
;---Variable pour lancer le jeux quand on appuie sur la touche Space Bar
Global DebutJeu.b = #False
;---Variable qui affiche Game over
Global GameOver.b= #False
;---Variable qui affiche You Win
Global YouWin.b= #False
;---Chargement de la police pour le texte PressSpaceBar
gFont = LoadFont(0, "Arial", 30, #PB_Font_Bold )
;---Chargement de la police pour le texte du score et le texte des muntions
gFont1 = LoadFont(1, "Arial", 20, #PB_Font_Bold )
;---Création de la surface du jeu
OpenWindow(#Main_Window,0,0,gWidth,gHeight,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Window),0,0,gWidth,gHeight)
SetWindowTitle(#Main_Window,"INVADERS "+ " Touche CTRL Gauche pour le tir du vaisseau")
;--- Chargement des Assets du jeux
;---Chargement des images :
;--- Image du background
LoadSprite(#BackGround,Folder + "BackG.jpg")
;--- image du logo du jeux
LoadSprite(#Titre,Folder + "Logo.png",#PB_Sprite_AlphaBlending)
;---Image du vaisseau
LoadSprite(#Ship,Folder + "Ship.png",#PB_Sprite_AlphaBlending)
;---Image du laser pour le tir du vaisseau
LoadSprite(#Laser,Folder + "laser.png",#PB_Sprite_AlphaBlending)
;---Image des Invaders
LoadSprite(#Invader,Folder + "Ufo.png",#PB_Sprite_AlphaBlending)
;---Image du texte gameover
LoadSprite(#TextGameOver,Folder + "Game.png",#PB_Sprite_AlphaBlending)
;---Image du texte You win
LoadSprite(#TextYouWin,Folder + "You.png",#PB_Sprite_AlphaBlending)
;---Chargement des sons :
;---Chargement de la musique
LoadSound(#Music,Folder +"Music.ogg",#PB_Sound_Streaming)
;---Chargement du son du laser pour le tir du vaisseau
LoadSound(#SoundTir,Folder+"Tir.Wav")
;---Chargement du son de l'explosion quand on detruit un invaders
LoadSound(#SoundExplosion,Folder+"Boum.Wav")
Procedure InitGame()
;--- Création du vaisseau
Ship\PosX=350
Ship\PosY=500
gMunitions=10
;--- Création des invaders sur 3 rangées et 5 colonnes soit au total 15 invaders
ClearList(Invader())
For gRow = 1 To 3
For gCol =1 To 5
AddElement(Invader())
With Invader()
\Sprite = CopySprite(#Invader,#PB_Any)
\PosX=gCol *120
\PosY= gRow*60
\Life=5
\Total = 15
EndWith
Next
Next
EndProcedure
InitGame()
;---Affichage des procedures :
CreationEtoiles()
Initialisation()
Affiche_Text()
SpriteVariables(gScore,gMunitions)
;--- On joue la musique
PlaySound(#Music)
;---Boucle principale du jeux
Repeat
Repeat
gEvent=WindowEvent()
Select gEvent
Case #PB_Event_CloseWindow
End
EndSelect
Until gEvent=0
;--- Partie 2D
ClearScreen(RGB(0, 0, 0))
;--- On affichel le background
DisplaySprite(#BackGround,0,0)
;--- Deplacement des étoiles pour le scrolling
Deplacement()
;---Si le jeux n'as pas commencé
If DebutJeu = #False
;--- On affiche le titre du jeux
DisplayTransparentSprite(#Titre,95,210)
;--On fait clignoter le texte "Press SpaceBar"
If TextOn
DisplayTransparentSprite(#Text_PressBar, 230, 480)
EndIf
If (ElapsedMilliseconds()-gTimeElapsed)>500
If TextOn
TextOn=#False
Else
TextOn=#True
EndIf
gTimeElapsed=ElapsedMilliseconds()
EndIf
EndIf
ExamineKeyboard()
;--- Si on presse la touche Space bar on coupe la musique et on lance le jeu
If KeyboardPushed(#PB_Key_Space)
StopSound(#Music)
DebutJeu = #True
EndIf
;--- Début du jeu
If DebutJeu = #True
;--- Affichage des textes Score et munitions et leur variables
DisplayTransparentSprite(#TexteScore, 20, 10)
DisplayTransparentSprite(#ValScore, 140, 10)
DisplayTransparentSprite(#TexteMunitions, 550, 10)
DisplayTransparentSprite(#ValMunitions, 700, 10)
;--- Affichage du vaisseau
DisplayTransparentSprite(#Ship,Ship\Posx,Ship\Posy)
;---Affichage des invaders
ForEach Invader()
If gDirection<>0
Invader()\PosX+1 * gDirection
If Invader()\PosX= 0 Or Invader()\PosX>ScreenWidth()-SpriteWidth(Invader()\Sprite)
gDirection *-1
Invader()\PosX+1*gDirection
PushListPosition(Invader())
ForEach Invader()
Invader()\Posy+ 20
Next
PopListPosition(Invader())
EndIf
EndIf
DisplayTransparentSprite(Invader()\Sprite,Invader()\PosX,Invader()\PosY)
Next
;---Déplacement du vaisseau avec les touches fleches droite ou gauche
;---à Gauche
If KeyboardPushed(#PB_Key_Left) And Ship\Posx>0
ship\Posx-3
EndIf
If KeyboardPushed(#PB_Key_Right) And Ship\Posx <ScreenWidth() -SpriteWidth(#Ship)
Ship\Posx + 3
EndIf
;---Affichage des tirs du vaisseau
ForEach Shoot()
Shoot()\PosY-2
If Shoot()\PosY<0
FreeSprite(Shoot()\Sprite)
DeleteElement(Shoot(),#True)
Else
DisplayTransparentSprite(Shoot()\Sprite,Shoot()\PosX,Shoot()\PosY)
EndIf
Next
;---Tir du laser avec la touche Control(Ctrl)
If KeyboardReleased(#PB_Key_LeftControl) And gShootReady =#True
PlaySound(#SoundTir)
SoundVolume(#SoundTir,30)
AddElement(Shoot())
Shoot()\Sprite=CopySprite(#Laser,#PB_Any)
Shoot()\PosX= Ship\PosX+SpriteWidth(#Ship)/2-SpriteWidth(Shoot()\Sprite)/2
Shoot()\PosY=490
gMunitions-1
gShootTime = ElapsedMilliseconds()
EndIf
If ElapsedMilliseconds() - gShootTime > 300
gShootReady=#True
Else
gShootReady=#False
EndIf
;---Il y a t'il collision entre un tir et un invader ?
ForEach Shoot()
ForEach Invader()
If ListSize(Shoot()) <>0 And ListSize(Invader())<>0
If SpriteCollision(Invader()\Sprite,Invader()\PosX,Invader()\PosY,Shoot()\Sprite,Shoot()\PosX,Shoot()\PosY)
FreeSprite(Shoot()\Sprite)
DeleteElement(Shoot(),#True)
Invader()\Life-1
Invader()\Total-1
If Invader()\Life=0
FreeSprite(Invader()\Sprite)
DeleteElement(Invader(),#True)
PlaySound(#SoundExplosion)
SoundVolume(#SoundExplosion,30)
gScore +10
EndIf
EndIf
EndIf
Next
Next
;---Si on a plus de muntions on perd la partie
If gMunitions =0
gShootReady=#False
GameOver=#True
EndIf
;--- On affiche le message Game Over
If GameOver=#True
DisplayTransparentSprite(#TextGameOver,95,210)
Affiche_Text()
DisplaySprite(#TexteMunitions,550, 10)
FlipBuffers() ; pour afficher game over et les munitions
Delay(3000)
InitGame()
GameOver=#False
EndIf
EndIf
;---Si il ya plus d'invaders on gagne la partie
If ListSize(Invader()) = 0
gShootReady=#False
YouWin=#True
EndIf
If YouWin = #True
DisplayTransparentSprite(#TextYouWin,100,210)
EndIf
;--- On affiche les variables Score et Munitions
SpriteVariables(gScore,gMunitions)
FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape)
End
;--- les procédures :
;---Dessins des 2 étoiles
Procedure CreationEtoiles()
CreateSprite(#Etoile0,2,2)
CreateSprite(#Etoile1,2,2)
;---Dessin de l'étoile blanche
StartDrawing(SpriteOutput(#Etoile0))
Box(0, 0, 2, 2, $FFFFFF)
StopDrawing()
;--Dessin de l'étoile grise
StartDrawing(SpriteOutput(#Etoile1))
Box(0, 0, 2, 2, $A9A9A9)
StopDrawing()
EndProcedure
;--- Initialisation des paramètres de départ des étoiles
Procedure Initialisation()
For gI = 0 To #MaxEtoiles
With etoiles(gI)
\PosY = Random(gHeight)
\PosX = Random(gWidth,0)
\Id = Random(1)
\Vitesse = Random(8,2)
EndWith
Next
EndProcedure
;--- Deplacement des étoiles
Procedure Deplacement()
For gI = 0 To #MaxEtoiles
With etoiles(gI)
DisplaySprite(\Id,\PosX,\PosY)
\PosY + \Vitesse
If \PosY >= gWidth
\PosY - gWidth
EndIf
EndWith
Next
EndProcedure
;---Dessin pour les textes: press bar , le score , les munitions , press c
Procedure Affiche_Text()
;---Pour le texte press bar
CreateSprite(#Text_PressBar,600,100,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#Text_PressBar))
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,1090,80,RGBA(0,0,0,0))
DrawingFont(gFont)
DrawText(20,10,"Press SpaceBar",RGBA(255,255,255,255), RGBA(0,0,0,0));
StopDrawing()
;---Pour le texte score
CreateSprite(#TexteScore,180,50,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#TexteScore))
DrawingFont(gFont1)
DrawText(0,10,"Score: ",RGBA(255,255,255,255),RGBA(0,0,0,0));
StopDrawing()
;--Pour le texte munitions
CreateSprite(#TexteMunitions,450,50,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#TexteMunitions))
DrawingFont(gFont1)
DrawText(10,10,"Munitions : ",RGBA(255,255,255,255),RGBA(0,0,0,0));
StopDrawing()
EndProcedure
;---Dessin pour les sprites Score et Vies
Procedure SpriteVariables(ValeurScore.i,ValeurMunitions.i)
;--- dessin du sprite pour le score
CreateSprite(#ValScore,180,50,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#ValScore))
DrawingFont(gFont1)
DrawText(0,10,Str(valeurScore),RGBA(255,255,255,255),RGBA(0,0,0,0));
StopDrawing()
;---Dessin du sprite Munitions
CreateSprite(#ValMunitions,450,50,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#ValMunitions))
DrawingFont(gFont1)
DrawText(10,10,Str(ValeurMunitions),RGBA(255,255,255,255),RGBA(0,0,0,0));
StopDrawing()
EndProcedure