Utilisation de tiles dans un jeu : tuto 2

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 / Exemple :


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.

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.