Galaga clone by laurent mrejen19th Apr 2006 6:34
|
---|
Summary This is a short demo to solve specific problems you meet when you want to make a shoot them up. Description This short program shows you how to make a shoot them up. Code ` This code was downloaded from The Game Creators ` It is reproduced here with full permission ` http://www.thegamecreators.com `Galag : Clone de galaga Avril 2006 `######################################################### `# Initialisation du jeu # `######################################################### `On initialise toutes les variables gosub Init_VarGlobales `On charge les objets gosub Charge_Etoile gosub Charge_Heros gosub Charge_Tir gosub Charge_Monstre gosub Charge_Musique `######################################################### `# fin de l'initialisation du jeu # `######################################################### `######################################################### `# Méthodes de gestion du menu # `######################################################### `######################################################### `# Fin de la gestion du menu # `######################################################### `######################################################### `# boucle principale # `######################################################### `On intialise la position des sprites étoiles et Héros gosub InitSprite_Etoile gosub InitSprite_Heros gosub InitSprite_Monstre `On initialise l'image courante à la valeur Ecran gosub Init_PanneauJeu loop music Musique_Jeu do gosub DeplacementEtoiles gosub GestionHeros gosub DeplaceTirHeros gosub Deplacement_Monstre sync loop end `######################################################### `# Fin de la boucle principale # `######################################################### `######################################################### `# Méthodes Gosub # `######################################################### `Méthode d'initialisation du panneau d'affichage des infos du jeu Init_PanneauJeu: set current bitmap ECRAN ink ORANGE,BLANC box Ecran_PanneauJeuX,1,Ecran_PanneauJeuX + 130-1,screen height()-1 `On va écrire les scores ink NOIR, BLANC text Ecran_PanneauJeuX +25, 75, "SCORE" text Ecran_PanneauJeuX +25, 125, "LEVEL" `On affiche les vies text Ecran_PanneauJeuX +25, 175, "VIES" for i=1 to 3 sprite Heros_Sprite+i, Ecran_PanneauJeuX +5+i*15, 200, Heros_Image scale sprite Heros_Sprite+i, 5 next i return `Méthode d'initialisation des variables globales Init_VarGlobales: `Constantes des couleurs GRIS = rgb(168,168,168) BLANC = rgb(255,255,255) ORANGE = rgb(250,100,20) NOIR = rgb(0,0,0) `Constante indiquant l'écran ECRAN=0 `Constante pour la taille de la zone de jeu Ecran_PanneauJeuX=screen width()-130 `Constante pour le héros Bitmap_Heros=20 Heros_Sprite=20 Heros_Image=20 Heros_Speed=5 Heros_PosX=Ecran_PanneauJeuX/2 Heros_PosY=screen height() -40 `Constante de tir du héros Bitmap_TirHeros=16 TirHeros_Sprite=250 TirHeros_Image=250 TirHeros_Speed=5 TirHeros_Son=16 TirHeros_Cadence=5 ` Constantes pour les monstres Bitmap_Monstre=10 Monstre_Sprite=100 Monstre_Image=100 Monstre_Speed=5 Monstre_PosX=10 Monstre_PosY=40 Monstre_DistanceX=50 Monstre_DistanceY=40 Monstre_SonDestroy=20 Monstre_ImageCur=100 Monstre_SpeedCur=5 Monstre_Reduction=9 Monstre_Trajectoire=1 Monstre_Nombre=5 Monstre_Angle=0 Monstre_Vague=0 Monstre_Attente=0 `Constantes pour les musiques Musique_Menu=1 Musique_Jeu=2 `Constante pour l'image de l'étoile Bitmap_Etoile=5 Etoile_Image=5 `Le sprite numéro 1 du jeu est une étoile Dim Etoile_Sprite(10,4) `On initialise le contenu du tableau gosub Init_TabEtoileSprite return `Méthode d'initialisation du tableau Etoile_Sprite Init_TabEtoileSprite: `On réinitialise le générateur de nombres aléatoire randomize timer() `On initialise le tableau des étoiles for i=1 to 10 `On indexe le sprite de l'étoile Etoile_Sprite(i,1)=i `On tire au hasard la vitesse de l'étoile. La vitesse varie de 1 à 4 Etoile_Sprite(i,2)=rnd(3)+1 `On tire au hasard la position initiale en X de l'étoile Etoile_Sprite(i,3)=rnd(Ecran_PanneauJeuX) `On tire au hasard la position initiale en Y de l'étoile Etoile_Sprite(i,4)=rnd(Screen height()) next i return `Méthode de chargement de l'étoile Charge_Etoile: load bitmap "ImagesStar.bmp", Bitmap_Etoile `On met le bitmap dans une image pour ensuite le mettre dans un sprite étoile get image Etoile_Image, 0,0, bitmap width(), bitmap height() return `Méthode de chargement du vaisseau héros Charge_Heros: load bitmap "ImagesHeros.jpg", Bitmap_Heros `On charge l'image dans le sprite get image Heros_Image, 0,0,bitmap width(), bitmap height() return `Méthode de chargement des musiques Charge_Musique: Load music "MusicJeu.mid", Musique_Jeu return `Méthode pour charger les tirs Charge_Tir: load bitmap "ImagesTirHeros.bmp", Bitmap_TirHeros `On charge l'image dans le sprite get image TirHeros_Image, 0,0,bitmap width(), bitmap height() `On charge le son du tir load sound "MusicTir_Heros.wav", TirHeros_Son `On initialise la position des sprites de tir for i=0 to 2 sprite TirHeros_Sprite+i, Ecran_PanneauJeuX+30, -50, TirHeros_Image next i return `Méthode pour charger les monstres Charge_Monstre: for i=0 to 3 `On charge l'image d'un vaisseau monstre load bitmap GetNomFichier("ImagesLevel1Monstre", i+1, "jpg"), Bitmap_Monstre+i `On charge l'image dans le sprite get image Monstre_Image+i, 0,0, bitmap width(), bitmap height() next i `On charge les bruits du monstre `Le bruit de destruction load sound "MusicDestroy_Enemi.wav", Monstre_SonDestroy return `Méthode d'initialisation des sprites des étoiles InitSprite_Etoile: `On va afficher toutes les étoiles une première fois for i=1 to 10 sprite Etoile_Sprite(i,1), Etoile_Sprite(i,3), Etoile_Sprite(i,4), Etoile_Image next i return `Méthode d'initialisation des sprites Heros InitSprite_Heros: `On cree le sprite Sprite Heros_Sprite, Heros_PosX, Heros_PosY , Heros_Image set sprite Heros_Sprite,1, 1 `on redimensionne le sprite scale sprite Heros_Sprite, 9 return `Méthode d'initialisation des sprites de monstres InitSprite_Monstre: `On valire les données du niveau gosub Level1 gosub Decode_DataLevel for i=0 to 4 set sprite Monstre_Sprite+i, 1, 1 scale sprite Monstre_Sprite+i, Monstre_Reduction Monstre_PosX=Ecran_PanneauJeuX/2 Monstre_PosY=Monstre_DistanceY*i-200 sprite Monstre_Sprite+i, Monstre_PosX, Monstre_PosY, Monstre_ImageCur next i `On initialise la variable servant à compter le temps d'attente avant la nouvelle vague Monstre_Attente=Timer() Monstre_Angle=0 return `Méthode de déplacement des monstres Deplacement_Monstre: for i=0 to 4 if Monstre_Trajectoire=1 `Trajectoire étirée if sprite Y(Monstre_Sprite+i)<screen height()+ sprite height(Monstre_Sprite) `Si le sprite est à l'écran, on le déplace vers le bas Monstre_PosX=sprite X(Monstre_Sprite+i)+30*(cos(360/15*(i+1)))*cos(Monstre_Angle) `On empeche le sprite de sortir de la surface du jeu if Monstre_PosX>Ecran_PanneauJeuX-sprite width(Monstre_Sprite) Monstre_PosX=Ecran_PanneauJeuX-sprite width(Monstre_Sprite) Endif sprite Monstre_Sprite+i, Monstre_PosX, Sprite Y(Monstre_Sprite+i)+Monstre_SpeedCur, Monstre_ImageCur Monstre_Angle=Monstre_Angle+i if Monstre_Angle>360 then Monstre_Angle=0 Endif Endif if Monstre_Trajectoire=2 `Trajectoire étirée 2 if sprite Y(Monstre_Sprite+i)<screen height()+ sprite height(Monstre_Sprite) `Si le sprite est à l'écran, on le déplace vers le bas Monstre_PosX=sprite X(Monstre_Sprite+i)+25*(cos(360/20*(i+1)))*cos(Monstre_Angle) `On empeche le sprite de sortir de la surface du jeu if Monstre_PosX>Ecran_PanneauJeuX-sprite width(Monstre_Sprite) Monstre_PosX=Ecran_PanneauJeuX-sprite width(Monstre_Sprite) Endif sprite Monstre_Sprite+i, Monstre_PosX, Sprite Y(Monstre_Sprite+i)+Monstre_SpeedCur, Monstre_ImageCur Monstre_Angle=Monstre_Angle+i if Monstre_Angle>360 then Monstre_Angle=0 Endif Endif if Monstre_Trajectoire=3 `Trajectoire élastique if sprite Y(Monstre_Sprite+i)<screen height()+ sprite height(Monstre_Sprite) `Si le sprite est à l'écran, on le déplace vers le bas Monstre_PosX=sprite X(Monstre_Sprite+i)+25*(sin(360/15*(i+1)))*cos(Monstre_Angle) `On empeche le sprite de sortir de la surface du jeu if Monstre_PosX>Ecran_PanneauJeuX-sprite width(Monstre_Sprite) Monstre_PosX=Ecran_PanneauJeuX-sprite width(Monstre_Sprite) Endif sprite Monstre_Sprite+i, Monstre_PosX, Sprite Y(Monstre_Sprite+i)+Monstre_SpeedCur, Monstre_ImageCur Monstre_Angle=Monstre_Angle+i if Monstre_Angle>360 then Monstre_Angle=0 Endif Endif next i `Chaque 8 secondes, on lance une nouvelle vague if Timer() - Monstre_Attente>12000 gosub InitSprite_Monstre Endif return `Méthode de déplacement des étoiles DeplacementEtoiles: `On va déplacer toutes les étoiles dans l'écran for i=1 to 10 if sprite Y(Etoile_Sprite(i,1))<=screen height() `Si on est dans l'écran sprite Etoile_Sprite(i,1), sprite X(Etoile_Sprite(i,1)), sprite Y(Etoile_Sprite(i,1))+Etoile_Sprite(i,2), Etoile_Image else `On remêt les étoiles dans l'écran sprite Etoile_Sprite(i,1), sprite X(Etoile_Sprite(i,1)), 0, Etoile_Image Endif next i return `Gestion des actions du vaisseau héros GestionHeros: `On déplace le vaisseau Héros if leftKey() AND sprite X(Heros_Sprite)>0 then sprite Heros_Sprite, sprite X(Heros_Sprite)-Heros_Speed, Sprite Y(Heros_Sprite), Heros_Image if rightKey() AND sprite X(Heros_Sprite)<Ecran_PanneauJeuX-Sprite width(Heros_Sprite) then sprite Heros_Sprite, sprite X(Heros_Sprite)+Heros_Speed, Sprite Y(Heros_Sprite), Heros_Image `On fait tirer le vaisseau héros if spacekey() then gosub HerosTir_Evenement `On gère la cadence de tir if TirHeros_Cadence<5 then TirHeros_Cadence=TirHeros_Cadence+1 return `Méthode de tir du vaisseau héros HerosTir_Evenement: `On gère trois tirs for i=0 to 2 if sprite exist(TirHeros_Sprite+i)=1 if sprite Y(TirHeros_Sprite+i)<0 `On ne tire que si la cadence est revenu à 5 if TirHeros_Cadence=5 sprite TirHeros_Sprite+i, sprite x(Heros_Sprite)-1, sprite y(Heros_Sprite)-20, TirHeros_Image `On fait le bruit du tir play sound TirHeros_Son TirHeros_Cadence=0 exit Endif Endif Endif next i return `Deplacement du tir du vaisseau héros DeplaceTirHeros: `On gère trois tirs for i=0 to 2 `Si le tir existe on le déplace if sprite exist(TirHeros_Sprite+i) if sprite Y(TirHeros_Sprite+i)+sprite Height(TirHeros_Sprite)>=0 Sprite TirHeros_Sprite+i, sprite x(TirHeros_Sprite+i), sprite Y(TirHeros_Sprite+i)-TirHeros_Speed, TirHeros_Image Endif Endif next i return `######################################################### `# Fin des méthodes Gosub # `######################################################### `######################################################### `# Fonctions utiles # `######################################################### `Fonction qui renvoie le nom d'un fichier en concaténant un mot, un chiffre et une extension Function GetNomFichier(NomFichier$, Numero, Extension$) `On crée le nom du fichier NomFichierFinal$=NomFichier$ + str$(Numero) + "." + Extension$ EndFunction NomFichierFinal$ `######################################################### `# data des niveaux # `######################################################### `Codage du niveau `une ligne par vague `5 paramètres `paramètre 1: le type d'enemi `paramètre 2: le nombre d'enemis `paramètre 3: le coefficient de réduction de l'image `paramètre 4: la trajectoire `paramètre 5: la vitesse `Méthode de décodage des données de niveau Decode_DataLevel: `On incrémente le numéro de vague Monstre_Vague=Monstre_Vague+1 `On attribue les valeurs aux variables Monstre_ImageCur=Niveau1(Monstre_Vague,1) Monstre_Nombre=Niveau1(Monstre_Vague,2) Monstre_Reduction=Niveau1(Monstre_Vague,3) Monstre_Trajectoire=Niveau1(Monstre_Vague,4) Monstre_SpeedCur=Niveau1(Monstre_Vague,5) return `Données du premier niveau Level1: Dim Niveau1(10,5) Niveau1(1,1)=Monstre_Image: Niveau1(1,2)=5 Niveau1(1,3)=7: Niveau1(1,4)=1: Niveau1(1,5)=2 Niveau1(2,1)=Monstre_Image+1: Niveau1(2,2)=5 Niveau1(2,3)=7: Niveau1(2,4)=2: Niveau1(2,5)=2 Niveau1(3,1)=Monstre_Image+2: Niveau1(3,2)=5 Niveau1(3,3)=7: Niveau1(3,4)=1: Niveau1(3,5)=2 return |