EBAUCHE PROG. DAO 2D

Programmation d'applications complexes
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

EBAUCHE PROG. DAO 2D

Message par Torp »

Salut,

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 8O )

- 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 :mrgreen:

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
;}
Dernière modification par Torp le mar. 15/mars/2011 23:59, modifié 2 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: EBAUCHE PROG. DAO 2D

Message par Ar-S »

Merci pour ce partage, c'est un travail très propre.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: EBAUCHE PROG. DAO 2D

Message par G-Rom »

J'aurais bien voulu tester , mais trop d'api , y a pas moyen de faire sans ?
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Re: EBAUCHE PROG. DAO 2D

Message par Torp »

@Ar-s : Merci

@G-rom : Voilà j'ai bricolé un truc pour que cela fonctionne sans API (Grrr que je n'aime pas la gestion des MouseButton() :) )
(mise à jour du post + haut)
Bye
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: EBAUCHE PROG. DAO 2D

Message par G-Rom »

Merci torp , mais ca ne marche pas , je testerais sous un windows , t'embête pas ;)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: EBAUCHE PROG. DAO 2D

Message par djes »

Salut Torp, content de te voir ici :)

Pour ton problème de curseur, il clignote parce que tu le dessines en permanence. Tu ne devrais l'afficher que s'il se déplace, et ne plus faire de 'flipbuffers' tout le temps.

Pour l'écran, à mon avis il faut fermer et réouvrir.

Pour la sélection, c'est le problème avec tous les programmes de dessin. Chacun a choisi sa méthode. Il y a dans tous les cas une histoire de superposition, donc de priorité des objets; il faut que tu y penses dès maintenant, ainsi qu'à la gestion d'éventuels calques. Un truc pratique, c'est d'afficher un contour virtuel sur l'objet qui va être sélectionné. Le truc du 'shift' appuyé qui permet de passer d'un objet à l'autre est pas mal aussi.
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Re: EBAUCHE PROG. DAO 2D

Message par Torp »

Salut Djes,

Ouep ça fait un bail...
Merci ta réponse, je vais suivre ta recommandation concernant le flipbuffers. Par contre sur le fait de le dessiner directement sur le fenêtre et non dans le screen ne te choque pas ? J'ai eu des scrupules à utiliser cette solution me disant que c'était du bidouillage...

Bye
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: EBAUCHE PROG. DAO 2D

Message par djes »

Je ne suis pas un spécialiste de ce genre de truc, mais en fait, ça m'a plutôt choqué que tu utilises un screen pour un programme en mode fenêtré. D'autant que je n'ai pas trop confiance en directx pour afficher correctement les couleurs. Et puis avec GDI+, la gestion des polices, etc, je sais pas si tu vas y gagner.
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Re: EBAUCHE PROG. DAO 2D

Message par Torp »

Ah tiens, je ne me suis pas posé cette question... j'ai naturellement choisis le Screen pour des raisons de rafraichissement et de rapidité, je vais faire une tentative avec les Images voir ce que cela peut donner.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: EBAUCHE PROG. DAO 2D

Message par kernadec »

bonjour Torp
magnifique ton zoom, j'avais eu envie de faire un zoom de cette manière, mais pas eu la temps.
Alors voila, j'avais bricolé un truc à partir d'un code du soldat inconnu,
et j'ai retrouvé le bout de code si ça peut aidé.

Cordialement

Code : Tout sélectionner

;Adaptation d'un code du soldat inconnu
;par kernadec avec ScrollAreaGadget et ligne chainée


Enumeration
  #Imgadget
  #window
  #SGadget
  #Image0
  #Image1
  #menu0:#menu1:#menu2:#menu3:#menu4
EndEnumeration 

Global X_alpha.l, Y_Alpha.l, X_Omega.l, Y_Omega.l

Procedure Cercle0()
  x2 = Abs(Pow(X_Omega - X_Alpha, 2))
  y2 = Abs(Pow(Y_Omega- Y_Alpha, 2))
  Radius = Sqr(x2 + y2)
  x2=X_Omega-X_Alpha
  y2=Y_Omega-Y_Alpha
  ; LineXY(X_Alpha, Y_Alpha, X_Omega, Y_Omega, RGB(co1,co2,co3))
  ;Circle(X_Alpha,Y_Alpha,1,RGB(co1,co2,co3))
  Circle(X_Alpha,Y_Alpha,Radius,#Black)
EndProcedure
Procedure line0()
  LineXY(X_Alpha, Y_Alpha, X_Omega, Y_Omega, #Black)
EndProcedure
Procedure box0()
  Box(X_Alpha, Y_Alpha, X_Omega-X_Alpha,Y_Omega-Y_Alpha, #Black)
EndProcedure
OpenWindow(#window, 0, 0, 300, 320, "Dessin", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget) 
ScrollAreaGadget(#SGadget, 0, 0, 300,300,1000,1000, 30)
If CreateMenu(#menu0, WindowID(#window))   
  MenuTitle("Choix")
  MenuItem(#menu1, "Ligne")
  MenuItem(#menu2, "Cercle")
  MenuItem(#menu3, "Box")
  MenuItem(#menu4, "Quit")
EndIf
CreateImage(#Image0, 1000, 1000) 
CreateImage(#Image1, 1000, 1000) 
ImageGadget(#Imgadget, 0, 0,1000,1000, ImageID(#Image1))
SetWindowColor(#window,#White) 
SetGadgetColor(#SGadget,#PB_Gadget_BackColor,#White)
CopyImage(#Image0,#Image1)
MBState=#True
Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_SizeWindow
     ResizeGadget(#SGadget,#PB_Ignore,#PB_Ignore,WindowWidth(#window),WindowHeight(#window)-20)
     SetGadgetColor(#SGadget,#PB_Gadget_BackColor,#White)
    Case #PB_Event_Menu      
      Select EventMenu()     
        Case #menu1: menu=1
        Case #menu2: menu=2
        Case #menu3: menu=3
        Case #menu4: Event=#PB_Event_CloseWindow
      EndSelect
    Case #PB_Event_Gadget
       Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_LeftClick
              If MBState=#True 
                If Dessine=1
                  StartDrawing(ImageOutput(#Image0))
                  DrawingMode(#PB_2DDrawing_Outlined )   
                  FillArea(0,0,#White,#White) 
                  X_Omega = WindowMouseX(#window)+GetGadgetAttribute(#SGadget,#PB_ScrollArea_X)
                  Y_Omega = WindowMouseY(#window)+GetGadgetAttribute(#SGadget,#PB_ScrollArea_Y)
                  If menu=1:line0():EndIf
                  If menu=2:Cercle0():EndIf
                  If menu=3:Box0():EndIf
                  StopDrawing()
                EndIf 
              EndIf 
              MBState=#True
              X_Alpha = WindowMouseX(#window)+GetGadgetAttribute(#SGadget,#PB_ScrollArea_X)
              Y_Alpha = WindowMouseY(#window)+GetGadgetAttribute(#SGadget,#PB_ScrollArea_Y)
              Dessine=1
          EndSelect
      EndSelect
    Case #WM_MOUSEMOVE
      If Dessine
        StartDrawing(ImageOutput(#Image1))   
        DrawingMode(#PB_2DDrawing_Outlined )                
        DrawImage(ImageID(#Image0),0,0)
        FillArea(0,0,#White,#White)  
        X_Omega = WindowMouseX(#window)+GetGadgetAttribute(#SGadget,#PB_ScrollArea_X)
        Y_Omega = WindowMouseY(#window)+GetGadgetAttribute(#SGadget,#PB_ScrollArea_Y)
        If menu=1:line0():EndIf
        If menu=2:Cercle0():EndIf
        If menu=3:Box0():EndIf
        StopDrawing()
        SetGadgetState(#Imgadget, ImageID(#Image1))
      EndIf
    Case #WM_RBUTTONDOWN 
      Dessine=0
      StartDrawing(ImageOutput(#Image0)) 
      DrawingMode(#PB_2DDrawing_Outlined )               
      DrawImage(ImageID(#Image0),0,0)
      FillArea(0,0,#White,#White) 
      MBState=#False
      StopDrawing()
      X_Omega =X_Alpha
      Y_Omega =Y_Alpha 
      SetGadgetState(#Imgadget, ImageID(#Image0))
  EndSelect
Until Event = #PB_Event_CloseWindow
End
Dernière modification par kernadec le ven. 18/mars/2011 6:25, modifié 4 fois.
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Re: EBAUCHE PROG. DAO 2D

Message par Torp »

Merci kernadec, tout est bon à prendre :wink:
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: EBAUCHE PROG. DAO 2D

Message par kernadec »

Merci Torp pour le partage.
Ajout d'un ResizeGadget pour associer la taille du ScrollAreaGadget à la Fenêtre. (code mis à jour)

Cordialement
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: EBAUCHE PROG. DAO 2D

Message par G-Rom »

Ca me rappelle un truc que j'avais fait avec une gui perso :

http://www.dailymotion.com/video/x81aqu_sandbox_tech

Dommage que j'ai plus rien. :/
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Re: EBAUCHE PROG. DAO 2D

Message par Torp »

Dommage ça avait l'air top!
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: EBAUCHE PROG. DAO 2D

Message par blendman »

salut

Sympa ce programme :). On pourrait adapter ce système de zoom avec des sprites/sprites3D ?

G-rom : intéressantes tes vidéos. Tu as tout perdu ? ou il te reste encore des trucs ? car ça fout toujours les boules de perdre son travail :(
Répondre