Vraiment belle lurette que je n'ai pas fait un petit post ici... Donc pour fêter cela je joins une première ébauche pour un programme de DAO 2D (Ca fait un moment que ça me trotte). Actuellement celui-ci gère :
- Zoom à la molette
- Zoom Fenêtre (touche Z")
- Panoramique (Souris Bouton du milieu)
- Tracé de Lignes (Touche L)
- Tracé de Cercles (Touche C)
Bon il me reste beaucoup beaucoup de travail pour en faire un truc exploitable, mais je me pose plusieurs questions auxquelles vous pourrez peut être me répondre :
- Actuellement je dessine le curseur non pas dans le "Screen" mais directement sur le fenêtre ceci afin d'éviter à devoir tout redessiner à chaque mouvement de souris. Idem pour le tracé de lignes et de cercles. Je ne les intègre au "Screen" qu'une fois leur tracé terminé. Cela dit, cette méthode pour le moins "bizarre" ne me plait pas vraiment (le curseur clignote parfois, et ce la me limite à commencer et finir une ligne dans l'espace de la fenetre...) et je me demande s'il existe une méthode un peu moins cavalière... (une sorte de triple buffer

- Existe t il une méthode "simple" pour redimensionner le "Screen" avec la fenêtre ? J'ai bien trouvé des trucs mais celà me semble bien compliqué pour ma petite tête...
- Je compte à présent m'attaquer à la sélection d'objets et j'ai déjà les gouttes qui perlent sur mon front rien que d'y penser... Le première méthode que me viens à l'esprit et la comparaison des coordonnées de la souris avec toutes les coordonnées de tous les objets présent dans la scène (du moins visible à l'écran). Autant avec peu d'objets cela me semble gérable autant avec un nombre importants d'objets qui risquent en plus de se superposer cette méthode brute me semble obsolète. Donc si qq à une vague idée de tactique à adopter je suis preneur...
- Bon plein d'autre problèmes mais je vais m’arrêter là pour l'instant

Merci,
Bye
Code : Tout sélectionner
; ------------------------------------------------------------
; MiniCAD
; Torp (2010)
;
; Gestion WindowedScreen + Gadgets By Netmaestro
; ------------------------------------------------------------
; Fenetres
Enumeration
#Win_Main
EndEnumeration
; StatusBar
Enumeration
#StatusBar
EndEnumeration
; ChampsStatusBar
Enumeration
#StB_WorldXY
#StB_ScreenXY
EndEnumeration
; -----
; Indentifiants des entités
; -----
Enumeration
#Ent_Line
#Ent_Rectangle
#Ent_Circle
#Ent_Text
EndEnumeration
; Diverses Constantes
#LeftOffset = 0
#TopOffset = 0
; -
; Définitions Structures
; -
;{ Structure Windows }
Structure Str_Windows
ID.i ;// Identifiant Fenetre
x_Pos.i ;// Position X
y_Pos.i ;// Position Y
x_Size.i ;// Taille X
y_Size.i ;// Taille Y
Name.s{255} ;// Titre
Options.i ;// Options
ParentID.i ;// ID Parent
EndStructure
Global Win_Main.Str_Windows
;Global Win_Command.Str_Windows
;}
;{ Structure Entités }
Structure Lst_Entity
EntType.w ;// Type d'entité (#Ligne, #Cercle, #Rectangle, ...)
Identity.i ;// N° Unique d'identification
xW_Start.d ;// Coordonnée absolue
yW_Start.d ;// Coordonnée absolue
xW_End.d ;// Coordonnée absolue
yW_End.d ;// Coordonnée absolue
xS_Start.i ;// Coordonnée Ecran
yS_Start.i ;// Coordonnée Ecran
xS_End.i ;// Coordonnée Ecran
yS_End.i ;// Coordonnée Ecran
rW_Rayon.d ;// Rayon Cercle Monde
rS_Rayon.i ;// Rayon Cercle Ecran
Layer.s{255} ;// Calque
Color.i ;// Couleur
Width.b ;// Epaisseur
Style.i ;// Style de Ligne
EndStructure
Structure Str_Entity
Nbr_Entity.i ;// Nombre d'Entité dans le dessin
List Entity.Lst_Entity()
EndStructure
Define Drawing.Str_Entity
;}
;{ Structure SCU }
Structure Str_SCU
xW_Origin.d ;// Origine X du Monde
yW_Origin.d ;// Origine Y du Monde
xS_Origin.i ;// Origine X du Monde
yS_Origin.i ;// Origine Y du Monde
Nbr_Elements.b ;// Nombre d'éléments composants l'icone SCU
xW_IconStart.d[10] ;// Coordonnée absolue
yW_iconStart.d[10] ;// Coordonnée absolue
xW_IconEnd.d [10] ;// Coordonnée absolue
yW_IconEnd.d [10] ;// Coordonnée absolue
xS_IconStart.i[10] ;// Coordonnée absolue
yS_iconStart.i[10] ;// Coordonnée absolue
xS_IconEnd.i [10] ;// Coordonnée absolue
yS_IconEnd.i [10] ;// Coordonnée absolue
Color.i ;// Couleur
OnOff.b ;// Actif/Inactif
EndStructure
Define IconSCU.Str_SCU
;}
;{ Structure Zoom Fenetre }
Structure Str_WinZoom
xW_Start.d ;// Coordonnée X absolue Premier coin
yW_Start.d ;// Coordonnée Y absolue Premier coin
xW_End.d ;// Coordonnée X absolue Second coin
yW_End.d ;// Coordonnée Y absolue Second coin
xS_Start.i ;// Coordonnée X Ecran Premier coin
yS_Start.i ;// Coordonnée Y Ecran Premier coin
xS_End.i ;// Coordonnée X Ecran Second coin
yS_End.i ;// Coordonnée X Ecran Second coin
Window.b ;// Dessin de la Fenetre de Zoom Oui/Non
Color.i ;// Couleur du contour de la fenetre de Zoom
EndStructure
Global Win_Zoom.Str_WinZoom
;}
;{ Structure Screen }
Structure Str_Screen
xW_Start.d ;// Coordonnée X absolue Coin inférieur Gauche Ecran
yW_Start.d ;// Coordonnée Y absolue Coin inférieur Gauche Ecran
xW_End.d ;// Coordonnée X absolue Coin supérieur Droit Ecran
yW_End.d ;// Coordonnée Y absolue Coin supérieur Droit Ecran
x_Size.i ;// Largueur Screen
y_Size.i ;// Hauteur Screen
Ratio.d ;// Ratio Hauteur/Largeur
Col_Bkgd.i ;// Couleur de Fond
EndStructure
Global Screen.Str_Screen
;}
;{ Structure Mouse }
Structure Str_Mouse
x_Wld.d ;// Coordonnée X absolue
y_Wld.d ;// Coordonnée Y absolue
x_Scr.i ;// Coordonnée X Ecran
y_Scr.i ;// Coordonnée Y Ecran
x_Prv.i ;// Coordonnée X Ecran précédente
y_Prv.i ;// Coordonnée Y Ecran précédente
x_Win.i ;// Coordonnée X Fenetre
y_Win.i ;// Coordonnée Y Fenetre
Color.i ;// Couleur du Curseur
Cible.i ;// Cible de recherche du curseur
Cible_On.b ;// Active ou désactive l'affichage de la cible
Zoom_Factor.f ;// Facteur de Zoom molette souris
EndStructure
Global Mouse.Str_Mouse
;}
;{ Structure Scene }
Structure Str_Scene
;InScreeen
In_Screen.b ;// Souris dans le Screen Oui/Non
; Refresh
Refresh.b ;// Rafraichissement de la Scene Oui/Non
; Line
Trace_Line.b ;// Trace une ligne Oui/Non
; Cercle
Trace_Circle.b ;// Trace Cercle Oui/Non
; Coordonnées Temporaires
xS_Temp.i ;// Coordonnée X Ecran
yS_Temp.i ;// Coordonnée Y Ecran
xW_Temp.d ;// Coordonnée X absolue
yW_Temp.d ;// Coordonnée Y absolue
rS_Temp.i ;// Rayon Cercle Ecran
rW_Temp.d ;// Rayon Cercle absolue
EndStructure
Define Scene.Str_Scene
;}
;{ Divers }
Global CallBack_Msg.MSG
;}
Declare.b INIT_SYSTEM()
Declare.b CREATE_WIN_MAIN()
Declare.b CREATE_WIN_COMMAND()
Declare.b ZOOM_WINDOW()
Declare.b ADD_LINE(*Drawing.Str_Entity, *Scene.Str_Scene)
Declare.f DISTANCE(x1.i, y1.i, x2.i, y2.i)
Declare TRANSLATION()
Declare WORLD2SCREEN(*Drawing.Str_Entity, *Scu.Str_SCU, *Scene.Str_Scene)
Declare MOUSE2WORLD()
Declare ZOOM_WHEEL(Zoom.f)
Procedure.b INIT_SYSTEM()
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite3D() = 0
ProcedureReturn #False
Else
ProcedureReturn #True
EndIf
EndProcedure
Procedure.b CREATE_WIN_MAIN()
If OpenWindow(Win_Main\ID, Win_Main\x_Pos, Win_Main\y_Pos, Win_Main\x_Size, Win_Main\y_Size, Win_Main\Name, Win_Main\Options)
If CreateStatusBar(#StatusBar, WindowID(Win_Main\ID))
AddStatusBarField(250)
AddStatusBarField(150)
AddStatusBarField(150)
AddStatusBarField(150)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure.b CREATE_WIN_COMMAND()
If OpenWindow(Win_Main\ID, Win_Main\x_Pos, Win_Main\y_Pos, Win_Main\x_Size, Win_Main\y_Size, Win_Main\Name, Win_Main\Options)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure TRANSLATION()
Protected.d DeltaX, DeltaY
DeltaX = Mouse\x_Prv - Mouse\x_Wld
DeltaY = Mouse\y_Prv - Mouse\y_Wld
If DeltaX<>0 Or DeltaY <>0
Screen\xW_Start = Screen\xW_Start + DeltaX ; coordonées de l'écran par rapport
Screen\yW_Start = Screen\yW_Start + DeltaY ; au 0,0 du monde
Screen\xW_End = Screen\xW_End + DeltaX ; coordonées de l'écran par rapport
Screen\yW_End = Screen\yW_End + DeltaY ; au 0,0 du monde
EndIf
EndProcedure
Procedure ZOOM_WHEEL(Zoom.f)
Protected.d DeltaX, DeltaY
DeltaX = Mouse\x_Wld * Zoom - Mouse\x_Wld ; Afin que le zoom soit sensible à la position de la souris
DeltaY = Mouse\y_Wld * Zoom - Mouse\y_Wld ; on calcule de combien il va falloir recaler l'écran
With Screen
\xW_Start = \xW_Start * Zoom - DeltaX
\yW_Start = \yW_Start * Zoom - DeltaY
\xW_End = \xW_End * Zoom - DeltaX
\yW_End = \yW_End * Zoom - DeltaY
EndWith
EndProcedure
Procedure.b ZOOM_WINDOW()
Protected.d Ratio, Distance
Static.b Click_Nb
Click_Nb + 1
Select Click_Nb
Case 1 ;<---------- Premier Click
With Win_Zoom
\xS_Start = Mouse\x_Scr ;Coordonnée Xécran du début de la fenetre
\yS_Start = Mouse\y_Scr ;Coordonnée Yécran du début de la fenetre
\xW_Start = Mouse\x_Wld ;Coordonnée Xmonde du début de la fenetre
\yW_Start = Mouse\y_Wld ;Coordonnée Ymonde du début de la fenetre
EndWith
ProcedureReturn Click_Nb
Case 2 ;<---------- Second Click
With Win_Zoom
\xS_End = Mouse\x_Scr ;Coordonnée Xécran de la fin de la fenetre
\yS_End = Mouse\y_Scr ;Coordonnée Yécran de la fin de la fenetre
\xW_End = Mouse\x_Wld ;Coordonnée Xmonde de la fin de la fenetre
\yW_End = Mouse\y_Wld ;Coordonnée Ymonde de la fin de la fenetre
; Eventuelle inversion des valeurs afin que la fenetre de Zoom
; soit toujours (angle inf. gauche VERS angle sup. droit)
If \xW_End < \xW_Start : Swap \xS_Start, \xS_End : Swap \xW_Start, \xW_End : EndIf
If \yW_End < \yW_Start : Swap \yS_Start, \yS_End : Swap \yW_Start, \yW_End : EndIf
;Rectification de l'Aspect Ratio de la fenetre de Zoom
;afin de le faire correspondre à celui de la Fenetre (Win)
Ratio = (\xW_End - \xW_Start) / (\yW_End - \yW_Start)
If Ratio <> Screen\Ratio
If Ratio > Screen\Ratio
Distance = ((\xW_End - \xW_Start) - ((\yW_End - \yW_Start) * Screen\Ratio)) / 2
\xW_End = \xW_End - Distance
\xW_Start = \xW_Start + Distance
Distance = ((\xW_End - \xW_Start) - (\yW_End - \yW_Start)) / 2
Else
Distance = ((\yW_End - \yW_Start) - ((\xW_End - \xW_Start) / Screen\Ratio)) / 2
\yW_End = \yW_End - Distance
\yW_Start = \yW_Start + Distance
Distance = ((\yW_End - \yW_Start) - (\xW_End - \xW_Start)) / 2
EndIf
EndIf
EndWith
With Screen
\xW_Start = Win_Zoom\xW_Start
\yW_Start = Win_Zoom\yW_Start
\xW_End = Win_Zoom\xW_End
\yW_End = Win_Zoom\yW_End
EndWith
Click_Nb = 0
ProcedureReturn Click_Nb
EndSelect
EndProcedure
Procedure WORLD2SCREEN(*Drawing.Str_Entity, *Scu.Str_SCU, *Scene.Str_Scene)
Protected.d Sx1, Sy1, Tx1, Ty1
Protected.i i
Sx1 = 1 / (Screen\xW_End - Screen\xW_Start)
Sy1 = 1 / (Screen\yW_End - Screen\yW_Start)
Tx1 = -Sx1 * Screen\xW_Start
Ty1 = -Sy1 * Screen\yW_Start
;Mise à jour des Entités
FirstElement(*Drawing\Entity())
With *Drawing\Entity()
For i = 1 To *Drawing\Nbr_Entity
\xS_Start = (Screen\x_Size * Sx1 * \xW_Start + (Screen\x_Size * Tx1))
\yS_Start = Screen\y_Size - (Screen\y_Size * Sy1 * \yW_Start + (Screen\y_Size * Ty1)) ;ScreenH car le 0 de l'écran est en haut contrairement au repère de calculs
\xS_End = (Screen\x_Size * Sx1 * \xW_End + (Screen\x_Size * Tx1))
\yS_End = Screen\y_Size - (Screen\y_Size * Sy1 * \yW_End + (Screen\y_Size * Ty1)) ;ScreenH car le 0 de l'écran est en haut contrairement au repère de calculs
If *Drawing\Entity()\EntType = #Ent_Circle
\rS_Rayon = \xS_End - \xS_Start
EndIf
NextElement(*Drawing\Entity())
Next i
EndWith
;Mise à jour du SCU
*Scu\xS_Origin = (Screen\x_Size * Sx1 * *Scu\xW_Origin + (Screen\x_Size * Tx1))
*Scu\yS_Origin = Screen\y_Size - (Screen\y_Size * Sy1 * *Scu\yW_Origin + (Screen\y_Size * Ty1))
For i = 0 To *Scu\Nbr_Elements
*Scu\xS_IconStart [i] = (Screen\x_Size * Sx1 * *Scu\xW_IconStart[i] + (Screen\x_Size * Tx1))
*Scu\yS_IconStart [i] = Screen\y_Size - (Screen\y_Size * Sy1 * *Scu\yW_iconStart[i] + (Screen\y_Size * Ty1))
*Scu\xS_IconEnd [i] = (Screen\x_Size * Sx1 * *Scu\xW_IconEnd[i] + (Screen\x_Size * Tx1))
*Scu\yS_IconEnd [i] = Screen\y_Size - (Screen\y_Size * Sy1 * *Scu\yW_IconEnd[i] + (Screen\y_Size * Ty1))
Next i
EndProcedure
Procedure MOUSE2WORLD()
Protected.d Sx1, Sy1, Tx1, Ty1
Sx1 = 1 / (Screen\xW_End - Screen\xW_Start)
Sy1 = 1 / (Screen\yW_End - Screen\yW_Start)
Tx1 = -Sx1 * Screen\xW_Start
Ty1 = -Sy1 * Screen\yW_Start
Mouse\x_Wld = (Mouse\x_Scr - (Screen\x_Size * Tx1)) / (Screen\x_Size * Sx1)
Mouse\y_Wld = (Screen\y_Size - Mouse\y_Scr - (Screen\y_Size * Ty1)) / (Screen\y_Size * Sy1)
Mouse\x_Prv = (Mouse\x_Prv - (Screen\x_Size * Tx1)) / (Screen\x_Size * Sx1)
Mouse\y_Prv = (Screen\y_Size - Mouse\y_Prv - (Screen\y_Size * Ty1)) / (Screen\y_Size * Sy1)
StatusBarText(#StatusBar, #StB_WorldXY, "World Coord.: " + StrD(Mouse\x_Wld, 2) + ", " + StrD(Mouse\y_Wld, 2))
StatusBarText(#StatusBar, #StB_ScreenXY, "Screen Coord.: " + Str(Mouse\x_Scr) + ", " + Str(Mouse\y_Scr))
EndProcedure
Procedure.b ADD_LINE(*Drawing.Str_Entity, *Scene.Str_Scene)
Static.b Click_Nb
Click_Nb + 1
Select Click_Nb
Case 1
With *Scene
\xS_Temp = Mouse\x_Scr
\yS_Temp = Mouse\y_Scr
\xW_Temp = Mouse\x_Wld
\yW_Temp = Mouse\y_Wld
EndWith
ProcedureReturn Click_Nb
Case 2
AddElement(*Drawing\Entity())
With *Drawing\Entity()
\EntType = #Ent_Line
\Identity = 0
\Color = #White
\Style = #PS_COSMETIC
\xS_Start = *Scene\xS_Temp
\yS_Start = *Scene\yS_Temp
\xS_End = Mouse\x_Scr
\yS_End = Mouse\y_Scr
\xW_Start = *Scene\xW_Temp
\yW_Start = *Scene\yW_Temp
\xW_End = Mouse\x_Wld
\yW_End = Mouse\y_Wld
EndWith
*Drawing\Nbr_Entity + 1
Click_Nb = 0
ProcedureReturn Click_Nb
EndSelect
EndProcedure
Procedure ADD_CIRCLE(*Drawing.Str_Entity, *Scene.Str_Scene)
Static.b Click_Nb
Click_Nb + 1
Select Click_Nb
Case 1
With *Scene
\xS_Temp = Mouse\x_Scr
\yS_Temp = Mouse\y_Scr
\xW_Temp = Mouse\x_Wld
\yW_Temp = Mouse\y_Wld
EndWith
ProcedureReturn Click_Nb
Case 2
AddElement(*Drawing\Entity())
With *Drawing\Entity()
\EntType = #Ent_Circle
\Identity = 0
\Color = #White
\Style = #PS_COSMETIC
\xS_Start = *Scene\xS_Temp
\yS_Start = *Scene\yS_Temp
\xW_Start = *Scene\xW_Temp
\yW_Start = *Scene\yW_Temp
\rS_Rayon = Sqr((*Scene\xS_Temp - Mouse\x_Scr) * (*Scene\xS_Temp - Mouse\x_Scr) + (*Scene\yS_Temp - Mouse\y_Scr) * (*Scene\yS_Temp - Mouse\y_Scr))
\rW_Rayon = Sqr((*Scene\xW_Temp - Mouse\x_Wld) * (*Scene\xW_Temp - Mouse\x_Wld) + (*Scene\yW_Temp - Mouse\y_Wld) * (*Scene\yW_Temp - Mouse\y_Wld))
\xW_End = \xW_Start + \rW_Rayon
EndWith
*Drawing\Nbr_Entity + 1
Click_Nb = 0
ProcedureReturn Click_Nb
EndSelect
EndProcedure
Macro Mcr_MOUSE2WORLD
Protected.d Sx1, Sy1, Tx1, Ty1
Sx1 = 1 / (Screen\xW_End - Screen\xW_Start)
Sy1 = 1 / (Screen\yW_End - Screen\yW_Start)
Tx1 = -Sx1 * Screen\xW_Start
Ty1 = -Sy1 * Screen\yW_Start
Mouse\x_Wld = (Mouse\x_Scr - (Screen\x_Size * Tx1)) / (Screen\x_Size * Sx1)
Mouse\y_Wld = (Screen\y_Size - Mouse\y_Scr - (Screen\y_Size * Ty1)) / (Screen\y_Size * Sy1)
Mouse\x_Prv = (Mouse\x_Prv - (Screen\x_Size * Tx1)) / (Screen\x_Size * Sx1)
Mouse\y_Prv = (Screen\y_Size - Mouse\y_Prv - (Screen\y_Size * Ty1)) / (Screen\y_Size * Sy1)
StatusBarText(#StatusBar, #StB_WorldXY, "World Coord.: " + StrD(Mouse\x_Wld, 2) + ", " + StrD(Mouse\y_Wld, 2))
StatusBarText(#StatusBar, #StB_ScreenXY, "Screen Coord.: " + Str(Mouse\x_Scr) + ", " + Str(Mouse\y_Scr))
EndMacro
;-
;- Init Valeurs
;-
;{ Fenetre Principale }
Global Desk_Nb.b = ExamineDesktops()
Win_Main\ID = 0
Win_Main\x_Pos = 0
Win_Main\y_Pos = 0
Win_Main\x_Size = DesktopWidth(0) - 100
Win_Main\y_Size = DesktopHeight(0) - 100
Win_Main\Name = "MiniCAD"
Win_Main\Options = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered
Win_Main\ParentID = 0
;}
;{ Définition du SCU }
IconSCU\Nbr_Elements = 9 ;// Nombre d'éléments composant le SCU à dessiner (en partant de 0)
IconSCU\xW_Origin = 0
IconSCU\xW_Origin = 0
IconSCU\OnOff = #True
IconSCU\Color = #Yellow
;Dessin du SCU Flèche 1
IconSCU\xW_IconStart[0] = IconSCU\xW_Origin
IconSCU\yW_IconStart[0] = IconSCU\yW_Origin
IconSCU\xW_IconEnd[0] = IconSCU\xW_Origin + 50
IconSCU\yW_IconEnd[0] = IconSCU\yW_Origin
IconSCU\xW_IconStart[1] = IconSCU\xW_Origin + 35
IconSCU\yW_IconStart[1] = IconSCU\yW_Origin + 7
IconSCU\xW_IconEnd[1] = IconSCU\xW_Origin + 50
IconSCU\yW_IconEnd[1] = IconSCU\yW_Origin
IconSCU\xW_IconStart[2] = IconSCU\xW_Origin + 35
IconSCU\yW_IconStart[2] = IconSCU\yW_Origin + 7
IconSCU\xW_IconEnd[2] = IconSCU\xW_Origin + 35
IconSCU\yW_IconEnd[2] = IconSCU\yW_Origin
;Dessin du SCU Flèche 2
IconSCU\xW_IconStart[3] = IconSCU\xW_Origin
IconSCU\yW_IconStart[3] = IconSCU\yW_Origin
IconSCU\xW_IconEnd[3] = IconSCU\xW_Origin
IconSCU\yW_IconEnd[3] = IconSCU\yW_Origin + 50
IconSCU\xW_IconStart[4] = IconSCU\xW_Origin + 7
IconSCU\yW_IconStart[4] = IconSCU\yW_Origin + 35
IconSCU\xW_IconEnd[4] = IconSCU\xW_Origin
IconSCU\yW_IconEnd[4] = IconSCU\yW_Origin + 50
IconSCU\xW_IconStart[5] = IconSCU\xW_Origin + 7
IconSCU\yW_IconStart[5] = IconSCU\yW_Origin + 35
IconSCU\xW_IconEnd[5] = IconSCU\xW_Origin + 0
IconSCU\yW_IconEnd[5] = IconSCU\yW_Origin + 35
;Dessin du SCU "X"
IconSCU\xW_IconStart[6] = IconSCU\xW_Origin + 55
IconSCU\yW_IconStart[6] = IconSCU\yW_Origin
IconSCU\xW_IconEnd[6] = IconSCU\xW_Origin + 65
IconSCU\yW_IconEnd[6] = IconSCU\yW_Origin + 10
IconSCU\xW_IconStart[7] = IconSCU\xW_Origin + 55
IconSCU\yW_IconStart[7] = IconSCU\yW_Origin + 10
IconSCU\xW_IconEnd[7] = IconSCU\xW_Origin + 65
IconSCU\yW_IconEnd[7] = IconSCU\yW_Origin
;Dessin du SCU "Y"
IconSCU\xW_IconStart[8] = IconSCU\xW_Origin
IconSCU\yW_IconStart[8] = IconSCU\yW_Origin + 55
IconSCU\xW_IconEnd[8] = IconSCU\xW_Origin + 10
IconSCU\yW_IconEnd[8] = IconSCU\yW_Origin + 65
IconSCU\xW_IconStart[9] = IconSCU\xW_Origin + 4
IconSCU\yW_IconStart[9] = IconSCU\yW_Origin + 60
IconSCU\xW_IconEnd[9] = IconSCU\xW_Origin
IconSCU\yW_IconEnd[9] = IconSCU\yW_Origin + 65
;}
;{ Définition SCREEN }
Screen\x_Size = Win_Main\x_Size - 100 ;Largeur de la Fenetre Screen
Screen\y_Size = Win_Main\y_Size - 23 ;Hauteur de la Fenetre Screen
Screen\xW_Start = 0 ;Coin inférieur Gauche X de l'écran est calé en 0,0 du monde
Screen\yW_Start = 0 ;Coin inférieur Gauche Y de l'écran est calé en 0,0 du monde
Screen\xW_End = Win_Main\x_Size - 100 ;Coin supérieur Droit X de l'écran correspond au départ à la Longueur de la Fenetre Screen
Screen\yW_End = Win_Main\y_Size - 23 ;Coin supérieur Droit Y de l'écran correspond au départ à la Hauteur de la Fenetre Screen
Screen\Ratio = Screen\x_Size / Screen\y_Size
Screen\Col_Bkgd = #Black
;}
;{ Définition Mouse & WinZoom}
Mouse\Color = #White ; Couleur du Curseur
Mouse\Cible = 9 ; Taille de la cible de recherche du Curseur
Mouse\Cible_On = #True ; Activation de la clible du curseur
Mouse\Zoom_Factor = 1.10 ; Facteur de Zoom
Win_Zoom\Window = #False ; Dessin de la Fenetre de Zoom Oui/Non
Win_Zoom\Color = #Blue ; Couleur du contour de la Fenetre de Zoom
;}
;{ Définition SCENE }
Scene\Refresh = #True
Scene\In_Screen = #False
Scene\Trace_Line = #False
;}
;{ Inialisation du Moteur }
WORLD2SCREEN(@Drawing, @IconSCU, @Scene)
;}
Procedure DRAW_SCENE(*Drawing.Str_Entity, *Scu.Str_SCU, *Scene.Str_Scene)
Protected.i i
If *Scene\Refresh = #True
*Scene\Refresh = #False
ClearScreen(Screen\Col_Bkgd)
FirstElement(*Drawing\Entity())
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Outlined)
For i = 1 To *Drawing\Nbr_Entity
Select *Drawing\Entity()\EntType
Case #Ent_Line
LineXY(*Drawing\Entity()\xS_Start, *Drawing\Entity()\yS_Start, *Drawing\Entity()\xS_End, *Drawing\Entity()\yS_End, *Drawing\Entity()\Color)
Case #Ent_Rectangle
;
Case #Ent_Circle
Circle(*Drawing\Entity()\xS_Start, *Drawing\Entity()\yS_Start, *Drawing\Entity()\rS_Rayon, *Drawing\Entity()\Color)
Case #Ent_Text
EndSelect
NextElement(*Drawing\Entity())
Next i
;- Dessin Icone SCU 0,0
For i = 0 To *Scu\Nbr_Elements
LineXY(*Scu\xS_IconStart[i], *Scu\yS_iconStart[i], *Scu\xS_IconEnd[i], *Scu\yS_IconEnd[i], *Scu\Color)
Next i
;- Affichage des coordonnées de l'écran dans le monde
DrawText(10,10,"Coord Ecran/monde : " + StrD(Screen\xW_Start, 2) + ", " + StrD(Screen\yW_Start, 2))
StopDrawing()
EndIf
;{ Tracé de certains éléments directement sur la Fenetre }
StartDrawing(WindowOutput(Win_Main\ID))
;- Dessin Zoom Fenetre
If Win_Zoom\Window = #True
DrawingMode(#PB_2DDrawing_Outlined)
Box(Win_Zoom\xS_Start, Win_Zoom\yS_Start, Mouse\x_Scr - Win_Zoom\xS_Start, Mouse\y_Scr - Win_Zoom\yS_Start, Win_Zoom\Color)
EndIf
;- Dessin d'une Ligne
If *Scene\Trace_Line = #True
DrawingMode(#PB_2DDrawing_Default)
LineXY(*Scene\xS_Temp, *Scene\yS_Temp, Mouse\x_Scr, Mouse\y_Scr, #White)
EndIf
;- Dessin Cercle
If *Scene\Trace_Circle = #True
DrawingMode(#PB_2DDrawing_Outlined)
*Scene\rS_Temp = Sqr((*Scene\xS_Temp - Mouse\x_Scr) * (*Scene\xS_Temp - Mouse\x_Scr) + (*Scene\yS_Temp - Mouse\y_Scr) * (*Scene\yS_Temp - Mouse\y_Scr))
LineXY(*Scene\xS_Temp, *Scene\yS_Temp, Mouse\x_Scr, Mouse\y_Scr, #White)
Circle(*Scene\xS_Temp, *Scene\yS_Temp, *Scene\rS_Temp, #White)
EndIf
;- Dessin du curseur
DrawingMode(#PB_2DDrawing_XOr)
Line(Mouse\x_Scr, 0, 1, Screen\y_Size, Mouse\Color)
Line(0, Mouse\y_Scr, Screen\x_Size, 1, Mouse\Color)
;- Dessin de la cible
If Mouse\Cible_On = #True
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_XOr)
Box(Mouse\x_Scr - Mouse\Cible/2, Mouse\y_Scr - Mouse\Cible/2, Mouse\Cible, Mouse\Cible, Mouse\Color)
EndIf
StopDrawing()
;}
FlipBuffers()
EndProcedure
Procedure GESTION_SCREEN(*Drawing.Str_Entity,*Scu.Str_SCU, *Scene.Str_Scene)
Static.b WinZoomStart = #False, LineStart = #False, Cde_Active =#False, CircleStart = #False, Wheel_Mouse
Static.i Timer1 = 0, Timer2 = 0
Protected.d Ratio, Distance
Protected.f Zoom
Protected.i Event_Scr, ElapsedTime = 200
If *Scene\In_Screen; manage mouse events only if mouse is inside screen
Event_Scr = WindowEvent() ;: Debug Event_Scr
ExamineMouse() : Wheel_Mouse = MouseWheel() : ExamineKeyboard()
; Conservation des coordonnées précédentes
Mouse\x_Prv = Mouse\x_Scr : Mouse\y_Prv = Mouse\y_Scr
; Avant l'attribution des nouvelles valeurs
Mouse\x_Scr = MouseX() : Mouse\y_Scr = MouseY()
;Macro de Conversion des Coordonées écran de la souris en Coordonnées absolues
Mcr_MOUSE2WORLD
;{ Gestion Clavier / Souris }
If MouseButton(#PB_MouseButton_Left)
If WinzoomStart = #True
If Timer1 = 0
If ZOOM_WINDOW() = 1
Win_Zoom\Window = #True
Timer1 = ElapsedMilliseconds()
Timer2 = ElapsedMilliseconds()
EndIf
EndIf
If (ElapsedMilliseconds()-Timer2 > ElapsedTime) And Timer1 > 0
ZOOM_WINDOW()
WORLD2SCREEN(*Drawing, *Scu, *Scene)
*Scene\Refresh = #True : Mouse\Cible_On = #True : Win_Zoom\Window = #False : WinZoomStart = #False : Cde_Active =#False : Timer1 = 0 : Timer2 = 0
EndIf
EndIf
If LineStart = #True
If Timer1 = 0
If ADD_LINE(*Drawing, *Scene) = 1
*Scene\Trace_Line = #True
Timer1 = ElapsedMilliseconds()
Timer2 = ElapsedMilliseconds()
EndIf
EndIf
If (ElapsedMilliseconds()-Timer2 > ElapsedTime) And Timer1 > 0
ADD_LINE(*Drawing, *Scene)
WORLD2SCREEN(*Drawing, *Scu, *Scene)
*Scene\Refresh = #True : Mouse\Cible_On = #True : *Scene\Trace_Line = #False : LineStart = #False: Cde_Active =#False : Timer1 = 0 : Timer2 = 0
EndIf
EndIf
If CircleStart = #True
If Timer1 = 0
If ADD_CIRCLE(*Drawing, *Scene) = 1
*Scene\Trace_Circle = #True
Timer1 = ElapsedMilliseconds()
Timer2 = ElapsedMilliseconds()
EndIf
EndIf
If (ElapsedMilliseconds()-Timer2 > ElapsedTime) And Timer1 > 0
ADD_CIRCLE(*Drawing, *Scene)
WORLD2SCREEN(*Drawing, *Scu, *Scene)
*Scene\Refresh = #True : Mouse\Cible_On = #True : *Scene\Trace_Circle = #False : CircleStart = #False: Cde_Active =#False : Timer1 = 0 : Timer2 = 0
EndIf
EndIf
EndIf
If KeyboardReleased(#PB_Key_Z) And WinzoomStart = #False And Cde_Active = #False ; Cde Zoom Fenetre
WinzoomStart = #True : Cde_Active =#True : Mouse\Cible_On = #False : Debug "Zoom Fenetre"
EndIf
If KeyboardReleased(#PB_Key_L) And LineStart = #False And Cde_Active = #False ; Cde Ligne
LineStart = #True : Cde_Active =#True : Mouse\Cible_On = #False : Debug "Line"
EndIf
If KeyboardReleased(#PB_Key_C) And CircleStart = #False And Cde_Active = #False ; Cde Cercle
CircleStart = #True : Cde_Active =#True : Mouse\Cible_On = #False : Debug "Cercle"
EndIf
If MouseButton(#PB_MouseButton_Middle) ; Appui Bouton du milieu
TRANSLATION()
WORLD2SCREEN(*Drawing, *Scu, *Scene)
*Scene\Refresh = #True
EndIf
;}
;{ Gestion de la molette }
Select Sign(Wheel_Mouse)
Case -1
Zoom = Mouse\Zoom_Factor * Abs(Wheel_Mouse)
ZOOM_WHEEL(Zoom)
WORLD2SCREEN(*Drawing, *Scu, *Scene)
*Scene\Refresh = #True
Case 1
Zoom = 1 / (Mouse\Zoom_Factor * Abs(Wheel_Mouse))
ZOOM_WHEEL(Zoom)
WORLD2SCREEN(*Drawing, *Scu, *Scene)
*Scene\Refresh = #True
EndSelect
;}
;Dessin des entités
DRAW_SCENE(*Drawing, *Scu, *Scene)
EndIf
EndProcedure
;{ Programme Prinipal }
If INIT_SYSTEM()
If CREATE_WIN_MAIN()
If OpenWindowedScreen(WindowID(Win_Main\ID), 0, 0, Screen\x_Size, Screen\y_Size, 0, 0, 0, #PB_Screen_WaitSynchronization)
SetFrameRate(120)
KeyboardMode(#PB_Keyboard_International)
Define.i Event_Win, In_Screen, Quit
Repeat
Event_Win = WaitWindowEvent()
If Scene\In_Screen
; Test pour savoir si la souris est hors du Screen
If Mouse\x_Scr > Screen\x_Size - 2 Or Mouse\y_Scr > Screen\y_Size - 2 Or Mouse\x_Scr < 1 Or Mouse\y_Scr < 1
ReleaseMouse(1)
Scene\In_Screen = #False
EndIf
Else
;
;************************************
; Handle #PB_Event_Gadget Here
;************************************
;
Mouse\x_Win = WindowMouseX(Win_Main\ID): Mouse\y_Win = WindowMouseY(Win_Main\ID)
Select Event_Win
Case #PB_Event_Gadget
Case #PB_Event_CloseWindow : Quit = 1
Case #PB_Event_SizeWindow
;If Event<>0 : Debug Event : EndIf
;Debug "resize"
;WIN_RESIZE()
EndSelect
; Test pour savoir si la souris est dans le Screen
If Mouse\x_Win < Screen\x_Size + #LeftOffset And Mouse\x_Win > #LeftOffset And Mouse\y_Win > #TopOffset And Mouse\y_Win < #TopOffset + Screen\y_Size
ReleaseMouse(0)
MouseLocate(Mouse\x_Win - #LeftOffset, Mouse\y_Win - #TopOffset)
Scene\In_Screen = #True
EndIf
EndIf
GESTION_SCREEN(@Drawing, @IconSCU, @Scene)
Until Quit = 1 ;Or KeyboardPushed(#PB_Key_Escape)
Else
MessageRequester("Erreur", "Impossible de créer l'écran d'affichage !", 0)
EndIf
Else
MessageRequester("Erreur", "Création de la Fenêtre Impossible !", 0)
EndIf
Else
MessageRequester("Erreur", "Impossible d'initiliser le système !", 0)
EndIf
End
;}