Map de taille infini (ou presque) : tuto tiles 4

Description

Pour ce petit tutorial je vais partir de la méthode d?affichage indirecte seulement je vais intégrés la gestion de carte qui dépasse la taille de l?écran (en pixel). Ici j?utiliserai un écran de taille 800*600 en 32 bits, ainsi que DirectDraw, et DirectInput dans leur version 7, ce qui inclus que vous ayez lu mes précédents tutoriaux pour avoir une compréhension parfaite de cette explication.

Source / Exemple :


J?ai quelque peux modifier le code de chargement de la matrice  et de l?application des tiles sur la surface de fond, je vais donc redonner les fonctions, en effet les précédentes posséder des bugs.

'Creation d'une surface vierge de la taille maximal
ddsdBackGround.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
ddsdBackGround.ddscaps.lCaps = DDSCAPS_VIDEOMEMORY
ddsdBackGround.lHeight = (UBound(Map, 2) + 1) * 32
ddsdBackGround.lWidth = (UBound(Map, 1)) * 32
Set BackGround = dd.CreateSurface(ddsdBackGround)
Dim x As Integer, y As Integer
'Méthode d'affichage direct mais apppliqué sur la surface vierge
        For x = 0 To UBound(Map, 1)
            For y = 0 To UBound(Map, 2)
                BackGround.BltFast x * 32, y * 32, Tiles(Map(x, y)), ddRect(0, 0, 0, 0), DDBLTFAST_WAIT
            Next y
        Next x

Ce code a été modifié, la largeur et la hauteur de la carte ne fond plus 800 * 600 mais la taille de la matrice charger au par avant bien sur.

Maintenant je vous présente les nouvelles variables :

Public X1Map As Long
Public X2Map As Long
Public Y1Map As Long
Public Y2Map As Long

Ce sera les coordonnées du rectangle source qui sera prélevé de Background pour afficher à l?écran.
L?initialisation de celles-ci doit être impérativement avant la boucle d?affichage.

X1Map = 0
X2Map = 800
Y1Map = 0
Y2Map = 600
Donc un rectangle de 800*600

Maintenant nouveau type d?affichage de la surface :

Backbuffer.Blt ddRect(0, 0, 800, 600), BackGround, ddRect(X1Map, Y1Map, X2Map, Y2Map), DDBLT_WAIT
On utilise un Blt pour pouvoir choisir le rectangle source et le rectangle de destination, en effet le BltFast ne permet pas de choisir le rectangle source.

Une petite fonction de plus avec DirectInput, je ne donne pas la déclaration de DirectInput car j?ai rédigé un tutorial exprès sur cela.

Public Function Deplacement()

    DIdevice.GetDeviceStateKeyboard DIstate
    
    If DIstate.Key(DIK_UP) And (Y1Map - 32) >= 0 Then
            Y1Map = Y1Map - 32
            Y2Map = Y2Map - 32
    ElseIf DIstate.Key(DIK_DOWN) And (Y2Map + 32) <= (((UBound(Map, 2) + 1) * 32)) Then
            Y1Map = Y1Map + 32
            Y2Map = Y2Map + 32
    ElseIf DIstate.Key(DIK_LEFT) And (X1Map - 32) >= 0 Then
            X1Map = X1Map - 32
            X2Map = X2Map - 32
    ElseIf DIstate.Key(DIK_RIGHT) And (X2Map + 32) <= (UBound(Map, 1) * 32) Then
            X1Map = X1Map + 32
            X2Map = X2Map + 32
    End If
End Function

Cette fonction doit être appelé dans la boucle d?affichage.
Le code est très simple, les condition du type (Y2Map + 32) <= (((UBound(Map, 2) + 1) * 32)) permette de ne pas sortir de la surface Background, donc de la map.

Conclusion :


Pour mieux comprendre ce tutorial je vous propose un exemple, qui utilise une map faite par Simon22, que je remercie beaucoup surtout que sa map est d?une bonne qualité pour un simple exemple.

Je pense développer mes prochains tuto sur les matrices de collisions et sur l?utilisation d?une matrice de tile pour ne plus avoir 100 milles fichiers par map.

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.