Directx tuto 10 : les différents blit de surface

Description

  • Je suppose que vous avez les connaissances de mes précédents tutoriaux.*


Dans ce tuto je vais vous montrer l?utilisation de quelque type de blit d?une surface vers la backbuffer. Ces différentes méthodes permettent l?utilisation d?une image au lieu de deux dans certain cas. Exemples : Vous avez un combattant il vous faut les pas de droite à gauche et ce de gauche à droite or grâce à ces différent blitting seul un des deux vous suffiront. Donc l?intérêt est dans l?optimisation du poids du code et de la ressource en mémoire vive demandé.

Source / Exemple :


Je vais juste donner les nouvelles variables ainsi que les différentes déclarations et utilisation. Je ne reviens donc pas sur l?initialisation de DirectX et de DirectDraw ainsi que sur le chargement d?une image en surface.

Seulement deux nouvelles variables :

Public BltFxMIRRORLEFTRIGHT  As DDBLTFX
Public BltFxMIRRORUPDOWN As DDBLTFX

La première pour faire une symétrie verticale, la deuxième pour une symétrie horizontale.

L?initialisation obligatoire pour c?est deux variables :

BltFxMIRRORLEFTRIGHT.lDDFX = DDBLTFX_MIRRORLEFTRIGHT
BltFxMIRRORUPDOWN.lDDFX = DDBLTFX_MIRRORUPDOWN

Et maintenant les différents types de modification :

BltFast permet de copier rapidement une surface sur le backbuffer, sans modification possible sur la surface mis à part le color key

Backbuffer.BltFast 0, 0, sVoiture, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
        
La série BltFx, tout d?abord la déclaration générale.

Backbuffer.BltFx RectangleDestination, Surface, RectangleSource, TypeD?Affichage, ModificationImage

Alors les Rectangles sont construit à partir de la fonction ddRect(x1,y1,x2, y2)
Dans le cas de la destination choisissez un x1 et un y1 correspondant à la position de l?image sur l?écran, puis pour x2 et y2 ajouter les dimensions de la surface à x1 et y1

Exemple :
J?ai une surface qui fait 210 de longueur sur 250 de hauteur et je veux la placer sur l?écran au point x = 100 et y = 100

On aura : ddRect(100,100, 100 + 210, 100 +250)

Pour le rectangle source pour avoir la surface en entière utiliser ceci : ddRect(0,0,0,0)

Puis pour le type d?affichage, généralement on utilise DDBLT_WAIT pour un affichage traditionnel additionné à DDBLT_KEYSRC pour le color key et à DDBLT_DDFX pour la modification.
Enfin on met le type de modification en dernier.

Une astuce à connaître :
Si vous ne savez pas qu?elle est la taille de l?image pour le rectangle de destination utiliser pour x2 et y2 : x2 = x1 + ddsdSurface.lWidth et y2 =  y1 + ddsdSurface.lHeigh

Avec ddsdSurface le descripteur de votre surface.

Maintenant les deux modification :

Symétrie verticale
Backbuffer.BltFx ddRect(0, 100, 216, 100 + 86), sVoiture, ddRect(0, 0, 0, 0), DDBLT_WAIT Or DDBLT_KEYSRC Or DDBLT_DDFX, BltFxMIRRORLEFTRIGHT

Symétrie horizontale        
Backbuffer.BltFx ddRect(0, 200, 216, 200 + 86), sVoiture, ddRect(0, 0, 0, 0), DDBLT_WAIT Or DDBLT_KEYSRC Or DDBLT_DDFX, BltFxMIRRORUPDOWN

La fonction Blt, elle s?utilise comme BltFx sauf qu?on ne met pas de modification à la fin.

Agrandir une image (multiplier par 2)
Backbuffer.Blt ddRect(300, 0, 300 + (216 * 2), (86 * 2)), sVoiture, ddRect(0, 0, 0, 0), DDBLT_WAIT Or DDBLT_KEYSRC

Rétrécir un image (par 2)
Backbuffer.Blt ddRect(300, 200, 300 + (216 / 2), 200 + (86 / 2)), sVoiture, ddRect(0, 0, 0, 0), DDBLT_WAIT Or DDBLT_KEYSRC

Ici préférer *0.5 plutot que /2 ou à la limite \2 car c'est plus rapide.

Agrandir que en x (longueur)
Backbuffer.Blt ddRect(300, 300, 300 + (216 * 2), 300 + 86), sVoiture, ddRect(0, 0, 0, 0), DDBLT_WAIT Or DDBLT_KEYSRC

Agrandir que en y (hauteur)
Backbuffer.Blt ddRect(300, 400, 300 + 216, 400 + (86 * 2)), sVoiture, ddRect(0, 0, 0, 0), DDBLT_WAIT Or DDBLT_KEYSRC
        
Vous pouvez combinez les déformations avec les symétries.

Enfin la dernière importante : BltColorFill
Vous mettez en premier le rectangle de destination puis la couleur que vous souhaitez.

Backbuffer.BltColorFill ddRect(0, 400, 100, 500), RGB(150, 200, 66)

Conclusion :


J?espère que ce petit tuto vous aura était utile. Pour toute question n?hésitez pas. J?ai déposé une source avec c tuto comme ça vous avez un exemple de référence.

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.