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 2


Information sur la source

Catégorie :Jeux Classé sous : tile, map, directx, directdraw Niveau : Débutant Date de création : 22/04/2005 Date de mise à jour : 20/02/2006 21:17:14 Vu / téléchargé: 3 392 / 280

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

Description

Ce tuto va servir à expliquer la méthode d'affichage indirect. Il est plutot court, mais j'ai fait un tuto à part car il faut comprendre le fonctionnement de creation d'une surface vierge.

Je considere donc vous avez lut  au préalable mes tuto sur dx (l'affichage d'image et la declaration de dx) et le premier tuto sur les tiles.

 

Source

  • La difference entre la methode direct et la méthode indirect est assé importante :
  • Dans la methode directe a chaque passage dans la boucle tout les tiles sont affiches, dans la méthode indirecte on les affiches une seul fois donc l'affichage et plus leger.
  • Nous reprennons tout l'ancien code jusqu'a ces quelques lignes :
  • For i = 0 To UBound(Files)
  • Set Tiles(i) = dd.CreateSurfaceFromFile(Path & Files(i), ddsdTiles(i))
  • Next i
  • La suite du code change.
  • Alors, premierement il faut rajouter des variables :
  • Public BackGround As DirectDrawSurface7
  • Public ddsdBackGround As DDSURFACEDESC2
  • Ensuite apres le Next i, nous allons creer une surface vierge sur laquelle nous poserons nos tiles.
  • ddsdBackGround.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
  • Ici on declare que notre surface utilise les caps (voir mes anciens tuto) et qu'on definira la largueur et la hauteur de la surface.
  • ddsdBackGround.ddscaps.lCaps = DDSCAPS_VIDEOMEMORY
  • On utilise ici la fonctionne de memoire de la surface, c est a dire que notre surface est mise directement en memoire (ram)
  • Ici on donne la taille de la surface, celle ci se deduit naturellemnet des dimension de Map
  • ddsdBackGround.lHeight = UBound(Map, 2) * 32
  • ddsdBackGround.lWidth = UBound(Map, 1) * 32
  • Maintenant que le ddsd est totalement définis on peut enfin declarer BackGround comme surface.
  • Set BackGround = dd.CreateSurface(ddsdBackGround)
  • Il ne reste plus qu'a bltfast les tiles :
  • For x = 0 To UBound(Map, 1)
  • For y = 0 To UBound(Map, 2)
  • Meme code que dans la méthode direct mais sur la surface
  • BackGround.BltFast x * 32, y * 32, Tiles(Map(x, y)), ddRect(0, 0, 0, 0), DDBLTFAST_WAIT
  • Next y
  • Next x
  • Maintenant dans la boucle d'affichage :
  • Do
  • Primary.Flip Nothing, DDFLIP_WAIT
  • On blit simplement notre surface, suivant la taille de la carte on découpe bien entendu.
  • If UBound(Map, 1) <= 25 And UBound(Map, 2) <= 18 Then
  • Backbuffer.BltFast 0, 0, BackGround, ddRect(0, 0, (UBound(Map, 1) * 32), (UBound(Map, 2) * 32)), DDBLTFAST_WAIT
  • ElseIf UBound(Map, 1) > 25 And UBound(Map, 2) < 18 Then
  • Backbuffer.BltFast 0, 0, BackGround, ddRect(0, 0, 800, (UBound(Map, 2) * 32)), DDBLTFAST_WAIT
  • ElseIf UBound(Map, 1) < 25 And UBound(Map, 2) > 18 Then
  • Backbuffer.BltFast 0, 0, BackGround, ddRect(0, 0, (UBound(Map, 1) * 32), 600), DDBLTFAST_WAIT
  • ElseIf UBound(Map, 1) > 25 And UBound(Map, 2) > 18 Then
  • Backbuffer.BltFast 0, 0, BackGround, ddRect(0, 0, 800, 600), DDBLTFAST_WAIT
  • End If
  • DoEvents
  • Loop Until bRunning = False
  • Cette méthode à des avantages et des inconvenients, à vous de choisir votre préféré, et surtout de savoir quelle sera la puissance demandé par le jeu.
La difference entre la methode direct et la méthode indirect est assé importante :
Dans la methode directe a chaque passage dans la boucle tout les tiles sont affiches, dans la méthode indirecte on les affiches une seul fois donc l'affichage et plus leger.

Nous reprennons tout l'ancien code jusqu'a ces quelques lignes :
For i = 0 To UBound(Files)
    Set Tiles(i) = dd.CreateSurfaceFromFile(Path & Files(i), ddsdTiles(i))
Next i

La suite du code change.

Alors, premierement il faut rajouter des variables :
Public BackGround As DirectDrawSurface7
Public ddsdBackGround As DDSURFACEDESC2

Ensuite apres le Next i, nous allons creer une surface vierge sur laquelle nous poserons nos tiles.

ddsdBackGround.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
Ici on declare que notre surface utilise les caps (voir mes anciens tuto) et qu'on definira la largueur et la hauteur de la surface.


ddsdBackGround.ddscaps.lCaps = DDSCAPS_VIDEOMEMORY
On utilise ici la fonctionne de memoire de la surface, c est a dire que notre surface est mise directement en memoire (ram)


Ici on donne la taille de la surface, celle ci se deduit naturellemnet des dimension de Map
ddsdBackGround.lHeight = UBound(Map, 2) * 32
ddsdBackGround.lWidth = UBound(Map, 1) * 32

Maintenant que le ddsd est totalement définis on peut enfin declarer BackGround comme surface.
Set BackGround = dd.CreateSurface(ddsdBackGround)

Il ne reste plus qu'a bltfast les tiles :

 For x = 0 To UBound(Map, 1)
            For y = 0 To UBound(Map, 2)
                Meme code que dans la méthode direct mais sur la surface

                BackGround.BltFast x * 32, y * 32, Tiles(Map(x, y)), ddRect(0, 0, 0, 0), DDBLTFAST_WAIT
            Next y
        Next x

Maintenant dans la boucle d'affichage :

Do
    Primary.Flip Nothing, DDFLIP_WAIT
       
         On blit simplement notre surface, suivant la taille de la carte on découpe bien entendu.
If UBound(Map, 1) <= 25 And UBound(Map, 2) <= 18 Then
            Backbuffer.BltFast 0, 0, BackGround, ddRect(0, 0, (UBound(Map, 1) * 32), (UBound(Map, 2) * 32)), DDBLTFAST_WAIT
        ElseIf UBound(Map, 1) > 25 And UBound(Map, 2) < 18 Then
            Backbuffer.BltFast 0, 0, BackGround, ddRect(0, 0, 800, (UBound(Map, 2) * 32)), DDBLTFAST_WAIT
        ElseIf UBound(Map, 1) < 25 And UBound(Map, 2) > 18 Then
            Backbuffer.BltFast 0, 0, BackGround, ddRect(0, 0, (UBound(Map, 1) * 32), 600), DDBLTFAST_WAIT
        ElseIf UBound(Map, 1) > 25 And UBound(Map, 2) > 18 Then
            Backbuffer.BltFast 0, 0, BackGround, ddRect(0, 0, 800, 600), DDBLTFAST_WAIT
        End If
    DoEvents
    
Loop Until bRunning = False


Cette méthode à des avantages et des inconvenients, à vous de choisir votre préféré, et surtout de savoir quelle sera la puissance demandé par le jeu.

Conclusion

A bug ??? il n'y en pas. Ensuite remerciement à Renfield il m'a passer un site ou j'ai pus retrouver la declaration de surface vierge (meme si sa n'y était pas reelement).
Puis encore Simon pour les tiles de 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

25 avril 2005 13:15:34 :
Amélioration du blit dans le backbuffer.
25 avril 2005 13:21:59 :
Erreur dans une inégalitée, j'avais mis à la premiere : If UBound(Map, 1) < 25 And UBound(Map, 2) < 18 Then au lieu de If UBound(Map, 1) <= 25 And UBound(Map, 2) <= 18 Then donc sa buggé si on avait 18 ou 25. De plus j'ai remis dans l'ordre : ElseIf UBound(Map, 1) < 25 And UBound(Map, 2) > 18 Then c'était dans le sens inverse sa change rien pour le fonctionnement, c'est juste plus jolie.
20 février 2006 21:17:14 :
J'ai ajouté les mots clés.

Commentaires et avis

signaler à un administrateur
Commentaire de XtremDuke le 22/04/2005 18:03:12

Toujours aussi  instructif...

A quand le prochain tuto ?  ;)

signaler à un administrateur
Commentaire de ciberrique le 22/04/2005 19:01:06

Ben je pensais faire un tuto sur la gestion des collision par matrice, ou peut etre un effet de transition lorsqu'on fait rentrer un perso dans une maison ou lorsqu'on change de carte ou encore expliqué pour l'animation.

A vous de demander lequel faire ....

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Directdraw couleur transparente [ par dester ] Bon j'ai comme un bleme.Voila je me suis dis : "hopla je me met a developper en directX"Et tout a coup ont surgis quelque problemes (loleu)Alors prem DX 7 8 9 ??? [ par Stephane ] Salut a tous voila, il y a quelques temps j'avais fait quelques jeux en DirectX7 qui utilisait DirectDraw Aujourd'hui, je me lance dans un nouveau j DirectDraw DirectX [ par CiscoFun ] Bonjour,Voila je débute dans la programmation graphique et j'aimerais que quelqu'un me donne l'adresse d'un site (j'en ai deja testé plusieur mais rie vb6 - directX, directDraw, openGL,... [ par mstarsup5 ] Bonjour,Je souhaiterais commencer à écrire des programmes en utilsant directX pour pouvoir faire des jeux plus rapides, mais j'aurais quelques questio DirectX -> DirectDraw [ par ShadowMaster ] Bonjour je vous explique mon probleme: j'aimerai savoir si il est possible de "prendre" la couleur d'un pixel dans une surface directDraw un truc du g DirectDraw sous DirectX8 [ par nihaoma ] Bonjour à tous,je me permet de poster ce message pour vous soumetre un petit probleme auquel je suis confronté: je suis en train de developper une pet vb6 - directX, direct draw, ... [ par mstarsup5 ] Bonjour,Je reprends un peu mon post d'hier, en espérant avoir des toooooonnes de réponses sur celui là  (  ;-)  )En réalité, je veux me mettre à écrir Modification dynamique avec directdraw [ par le pro masterchief ] Bonjour j'aimerais savoir si il est possible avec directdraw sous directx 7 de modifier les couleur des sprites dynamiquement dans le jeu avec du code Techniques de développement DirectX [ par Kevin.Ory ] Bonjour,J'ai développé une application qui affiche une carte d'un jeu sur laquelle on peut se déplacer et zoomer. Je l'ai fais en dessinant avec les m Afficher une texture en directX [ par ninja hacker ] Bonjour!Suite a une recherche interminable sur le web j'ai réaliser qu'il n'y avait aucune source en vb.net ou tutorial qui démontrait comment affiche


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.