Article     Discussion     Modifier     Historique     Forums     Salon IRC

Utiliser Mappy avec 3d games creator

Un article de Games Creators Network.


Dans ce tutorial, je vais ni plus ni moins vous expliquer comment intégrer à vos programmes une map digne de secret of mana en 5 minutes !

Note: J'inclus au zip mappy et le code qui les librairies nécessaires à l'importation.


Sommaire

[modifier] Mappy

Tout d'abord, je vais présenter mappy. Mappy est un utilitaire très puissant qui permet de faire des maps. En certains points, il se rapproche de RPG maker, sauf qu'il ne crée pas un jeu entier, mais seulement les maps. Il a de nombreuses fonctions et gère les maps utilisant des tiles carrées, hexagonales ou en 3d-isométrique... quand même !

L'éditeur de carte Mappy

Une des maps fournies avec mappy, notez que lorsqu'on teste la map, les tiles s'animent...


Comme mappy possède une interface relativement intuitive et comme ce n'est pas mon domaine de prédilection, nous allons passer directement au passage difficile, c'est à dire l'intégration des maps avec 3dgc !


[modifier] Intégrer les maps

Et c'est là que ça se corse ! Vous avez vu la puissance de mappy, donc je vous laisse imaginer la complexité des .fmp produits !

Mais heureusement, Kevin Picone a crée des librairies de fonctions qui permettent d'intégrer les maps facilement (inclus dans le zip de l'article).


[modifier] Etape 1: initialisation des tableaux

Voilà la première étape, la plus simple: il n'y a rien à comprendre ! Vous faites copier/coller, c'est la liste de tous les tableaux utilisés, vous cherchez pas ^^ (pensez à appeler les deux étiquettes l'une après l'autre avant le chargement de la première map)

Init_Mappy_Library:
		Dim Mappy_AuthorInfo$(10)
		Dim Mappy_MapWidth(1)
		Dim Mappy_MapHeight(1)
		Dim Mappy_MapVersion(1)
		Dim Mappy_MapRevision(1)

		Dim Mappy_LSB_FORMAT(1)

		Dim Mappy_BlockWidth(1)
		Dim Mappy_BlockHeight(1)
		Dim Mappy_BlockDepth(1)

		Dim Mappy_BlockStructSize(1)
		Dim Mappy_Numb_BlockStructs(1)
		Dim Mappy_Numb_BlockGFX(1)

		Dim Mappy_AnimBlockStructSize(1)


		Dim Mappy_Block_Palette(256)

		` La première et la dernière image utilisée
		Dim Mappy_BaseBlockImage(1)
		Dim Mappy_LastUsedBlockImage(1)


		` Variables pour le chargement

		Dim Mappy_FileSize(1)
		Dim Mappy_FileNumb(1)
		Dim Mappy_TileMapLayers_BankNumb(10)
		Dim Mappy_BlockStructuresBankNumb(1)

		Dim Mappy_AnimBlockStructuresBankNumb(1)
		Dim Mappy_AnimBlockStructuresBankNumbReset(1)

		Dim Mappy_HighestANimBlockStructures(1)


		Dim Mappy_TileSizeInBytes(1)

		Dim Mappy_BitmapForBlocks(1)


		Dim MappyAnimTypes_End(1)
		Dim MappyAnimTypes_None(1)
		Dim MappyAnimTypes_LOOPF(1)
		Dim MappyAnimTypes_LOOPR(1)
		Dim MappyAnimTypes_ONCE(1)
		Dim MappyAnimTypes_ONCEH(1)
		Dim MappyAnimTypes_PPFF(1)
		Dim MappyAnimTypes_PPRR(1)
		Dim MappyAnimTypes_PPRF(1)
		Dim MappyAnimTypes_PPFR(1)
		Dim MappyAnimTypes_ONCES(1)

	Reset_Mappy()

return
 
Init_Virtual_banks_library:

	` Globals
	Dim Vb_Library_Status(1)
	Dim Vb_Number_of_Banks(1)

	Dim VbBank_Status(1)
	Dim VbBank_Offset(1)
	Dim VbBank_Size(1)
	Dim VbBank_ReSize(1)
	Dim VbBank_ActualSize(1)
	Dim VbBank_StructureSize(1)

	Dim VB_DataCache(1)
	Dim VBp_ResizeDataCache(1)

	Dim VB_GetByteMask(3)
	Dim VB_RemoveByteMask(3)
	Dim VB_ByteMult(3)

	Dim VB_GetWordMask(1)
	Dim VB_RemoveWordMask(1)
	Dim VB_WordMult(1)

	VBp_InitPreCalc()

	` Used for common clipping functions
	Dim Vb_Clip_Status(1)
	Dim Vb_Clip_Coords(4)


	` The Encryption Keyword Array
	Dim Vb_Encryption_Key_Size(1)
	Dim Vb_Encryption_Key_Data(1)
	Dim Vb_Encryption_Key_MergedData(1)
	   Dim Vb_Encryption_Mode(1)
	Dim Vb_Encryption_Mode_Offset(1)
	Dim Vb_Encryption_Mode_OffsetChange(1)


return

[modifier] Etape 2: on inclut !

Encore plus dur ! Vous incluez cela pour avoir accès aux fonctions:


#include "includes/VirtualBanksLibrary_FULL_V008.dba"
#include "includes/MappyLibrary_V009.dba"


Et enfin, il vous faut afficher la map, mais avant je vais détailler les fonctions que contient la librairie.


[modifier] Les fonctions...

Mappy_Load_Map(Filename$,Filenumb,BitMapForBlocks,BaseIMage,ShowInfo)

Charge la map voulue

  • Filename$: le nom de la map à charger
  • FileNumb: un emplacement pour ouvrir le fichier (pour la fonction open to read)
  • BitMapForBLock: ce bitmap est utilisé temporairement pour charger les tiles et est supprimé à la fin du chargement
  • BaseIMage: image de départ à partir de laquelle les tiles seront chargées (c'est à dire que vous spécifiez 100, le slot 1 sera dans l'image 100, le 2 dans le 101, etc...)
  • ShowInfo: affiche les infos de la map

Note: actuellement certains maps créées avec mappy ne sont pas encore supportées, ne vous étonnez-donc pas si ça ne marche pas !


Mappy_Display(layer,Mapx,Mapy,TilesX,TilesY,BaseScreenXpos,BaseScreenYpos,Animated,transparent,ClearBlk)

Affiche la map à l'écran

  • layer: n° du layer à afficher (varie de 0 à 9)
  • Mapx, Mapy: détermine l'endroit de la map à afficher (les coordonnées correspondent au coin haut gauche du carré)
  • TilesX, TilesY: nombre de tiles à afficher sur les deux axes
  • BaseScreenXpos, BaseScreenYpos : coordonnées à l'écran où l'on affiche la map
  • Animated: flag qui détermine si l'on utilise les animations des tiles ou pas (1=oui / 0=non)
  • transparent: flag qui détermine si l'on utilise la transparence ou pas (1=oui / 0=non)
  • ClearBlk: si l'on utilise le mode transparent, définit le bloc déterminant la couleur de transparence (normalement le 0)


Mappy_Delete_images()

Supprime les images utilisées par la map.


Mappy_Update_Block_Animation()

La fonction met à jour les animations de la map afin que le prochain affichage dessine l'animation suivante des tiles de la map, à insérer après chaque display map.


Mappy_Reset_Block_Anims()

Réinitialise les animations de la map.


[modifier] Exemple

Je termine cet article par un petit exemple...


set display mode 320,240,32

sync on
hide mouse

rem Pensez bien vérifier que ces fichiers existent !!
#include "includes/VirtualBanksLibrary_FULL_V008.dba"
#include "includes/MappyLibrary_V009.dba"


rem initialisation des tableaux, NE PAS OUBLIER !!
gosub Init_Mappy_Library
gosub Init_Virtual_banks_library

Filename$="proja.fmp"
Mappy_Load_Map(Filename$,1,1,1000,0)


rem Le bitmap sert de tampon, on affiche la map dessus puis on copie à l'écran: cela augemente grandement la vitesse  d'exécution !
create bitmap 1,320,240


rem positionnement dans la map (rien à comprendre ici, correspond juste à un endroit que j'ai choisi)
mapX=0
mapY=900

do
rem bitmap actif => n°1, c'est à dire que l'on affiche la map dans le 1 (sert de backbuffer, de tampon)

rem le mapx/2 et mapy/2 du layer0 correspond à un effet de parallaxe:
rem comme le layer 0 contient le décor de fond, donc le plus éloigné,
rem il parait se déplacer moins vite (mapx/2 et mapy/2)
rem alors que le layer1 qui contient la map proprement dite est proche
rem et se déplace à vitesse normale (mapx et mapy).

   Set Current Bitmap 1

rem affichage des layers 1 et 2 de la map, puis mise à jour des animations
   Mappy_Display(0,mapx/2,mapy/2,20,14,0,0,0,0,0)
   Mappy_Display(1,mapx,mapy,20,14,0,0,1,1,0)
   Mappy_Update_Block_Animation()

rem copie bitmap 1 à l'écran
   Copy bitmap 1,0

   sync
loop




rem ===== INITIALISATION TABLEAUX ===
Init_Mappy_Library:


		Dim Mappy_AuthorInfo$(10)
		Dim Mappy_MapWidth(1)
		Dim Mappy_MapHeight(1)
		Dim Mappy_MapVersion(1)
		Dim Mappy_MapRevision(1)

		Dim Mappy_LSB_FORMAT(1)

		Dim Mappy_BlockWidth(1)
		Dim Mappy_BlockHeight(1)
		Dim Mappy_BlockDepth(1)

		Dim Mappy_BlockStructSize(1)
		Dim Mappy_Numb_BlockStructs(1)
		Dim Mappy_Numb_BlockGFX(1)

		Dim Mappy_AnimBlockStructSize(1)


		Dim Mappy_Block_Palette(256)

		` La première et la dernière image utilisée
		Dim Mappy_BaseBlockImage(1)
		Dim Mappy_LastUsedBlockImage(1)


		` Variables pour le chargement

		Dim Mappy_FileSize(1)
		Dim Mappy_FileNumb(1)
		Dim Mappy_TileMapLayers_BankNumb(10)
		Dim Mappy_BlockStructuresBankNumb(1)

		Dim Mappy_AnimBlockStructuresBankNumb(1)
		Dim Mappy_AnimBlockStructuresBankNumbReset(1)

		Dim Mappy_HighestANimBlockStructures(1)


		Dim Mappy_TileSizeInBytes(1)

		Dim Mappy_BitmapForBlocks(1)


		 Dim MappyAnimTypes_End(1)
		 Dim MappyAnimTypes_None(1)
		 Dim MappyAnimTypes_LOOPF(1)
		 Dim MappyAnimTypes_LOOPR(1)
		 Dim MappyAnimTypes_ONCE(1)
		 Dim MappyAnimTypes_ONCEH(1)
		 Dim MappyAnimTypes_PPFF(1)
		 Dim MappyAnimTypes_PPRR(1)
		 Dim MappyAnimTypes_PPRF(1)
		 Dim MappyAnimTypes_PPFR(1)
		 Dim MappyAnimTypes_ONCES(1)

	Reset_Mappy()

return
Init_Virtual_banks_library:

	` Globals
	Dim Vb_Library_Status(1)
	Dim Vb_Number_of_Banks(1)

	Dim VbBank_Status(1)
	Dim VbBank_Offset(1)
	Dim VbBank_Size(1)
	Dim VbBank_ReSize(1)
	Dim VbBank_ActualSize(1)
	Dim VbBank_StructureSize(1)

	Dim VB_DataCache(1)
	Dim VBp_ResizeDataCache(1)

	Dim VB_GetByteMask(3)
	Dim VB_RemoveByteMask(3)
	Dim VB_ByteMult(3)

	Dim VB_GetWordMask(1)
	Dim VB_RemoveWordMask(1)
	Dim VB_WordMult(1)

	VBp_InitPreCalc()

	` Used for common clipping functions
	Dim Vb_Clip_Status(1)
	Dim Vb_Clip_Coords(4)


	` The Encryption Keyword Array
	Dim Vb_Encryption_Key_Size(1)
	Dim Vb_Encryption_Key_Data(1)
	Dim Vb_Encryption_Key_MergedData(1)
	Dim Vb_Encryption_Mode(1)
	Dim Vb_Encryption_Mode_Offset(1)
	Dim Vb_Encryption_Mode_OffsetChange(1)


return

Et voilà ! A ceux qui repprochent à ce programme d'être en 320x240, je précise qu'il suffit de doubler la valeur de tilesX et tilesY de display map pour pouvoir double la résolution ! En clair:

set display mode 640,480,32
[...]
   Mappy_Display(0,mapx/2,mapy/2,20*2,14*2,0,0,0,0,0)
   Mappy_Display(1,mapx,mapy,20*2,14*2,0,0,1,1,0)


Note: je n'ai pas appliqué cette astuce car la map 'proja' fournie avec mappy est trop petite, regardez ce bug !


Attention aux cartes trop petites!

Ce document a été publié sur la version 3 du G.C.N. par MrCool.

  • Auteur Original : MrCool
  • Date de publication : 27 février 2002

 

Rechercher
Installer l'extension de recherche Plus d'informations

 

Comprendre
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

 

Partager
La connaissance est la seule chose qui s'accroit lorsqu'on la partage. - Sacha Boudjema

 

Créer
L'imagination est plus importante que la connaissance. - Albert Einstein

 

 

Le wiki en images Le wiki en images Image du mois: «Snowball: un prototype de jeu développé avec NeL.