TGC Codebase Backup



Galaga clone by laurent mrejen

19th 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.
I show a way to manage mltiple shoots, multiple enemy squads and the most important movement of stars to make the scrolling effect



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