|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
UTILISATION DE TILES DANS UN JEU : TUTO 1
Information sur la source
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
- 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.
-
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.
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Historique
- 21 avril 2005 20:49:14 :
- Suppression pour cause d'erreur.
- 22 avril 2005 11:40:01 :
- Voila, la source mise a jour, tout bug corriger, exemple ajouté.
- 22 avril 2005 17:33:33 :
- Ajout d'une petite explication.
- 20 février 2006 21:17:43 :
- J'ai ajouté les mots clés.
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
directx 7 avec vb [ par jaman ]
je voudrais faire un blt avec une couleur de transparence , le tout dansd une fenetre et non en mode plein ecran... j'y arrive pas, et l'exemple fourn
dll direct x manquante [ par mikax ]
j'ai téléchargé la compil, malheureusement pour les projets utilisant Direct x, une reference est manquante (DirectX 7 for visual basic type library -
Cherche site avec cours directx [ par Stoomm ]
Bonjour, je cherche un site francais avec de bons cours sur directx, pour débutant.Quelqu'un peut-il m'aider ???Merci, a+. Stoomm
!!!!! Clip & Flip (DirectX) Aidez moi !!!!! [ par Stoomm ]
Bonjour, je recherche un exemple, le plus simpliste possible, pour faire un flipping et un clipping sur une image en Direct X.Si quelqu'un pouvais me
Livre VB6 et DirectX ????? [ par Stoomm ]
Bonjour. Je recherche un livre traitant de DX et VB en francais (si ca existe). Si quelqu'un connait, pourrait il me donner la reference ou le nom de
Directx et .x !!!!!!!!!!!!!! [ par Rodolf ]
Comment faire pour créer ces fichiers .x nécéssaires à directx pour faire du 3D ?J' ai plein de convertisseurs mais pas pour créer ces fichier.Merci d
map en fausse 3d et map en 2d [ par KL ]
Comment tu fais pour que la map sur la vision 2d soit la meme que celle générée par le module 3d ??
Video avec directx [ par Stoomm ]
Salut, Quelqu'un pourrait il me donner un exemple pour lire une video en plein ecran avec DirectX.Merci d'avance.A+. Stoomm.
la map 3D du projet nurmite en OpenGL version Beta 1 [ par blackwizzard ]
j'ai quand meme travaillé sur OpenGL pour la mapà la place de DirectX...C plus facile pour moi et puis le resultat est meilleur...voila!Map en OpenGL
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|