Pacman créator

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Pacman créator

Message par microdevweb »

Voici le code d'un éditeur de niveau pacman que je m'amuse à faire.

Le principe est le suivant
Dessiner un ou plusieurs niveaux (fait)
Placer le Player (fait)
placer les friandises/ fromages (a faire)
placer les fantômes (a faire)
animation du player avec détection de collision (fait partiellement)
Génération du fichier PB (fait partiellement)

actuellement 1600 lgn
donc je met en le code en zip
https://www.mediafire.com/?gcjcsxq2bc8ucob

Exemple du code généré automatiquement

Code : Tout sélectionner

;-Variable Globales
;{
Global Fin_Program.b=#False
Global mainTitle$=""
Global FrameRate=150
Global ElapsetTime
Global CurrentFrame=2
;}
;-Structures
;{
Structure Decor
	ID.i
	X.i
	Y.i
EndStructure
Structure Rectangle
	X.i
	Y.i
	L.i
	H.i
	Couleur.i
EndStructure
Structure Ligne
	X.i
	Y.i
	L.i
	H.i
	Couleur.i
EndStructure
Structure Player
	X.i
	Y.i
	R.i
EndStructure
Global NewList mesRectangles.Rectangle()
Global NewList mesLignes.Ligne()
Global NewList decorSprite.Decor()
Global monPlayer.Player
;}
;-Enumérations
;{
Enumeration
	#Main_Windows
	#Player
EndEnumeration
;-Constantes
;{
	#TaillePlayer=30
;}
;-Déclaration procédure
;{
Declare Open_MainWindows()
;}
Declare ChargeScene1()
Declare DessineScene()
Declare  Update_Player()
Declare  DetecteColision()
Declare Affiche_decor()
;-Initialisation
;{
If InitSprite()=0
	MessageRequester("Erreur","Erreur initialisation DirexX...",#PB_MessageRequester_Ok)
	End
EndIf
If InitKeyboard()=0
	MessageRequester("Erreur","Erreur initialisation DirexX...",#PB_MessageRequester_Ok)
	End
EndIf
Open_MainWindows()
;}
ChargeScene1()
DessineScene()
UsePNGImageDecoder()
CatchSprite(#Player,?PLAYER_IMG,#PB_Sprite_AlphaBlending)
;-Boucle Principale;{
Repeat
	ExamineKeyboard()
	Event=WindowEvent()
	FlipBuffers()
	ClearScreen(RGB(0,0,0))
	Affiche_decor()
	Update_Player()
	If KeyboardPushed(#PB_Key_Pad8)<>0
		monPlayer\R=270
	EndIf
	If KeyboardPushed(#PB_Key_Pad6)<>0
		monPlayer\R=360
	EndIf
	If KeyboardPushed(#PB_Key_Pad4)<>0
		monPlayer\R=180
	EndIf
	If KeyboardPushed(#PB_Key_Pad2)<>0
		monPlayer\R=90
	EndIf
	If KeyboardPushed(#PB_Key_Escape)<>0
		Fin_Program=#True 
	EndIf
	If Event=#PB_Event_CloseWindow:Fin_Program=#True : EndIf
Until  Fin_Program=#True
;}
;-Procédures
;{
Procedure Open_MainWindows()
	OpenWindow(#Main_Windows,0,0,800,600,mainTitle$,#PB_Window_SystemMenu)
	OpenWindowedScreen(WindowID(#Main_Windows),0,0,800,600)
EndProcedure
Procedure ChargeScene1()
	Restore Scene1_LGN:
	Read.i Scene1_LGN:
	While Scene1_LGN <>-1
		AddElement(mesLignes())
		mesLignes()\X=Scene1_LGN:
		Read.i Scene1_LGN:
		mesLignes()\Y=Scene1_LGN:
		Read.i Scene1_LGN:
		mesLignes()\L=Scene1_LGN:
		Read.i Scene1_LGN:
		mesLignes()\H=Scene1_LGN:
		Read.i Scene1_LGN:
		mesLignes()\Couleur=Scene1_LGN:
		Read.i Scene1_LGN:
	Wend
	Restore Scene1_PLAYER:
	Read.i Scene1_PLAYER:
	monPlayer\X=Scene1_PLAYER
	Read.i Scene1_PLAYER:
	monPlayer\Y=Scene1_PLAYER
	monPlayer\R=360
EndProcedure
Procedure DessineScene()
	ClearList(DecorSprite())
	ForEach mesRectangles()
		AddElement(DecorSprite())
		DecorSprite()\ID=CreateSprite(#PB_Any,mesRectangles()\L,mesRectangles()\H,#PB_Sprite_PixelCollision)
		DecorSprite()\X=mesRectangles()\X
		DecorSprite()\Y=mesRectangles()\Y
		StartDrawing(SpriteOutput(DecorSprite()\ID))
		Box(0,0,mesRectangles()\L,mesRectangles()\H,mesRectangles()\Couleur)
		StopDrawing()
	Next
	ForEach mesLignes()
		AddElement(DecorSprite())
		DecorSprite()\ID=CreateSprite(#PB_Any,mesLignes()\L,mesLignes()\H,#PB_Sprite_PixelCollision)
		DecorSprite()\X=mesLignes()\X
		DecorSprite()\Y=mesLignes()\Y
		StartDrawing(SpriteOutput(DecorSprite()\ID))
		Line(0,0,mesLignes()\L,mesLignes()\H,mesLignes()\Couleur)
		StopDrawing()
	Next
EndProcedure
;}
Procedure Affiche_decor()
	ForEach DecorSprite()
		DisplaySprite(DecorSprite()\ID,DecorSprite()\X,DecorSprite()\Y)
	Next
EndProcedure
Procedure Update_Player()
      ValDep=1
      Debug monPlayer\R
	If DetecteColision()=#True Or monPlayer\X<=0 Or monPlayer\Y<=0
	      ValDep=10
		Select monPlayer\R
			 Case 360
				monPlayer\R=180
			Case 180
				monPlayer\R=360
			 Case 90
				monPlayer\R=270
			Case 270
				monPlayer\R=90
		EndSelect
	EndIf
	If monPlayer\R>360
	EndIf
		RotateSprite(#Player,monPlayer\R,#PB_Absolute)
	If ElapsedMilliseconds()-ElapsetTime>FrameRate
		ElapsetTime=ElapsedMilliseconds()
		If CurrentFrame=2
			CurrentFrame=1
			ClipSprite(#Player,0,0,100,100)
			ZoomSprite(#Player,20,20)
		Else
			CurrentFrame=2
			ClipSprite(#Player,100,0,100,100)
			ZoomSprite(#Player,20,20)
		EndIf
	EndIf
	Select monPlayer\R
		Case 360
				monPlayer\X+ValDep
		Case 270
			monPlayer\Y-ValDep
		Case 180
			monPlayer\X-ValDep
		Case 90
			monPlayer\Y+ValDep
	EndSelect
	DisplayTransparentSprite(#Player,monPlayer\X,monPlayer\Y,255)
EndProcedure
Procedure DetecteColision()
	ForEach decorSprite()
		If SpriteCollision(#Player,monPlayer\X,monPlayer\Y,decorSprite()\ID,decorSprite()\X,decorSprite()\Y)
			ProcedureReturn #True
		EndIf
	Next
	ProcedureReturn #False
EndProcedure
;-Data
;{
DataSection
Scene1_LGN:
Data.i 20,20,760,1,16711680
Data.i 780,20,1,560,16711680
Data.i 20,580,760,1,16711680
Data.i 20,20,1,240,16711680
Data.i 20,260,240,1,16711680
Data.i 20,300,240,1,16711680
Data.i 20,300,1,280,16711680
Data.i 260,300,1,160,16711680
Data.i 40,320,1,240,16711680
Data.i 40,560,720,1,16711680
Data.i 760,340,1,220,16711680
Data.i 560,340,200,1,16711680
Data.i 560,340,1,100,16711680
Data.i 560,440,140,1,16711680
Data.i 700,440,1,20,16711680
Data.i 540,460,160,1,16711680
Data.i 540,320,1,140,16711680
Data.i 540,320,220,1,16711680
Data.i 760,160,1,160,16711680
Data.i 40,320,200,1,16711680
Data.i 100,460,160,1,16711680
Data.i 100,380,1,80,16711680
Data.i 100,380,20,1,16711680
Data.i 120,380,1,60,16711680
Data.i 120,440,120,1,16711680
Data.i 240,320,1,120,16711680
Data.i 760,160,1,20,16711680
Data.i 500,160,260,1,16711680
Data.i 500,120,1,40,16711680
Data.i 260,120,240,1,16711680
Data.i 260,220,1,40,16711680
Data.i 240,220,1,20,16711680
Data.i 40,240,200,1,16711680
Data.i 40,40,1,200,16711680
Data.i 40,40,720,1,16711680
Data.i 760,40,1,100,16711680
Data.i 520,140,240,1,16711680
Data.i 520,100,1,40,16711680
Data.i 240,100,280,1,16711680
Data.i 260,120,1,40,16711680
Data.i 240,100,1,60,16711680
Data.i 240,160,20,1,16711680
Data.i 240,220,20,1,16711680
Data.i 780,20,1,560,16711680
Data.i 760,40,1,520,16711680
Data.i 20,580,760,1,16711680
Data.i 40,560,720,1,16711680
Data.i 40,560,20,1,16711680
Data.i 40,560,720,1,16711680
Data.i 40,560,20,1,16711680
Data.i -1
Scene1_PLAYER:
Data.i 45,269
PLAYER_IMG:
 IncludeBinary "Img\Pacman.png"
EndDataSection
;}

Dernière modification par microdevweb le lun. 21/avr./2014 18:14, modifié 1 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Pacman créator

Message par majikeyric »

.....
Sinon ton idée est sympa. Générer tout le code pourquoi pas mais pourquoi ne pas générer juste des fichiers de données qui alimenteraient ton moteur de pacman ?
Dernière modification par majikeyric le lun. 21/avr./2014 18:18, modifié 1 fois.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Pacman créator

Message par microdevweb »

Oups je vérifie....
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Pacman créator

Message par microdevweb »

Merci majikeyric,

Archive corrigée.

Et pour répondre à ta question ,l'idée est de faire un générateur complet, avec la gestion des chemins de garde des ennemis, points et passage au niveau supérieur.

Juste pour le fun... :lol:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Pacman créator

Message par majikeyric »

C'est intéréssant.

J'ai codé un pacman (en C++ / DirectX 7 en 2001 ?!!) pour un projet d'études. Il y avait un scrolling multi-directionnel pour se déplacer dans tout le niveau (il ne tenait pas sur un seul écran).
Avatar de l’utilisateur
venom
Messages : 3136
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Pacman créator

Message par venom »

J'en avais commencer un aussi sous PB mais il est en stand-by pour le moment.
Bonne continuation.





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre