Ce projet écrit à l'origine en WD12 avec GDImage 5.07,
montre comment réaliser un contrôle de type "champ cube" avec GDImage 7.16 en mode 64-bit.
Caractéristiques principales :
1 - Contrairement au "champ Cube" de décor WinDev, nul besoin d'installer le framework DotNET (donc, pas d'attente lors du lancement initial).
2 - Vous pouvez interagir avec le cube et ses clones.
3 - Chaque face du cube peut afficher une image différente.
4 - En cliquant (bouton droit de la souris) sur une face du cube principal (le plus gros) vous pouvez changer l'image de fond.
5 - Vous pouvez déplacer le cube à n'importe quel endroit dans le champ GDImage avec la souris.
6 - La fonction "clone*" (spécifique de GDImage) vous permet d'avoir plusieurs cubes animés qui fonctionnent en même temps.
Parallèlement ce projet montre comment effectuer une sélection avec la souris sur un objet 3D comportant plusieurs textures.
Dans le monde de la 3D, le moyen usuel d'effectuer une sélection sur un objet en mouvement se nomme : "Picking".
Cependant cette technique, basée sur l'éloignement des différents objets par rapport à la caméra, ne permet pas de connaître avec certitude l'endroit précis correspondant aux coordonnées de la souris.
J'ai donc été obligé d'utiliser une autre méthode appelée "color detection".
Avec cette méthode, lorsqu'on est en mode "HitDetection", on utilise une couleur unique pour chaque face du cube au lieu d'y "mapper" les textures.
Ensuite, il suffit de tester la couleur du point survolé par la souris, pour connaître la face correspondante.
L'affectation des couleurs est effectuée dans la procédure "DrawCube" : variable HitDetection.
La détection proprement dite de "HitDetection" est effectuée dans la procédure "RenderAnimation" :
Cette version est écrite pour VS2022, le code est linké avec TClib.lib pour produire un EXE de petite taille (16 Ko).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // Process the hit detection to change the background image if (HitDetection) { ZD_GetObjectXY(IDS_3DOBJECT, x, y); GetCursorPos(&lp); GetWindowRect(zGetMainItem(ID_CTRL), &rw); mX = lp.x - (rw.left + x); mY = lp.y - (rw.top + y); zSplitColorARGB(GetPixel(gP.GLbitmapDC, mX, mY), A, ID, G, B); // WinLIFT API to update the image background skUseThisBackground(gP.hMain, gP.tex[ID].FullName); } else { // Paint the resulting OpenGL bitmap to our window ZD_ReplaceObjectBitmap(ZI_CreateBitmapFromImage(zBitmapToImage( gP.GLbitmapDC )), IDS_3DOBJECT, TRUE); }
Les objets 3D sont générés directement dans le champ GDImage, ce qui permet de mélanger 2D et 3D dans le même contrôle.
clone* :
Un clone est un sprite qui duplique les proriétés d'un objet GDImage, en réutilisant le même bitmap pour optimiser la mémoire.
Partager