Tuto tile 7 : passage à l'isométrique

Soyez le premier à donner votre avis sur cette source.

Vue 9 588 fois - Téléchargée 465 fois

Description

Bonjour, je suppose que vous disposez des connaissances de mes précédents tuto (ici le premier tuto sur Direct Draw suffit).

Ce code sert à transformer vos tiles (axométrique) en isométrique (losange).

L'interet de ce code est qu'il utilise uniquement DirectDraw pour les transformations, et qu'il ne passe pas par une méthode 3d pour la transformation.

Source / Exemple :


Ici je vous donne simplement la fonction de transformation, dans le zip vous disposez d'un exemple complet.

Private Const CosAngleRad As Double = 0.707106781114032
Private Const SinAngleRad As Double = 0.707106781259063

Public Function AxoToIso(SSrc As DirectDrawSurface7, ddsdSrc As DDSURFACEDESC2, SDest As DirectDrawSurface7, ddsdDest As DDSURFACEDESC2)
    
    Dim Pixel As Long           'Couleur d'un pixel
    Dim x As Long, y As Long    'Coordonnées source
    Dim x2 As Long, y2 As Long  'Nouvelle coordonnées
    Dim SrcHeightDiv1 As Double
    Dim YSinAngle As Double, YCosAngle As Double
    Dim SrcHeight As Long
    Dim SrcWidth As Long
    
    With SDest
    
        'On bloque les surfaces en mémoire pour qu'elle ne soit plus modifiable
        'les surfaces sont bloqués entierement (ddrect(0,0,0,0)), et ne sont accessible que en lecture
        SSrc.Lock ddRect(0, 0, 0, 0), ddsdSrc, DDLOCK_READONLY Or DDLOCK_WAIT, 0
        .Lock ddRect(0, 0, 0, 0), ddsdDest, DDLOCK_READONLY Or DDLOCK_WAIT, 0
            
        SrcHeight = ddsdSrc.lHeight - 1
        SrcWidth = ddsdSrc.lWidth - 1
        'Optimisation
        SrcHeightDiv1 = ((SrcHeight + 1) *0.666666666666667) + 1
        
        'Pour tous les pixel du tile
        For y = 0 To SrcWidth
            
            'Optimisation
            YSinAngle = y * SinAngleRad
            YCosAngle = y * CosAngleRad
            
            For x = 0 To SrcHeight
                
                'On récupere la couleur du pixel
                Pixel = SSrc.GetLockedPixel(x, y)
                'On calcul les nouvelle coordonnée suivant les formules trigonométrique
                x2 = ((x * CosAngleRad) - YSinAngle) + SrcHeightDiv1
                y2 = ((x * SinAngleRad) + YCosAngle) * 0.5
                
                'Cette condition n'est pas du tout necessaire, c'est juste pour obtenir un tile isométrique plus jolie
                If x2 = 36 And y2 = 15 Then
                    
                    'Si la condition est vrai on copie deux fois le pixel avec un pixel de difference à droite
                    .SetLockedPixel x2, y2, Pixel
                    .SetLockedPixel x2 + 1, y2, Pixel
                    
                Else
                    
                    'Autrement on copie normalement le pixel
                    .SetLockedPixel x2, y2, Pixel
                    
                End If
                
            Next
            
        Next
        
        'On debloque les surfaces
        SSrc.Unlock ddRect(0, 0, 0, 0)
        .Unlock ddRect(0, 0, 0, 0)
        
    End With
End Function

Conclusion :


La fonction du zip est legerement differente car l'angle de transformation isométrique n'est pas directement integrer.

Le passage à l'isométrique est effectué ainsi : rotation de 45°puis division de la hauteur par 2.

( Remarque : Lors d'une rotation des pixel vide apparaissent, cela est du à l'agrandissement de l'image par rotation, pour palier à cela il est necessaire d'agrandir l'image 1.5 fois avant la rotation puis de reduire 1.75 fois apres. )

Il est notable que DirectDraw dispose d'une fonction pour effectuer directement les rotations via une accélération materielle, mais il semblerait que peut de carte graphique supporte cette accélération.

Dans le zip je vous ai mis un logiciel qui effectue la même transformation via un BitBlt et qui permet de voir la difference entre les deux types d'affichage.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010

a ok je comprend mieu ^^.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
décalage des bits.

coté maths, ca multiplie (shift a gauche) ou divise (shift a droite) par deux...

00001000 <<
donne
00010000

etc.

si tu fais des opéations de multiplication(ou division) par des multiples de deux, dans des langages qui permettent les shifts, tu y gagne en perfs.
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010

C'est quoi un shift en asm ?
Messages postés
342
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
6 novembre 2012

ah d'accord, pas de shift en VB :(
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010

Si si moi aussi j'ai lu que les multiplications sont plus rapides que les division en vb.
Afficher les 13 commentaires

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.