Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
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 !
TUTO TILE 7 : PASSAGE À L'ISOMÉTRIQUE
Information sur la source
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
- 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
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.
Fichier Zip
Historique
- 03 mai 2007 15:29:54 :
- Face au bonne remarque de Renfield j'ai apporté une petite mise à jour, du code et du zip, pour que celui ci soit optimisé au mieu.
- 03 mai 2007 15:40:14 :
- Une petite erreur ^^.
Sources de la même categorie
Commentaires
Discussions en rapport avec ce code source
|
CalendriCode
| | | L | M | M | J | V | S | D |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | | | | | |
|
Téléchargements
Logiciels à télécharger sur le même thème :
|