Utilisation de tiles dans un jeu : tuto 1

Description

Bonjours, dans ce tuto je vais tenter d expliquer comment il est possible de créer un jeu avec des tiles en utilisant directx 7 (pour ma part, sachant que les techniques expliquées fonctionnent également sous directx8). Premièrement je suppose que vous avez déjà les connaissances présentes dans mes précédents tuto (je parle des tuto en relation avec l affichage d image).

Source / Exemple :


Je ne remet pas l?initialisation de directx, à vous de voir sur mes tuto précédents.

Tout d abord, qu est ce des tiles : Un tile c est un image (au format que vous voulez) d une taille prédéfinie (ici 32*32), donc des tiles se sont des images ayant toute la même taille et le même nom (ici tile000.bmp, tile001.bmp), le chiffre sera l identifiant.
C est image une fois assemblé permettent de créer un décors, ce qu on appellera une map (carte).

Donc pour créer une carte nous avons besoin de différents fichiers, les premiers se sont les tiles, ensuite une matrice. Une matrice c est en faite un tableau que l on met dans un fichier externe qui donnera la position de chaque tiles sur la map. Donc par exemple :
000 000 000 000 000 000
001 000 000 000 000 001
001 000 000 000 000 001
000 000 000 000 000 000
Sur cette matrice on travaille avec 2 fichiers : tile000 et tile001, en effet dans la matrice on ne met que le numéro du tile ce qui permet d alléger le fichier map.
Bon c est bien beau mais sa ne sert pas a grand-chose tout ça.  En faite nous avons besoin des tiles pour créer ma carte du jeu, c est pourquoi il faut comprendre a quoi sa sert, mais aussi comment les charger.

Maintenant nous allons charger les tiles : 

Tout d?abord dans un module nous avons besoin de nouvelles variables :
Public Tiles()  As DirectDrawSurface7
Public ddsdTiles() As DDSURFACEDESC2
Public Map() As String

Dans tiles on mettra toutes les images de la carte, dans Map la matrice tel que représenter ci-dessus. Il se pause un premier problème, chaque map possède un nombre différent de tiles donc il faut récupérer les noms des tiles du dossier de la map. Voici comment procéder pour récupérer les noms :

'Récupération des noms de tout les tiles du dossier
Dim Files() As String ? tableau temporaire pour récupérer les nom
i = 0        ? Au cas ou i <>0
FileName = Dir$(Path & "*.bmp")    ? FileName =  direction des fichiers bmp dans le dossier
While LenB(FileName) > 0               ? Tant qu?il reste des fichiers
    ReDim Preserve Files(i)                ? On ajoute une case au tableau
    Files(i) = FileName		? On met dans le tableau le nom du fichier
    i = i + 1				? Incrementation de i par 1
    FileName = Dir$ 			? On passe au fichier suivant
Wend					? On recommence
'Chargement en surface
ReDim Tiles(UBound(Files))		? On donne la bonne taille au tableau de surface
ReDim ddsdTiles(UBound(Files))		? Idem pour le tableau de description
For i = 0 To UBound(Files)			? Tant qu?il reste des noms de fichiers 
    Set Tiles(i) = dd.CreateSurfaceFromFile(Path & Files(i), ddsdTiles(i))		?On assigne le fichier en surface
Next i

Maintenant il faut s?occuper du chargement de la matrice, voici la procédure :
On utilise une variable temporaire pour charger les lignes du fichiers

'Déclaration des variables
Dim Path As String			?Direction par default
Dim TempString As String		? La variable temporaire
Dim i As Long, size2 As Integer	? Pour eviter  les bugs
Dim File As Byte			? Pour ouvrir le fichier

'Ouverture du fichier
File = FreeFile			? On laisse la gestion du numero au pc
Path = App.Path & "\Map\"		? On donne le path par default
Open Path & "map.txt" For Binary Access Read As #File 		? Ouverture du fichier en mode lecture
        Do While Not EOF(File)		?Tant qu?on est pas a la fin du fichier
        'Lecture d'une ligne
            Line Input #File, TempString
        'Decoupage
            ReDim Preserve Map((Len(TempString) \ 3) - 1, size2)	?On rajoute le nombre de colone qu il faut et le nombre de ligne qu il faut
            i = 0
            Do While Len(TempString) >= 3		? Tant qu?il y a plus de 3 caractere dans la variable temporaire
                DoEvents					? On laisse le processeur gerer les calculs
                Map(i, size2) = Left$(TempString, 3)	? On donne le numero du fichier aux coordonnees correspondantes
                i = i + 1					? Incrementation de i par 1
                TempString = Mid$(TempString, 4)	? Redimmensionnemtn de TempString
            Loop						? On recommence
            DoEvents					? On laisse la gestion au processeur
            size2 = UBound(Map, 2) + 1			? On donne la taille du tableau dans size2
        Loop						? On recommence
Close #File						? Fermeture du fichier

Maintenant vous avez chargé la matrice il y a deux solution pour afficher celle-ci, soit vous passez par un affichage indirect soit un affichage direct. J explicite : 
La méthode directe : A chaque case correspond un tile vous affichez donc tout les tiles par rapport a la matrice directement sur l?ecran :

	For x = 0 to Ubound (Map,1)			?Pour tout y present dans la matrice
		For y = 0 to Ubound(Map,2)		? Pour tout x present dans la matrice
		Backbuffer.Bltfast x*32,y*32, Tiles(Map(x,y)), DDRect(0,0,0,0), DDBLTFAST_WAIT		? On affiche a l ecran l?image correspondante
	Next y 				? On recommence en x
Next x					?  On recommence en y

Donc dans ce code on affiche pour toutes les coordonees chaque tiles a l?ecran.

La méthode indirecte : On fait le même travaille mais au lieu d utiliser Backbuffer on utilise une Surface temporaire, l interet est que la carte est totallement charger donc pas de ralentissement pendant le jeu.
Je ne détaille pas plus cette méthode pour l instant, se sera l objet du prochain tuto.
La méthode cité ci-dessus utilisée par le jeu Zelda sur ce site fait par VisualBasix.

ATTENTION : Rectification, aprés avoir recu un message me demandant de l'aide je me suis rendu compte qu'une de mes explications n'était pas claire, donc je rajoute une phrase.

Les identifiants des tiles doivent formés une suite sans aucun trou, je veux dire par la, pas de :
Tiles001, Tiles002, Tiles100
Mais :
Tiles001, Tiles002, Tiles003

J'espere que tout est ok maintenant.

Conclusion :


Code tester et vérifier pas de bug connu. Merci à Renfield pour m'avoir aider a debugger un petit truc que je n'arrivais plus a faire, et a Simon pour ses tiles utilisés dans l'exemple.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.