Page 1 sur 1

Extraire images et sons Div Game Studio

Publié : dim. 03/mai/2026 22:15
par plabouro472
Extraire images et sons Div Game Studio

PB : 6.40
Os : Windows 11

Ces codes sont destinés à tout ceux qui souhaiterais réutiliser leurs graphismes
réalisé avec Div Game Studio

Les fichiers nécessaires pour tester ce trouve dans l'ISO téléchargeable ici
https://winworldpc.com/product/div-games-studio/1x

Dans les dossiers suivants ce trouvent :
FPG : Fichiers graphiques des jeux.
MAP : Graphismes et bibliothèques.
FNT : Archives des polices.
PCM : Son des jeux.

***********************************************
Ce code permet d'extraire les images.
Un curseur de zoom est disponible pour les petites image.
Chaque image inclue dans le fichier peut être sélectionnée avec le ComboBox.
Un bouton servira à enregistrer toutes les image dans le dossier du fichier au format bmp.
Pour charger un fichier, le bouton est en haut à droite de la fenêtre.

Code : Tout sélectionner

 

;Global Titre$ = "Format Dgs-V20260228"
Global Titre$ = "Format Dgs-V20260503" ; Ajouté Zoom

#FileOpen = 0
#TrackBarZoomInit = 7
#TailleImageMaxi = 32


Structure PointU
 x .w
 y .w
EndStructure

Structure InfoFpg
 IdImage .i
 Type .s
 Code .l
 Longueur .l
 Description .s
 NomDuFichier .s
 Largeur .l
 Hauteur .l
 GlissementVert .l
 PointNb .l
 List Point.PointU()
EndStructure

Structure DivRGB
 R .a
 G .a
 B .a
EndStructure


Global Filtre$ = "Images Div|*.fpg;*.map;*.fnt|Fichiers Fpg|*.fpg|Fichiers Map|*.map|Fichiers Fnt|*.fnt|Tous les fichiers|*.*"
Global FilenameOpen$ = GetCurrentDirectory() + ""
Global Filename$ = ""
Global FichierType$ = ""
Global TxtTmp$ = ""
Global *MemoryID = AllocateMemory( 1 , #PB_Memory_NoClear )

Global Dim CouleurPalette.l (255)
Global NewList ListImage .InfoFpg ()
Global .l ValTmp_L

Global Dim TbZoom .f ( 14 )
TbZoom ( 0 ) = 1/8
TbZoom ( 1 ) = 1/7
TbZoom ( 2 ) = 1/6
TbZoom ( 3 ) = 1/5
TbZoom ( 4 ) = 1/4
TbZoom ( 5 ) = 1/3
TbZoom ( 6 ) = 1/2
TbZoom ( 7 ) = 1.00 ; Zoom = 1
TbZoom ( 8 ) = 2.00
TbZoom ( 9 ) = 3.00
TbZoom ( 10 ) = 4.00
TbZoom ( 11 ) = 5.00
TbZoom ( 12 ) = 6.00
TbZoom ( 13 ) = 7.00
TbZoom ( 14 ) = 8.00

Global Dim TbZoomTxt .s ( 14 )
TbZoomTxt ( 0 ) = "1/8"
TbZoomTxt ( 1 ) = "1/7"
TbZoomTxt ( 2 ) = "1/6"
TbZoomTxt ( 3 ) = "1/5"
TbZoomTxt ( 4 ) = "1/4"
TbZoomTxt ( 5 ) = "1/3"
TbZoomTxt ( 6 ) = "1/2"
TbZoomTxt ( 7 ) = "1" ; Zoom = 1
TbZoomTxt ( 8 ) = "2"
TbZoomTxt ( 9 ) = "3"
TbZoomTxt ( 10 ) = "4"
TbZoomTxt ( 11 ) = "5"
TbZoomTxt ( 12 ) = "6"
TbZoomTxt ( 13 ) = "7"
TbZoomTxt ( 14 ) = "8"

; *****************
; Form Designer for PureBasic - 6.40
;{
Global Win_0

Global Text_Fichier, String_Fichier, Button_Fichier, Frame_ImageBmp, ScrollArea_ImageBmp, ImageGadget_Bmp, Button_Quitter, Text_Code, String_Code16, String_Code10, Text_Longueur, String_Longueur16, String_Longueur10, Text_Description, String_Description, Text_NomDuFichier, String_NomDuFichier, Text_Largeur, String_Largeur16, String_Largeur10, Text_Hauteur, String_Hauteur16, String_Hauteur10, Text_GlissementVert, String_GlissementVert16, String_GlissementVert10, Text_PointNb, String_PointNb16, String_PointNb10, Text_Type, String_Type, Combo_Image, Button_Extraire, Editor_CaracteresInclus, TrackBar_Zoom, Text_ValeurZoom

Declare ObjComboImageOnClik(EventType)
Declare ObjButtonQuitterOnClik(EventType)
Declare ObjButtonExtraireOnClik(EventType)
Declare ObjTrackBarZoomEvent(EventType)
Declare BoutonFichierOnClick(EventType)

Procedure OpenWin_0(x = 0, y = 0, width = 760, height = 490)
 Win_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 Text_Fichier = TextGadget(#PB_Any, 10, 10, 50, 25, "Fichier")
 String_Fichier = StringGadget(#PB_Any, 60, 10, 650, 25, "")
 Button_Fichier = ButtonGadget(#PB_Any, 720, 10, 30, 25, ". . .")
 Frame_ImageBmp = FrameGadget(#PB_Any, 300, 50, 400, 400, "Image.", #PB_Frame_Container)
 ScrollArea_ImageBmp = ScrollAreaGadget(#PB_Any, 0, 0, 400, 400, 640, 400, 1, #PB_ScrollArea_Flat | #PB_ScrollArea_Center)
 ImageGadget_Bmp = ImageGadget(#PB_Any, 0, 0, 100, 100, 0)
 CloseGadgetList()
 CloseGadgetList()
 Button_Quitter = ButtonGadget(#PB_Any, 560, 460, 140, 20, "Quitter")
 Text_Code = TextGadget(#PB_Any, 10, 70, 100, 20, "Code du graph")
 String_Code16 = StringGadget(#PB_Any, 110, 70, 90, 20, "", #PB_String_ReadOnly | #PB_String_UpperCase)
 String_Code10 = StringGadget(#PB_Any, 200, 70, 90, 20, "", #PB_String_Numeric | #PB_String_ReadOnly)
 Text_Longueur = TextGadget(#PB_Any, 10, 90, 100, 20, "Longueur")
 String_Longueur16 = StringGadget(#PB_Any, 110, 90, 90, 20, "", #PB_String_ReadOnly | #PB_String_UpperCase)
 String_Longueur10 = StringGadget(#PB_Any, 200, 90, 90, 20, "", #PB_String_Numeric | #PB_String_ReadOnly)
 Text_Description = TextGadget(#PB_Any, 10, 110, 100, 20, "Description")
 String_Description = StringGadget(#PB_Any, 110, 110, 180, 20, "", #PB_String_ReadOnly)
 Text_NomDuFichier = TextGadget(#PB_Any, 10, 130, 100, 20, "Nom du fichier")
 String_NomDuFichier = StringGadget(#PB_Any, 110, 130, 180, 20, "", #PB_String_ReadOnly)
 Text_Largeur = TextGadget(#PB_Any, 10, 150, 100, 20, "Largeur")
 String_Largeur16 = StringGadget(#PB_Any, 110, 150, 90, 20, "", #PB_String_ReadOnly | #PB_String_UpperCase)
 String_Largeur10 = StringGadget(#PB_Any, 200, 150, 90, 20, "", #PB_String_Numeric | #PB_String_ReadOnly)
 Text_Hauteur = TextGadget(#PB_Any, 10, 170, 100, 20, "Hauteur")
 String_Hauteur16 = StringGadget(#PB_Any, 110, 170, 90, 20, "", #PB_String_ReadOnly | #PB_String_UpperCase)
 String_Hauteur10 = StringGadget(#PB_Any, 200, 170, 90, 20, "", #PB_String_Numeric | #PB_String_ReadOnly)
 Text_GlissementVert = TextGadget(#PB_Any, 10, 190, 100, 20, "Glissement V.")
 String_GlissementVert16 = StringGadget(#PB_Any, 110, 190, 90, 20, "", #PB_String_ReadOnly | #PB_String_UpperCase)
 String_GlissementVert10 = StringGadget(#PB_Any, 200, 190, 90, 20, "", #PB_String_Numeric | #PB_String_ReadOnly)
 Text_PointNb = TextGadget(#PB_Any, 10, 210, 100, 20, "PointNb")
 String_PointNb16 = StringGadget(#PB_Any, 110, 210, 90, 20, "", #PB_String_ReadOnly | #PB_String_UpperCase)
 String_PointNb10 = StringGadget(#PB_Any, 200, 210, 90, 20, "", #PB_String_Numeric | #PB_String_ReadOnly)
 Text_Type = TextGadget(#PB_Any, 10, 50, 100, 20, "Type")
 String_Type = StringGadget(#PB_Any, 110, 50, 90, 20, "", #PB_String_ReadOnly)
 Combo_Image = ComboBoxGadget(#PB_Any, 10, 350, 280, 25)
 Button_Extraire = ButtonGadget(#PB_Any, 300, 460, 140, 20, "Extraire toutes les images")
 Editor_CaracteresInclus = EditorGadget(#PB_Any, 10, 240, 280, 100, #PB_Editor_ReadOnly)
 TrackBar_Zoom = TrackBarGadget(#PB_Any, 720, 50, 20, 400, 0, 14, #PB_TrackBar_Ticks | #PB_TrackBar_Vertical)
 DisableGadget(TrackBar_Zoom, 1)
 Text_ValeurZoom = TextGadget(#PB_Any, 710, 460, 40, 20, "", #PB_Text_Center | #PB_Text_Border)
EndProcedure

Procedure Win_0_Events(event)
 Select event
  Case #PB_Event_CloseWindow
   ProcedureReturn #False
  ;CaseEnd
  Case #PB_Event_Gadget
   Select EventGadget()
    Case Button_Fichier
     BoutonFichierOnClick(EventType()) 
    ;CaseEnd
    Case Button_Quitter
     ObjButtonQuitterOnClik(EventType())
    ;CaseEnd
    Case Combo_Image
     ObjComboImageOnClik(EventType())
    ;CaseEnd
    Case Button_Extraire
     ObjButtonExtraireOnClik(EventType())
    ;CaseEnd
    Case TrackBar_Zoom
     ObjTrackBarZoomEvent(EventType())
    ;CaseEnd
   EndSelect
  ;CaseEnd
 EndSelect
 ProcedureReturn #True
EndProcedure

;} *****************


OpenWin_0 ( )
SetWindowTitle ( Win_0 , Titre$ ) 
SetGadgetState ( TrackBar_Zoom , #TrackBarZoomInit )
SetGadgetText ( Text_ValeurZoom , TbZoomTxt ( GetGadgetState( TrackBar_Zoom ) ) )


Procedure ClearGadget ( )
 SetGadgetText ( String_Code16 , "" )
 SetGadgetText ( String_Code10 , "" )
 SetGadgetText ( String_Longueur16 , "" )
 SetGadgetText ( String_Longueur10 , "" )
 SetGadgetText ( String_Description , "" )
 SetGadgetText ( String_Largeur16 , "" )
 SetGadgetText ( String_Largeur10 , "" )
 SetGadgetText ( String_Hauteur16 , "" )
 SetGadgetText ( String_Hauteur10 , "" )
 SetGadgetText ( String_GlissementVert16 , "" )
 SetGadgetText ( String_GlissementVert10 , "" )
 SetGadgetText ( String_PointNb16 , "" )
 SetGadgetText ( String_PointNb10 , "" )
 ClearGadgetItems ( Editor_CaracteresInclus )
EndProcedure
Procedure AfficheEnteteFichier ( *Adr )
 FichierType$ = PeekS( *Adr , 3 , #PB_Ascii )
 SetGadgetText ( String_Type , FichierType$ )
EndProcedure
Procedure ChargePaletteCouleur ( *Adr )
 Protected *Adresse.DivRGB = *Adr
 For n = 0 To 255
  CouleurPalette (n) = RGB( *Adresse\R << 2, *Adresse\G << 2 , *Adresse\B << 2 )
  *Adresse + 3
 Next
EndProcedure
Procedure .i ChargeImageBmp ( *Adr )
 Protected .i MonImageTmp
 Protected .a Pen
 Protected .i Pos = 0
 
 MonImageTmp = CreateImage( #PB_Any , ListImage()\Largeur , ListImage()\Hauteur )
 StartDrawing( ImageOutput( MonImageTmp ) )
  For y.u = 0 To ListImage()\Hauteur - 1
   For x.u = 0 To ListImage()\Largeur - 1
    Pen = PeekA( *Adr + Pos )
    Plot( X , Y , CouleurPalette( Pen ) )
    Pos + 1
   Next
  Next
 StopDrawing()
 ProcedureReturn MonImageTmp
EndProcedure

Procedure AfficheInfoFichierFpg ( )
 Protected .a Compt = 0
 SetGadgetText ( String_Code16 , "$" + RSet( Hex( ListImage()\Code ) , 8 , "0" ) )
 SetGadgetText ( String_Code10 , Str( ListImage()\Code ) )
 SetGadgetText ( String_Longueur16 , "$" + RSet( Hex( ListImage()\Longueur ) , 8 , "0" ) )
 SetGadgetText ( String_Longueur10 , Str( ListImage()\Longueur ) )
 SetGadgetText ( String_Description , ListImage()\Description )
 SetGadgetText ( String_NomDuFichier , ListImage()\NomDuFichier )
 SetGadgetText ( String_Largeur16 , "$" + RSet( Hex( ListImage()\Largeur ) , 8 , "0" ) )
 SetGadgetText ( String_Largeur10 , Str( ListImage()\Largeur ) )
 SetGadgetText ( String_Hauteur16 , "$" + RSet( Hex( ListImage()\Hauteur ) , 8 , "0" ) )
 SetGadgetText ( String_Hauteur10 , Str( ListImage()\Hauteur ) )
 SetGadgetText ( String_PointNb16 , "$" + RSet( Hex( ListImage()\PointNb ) , 8 , "0" ) )
 SetGadgetText ( String_PointNb10 , Str( ListImage()\PointNb ) )
 SetGadgetText ( String_GlissementVert16 , "$" + RSet( Hex( ListImage()\GlissementVert ) , 8 , "0" ) )
 SetGadgetText ( String_GlissementVert10 , Str( ListImage()\GlissementVert ) )
 
 If ListImage()\PointNb > 0
  ForEach ListImage()\Point()
   Compt + 1 
   TxtTmp$ = "Point N°" + Str( Compt ) + " x=" + Str( ListImage()\Point()\x ) + " ; y=" + Str( ListImage()\Point()\y )
   AddGadgetItem( Editor_CaracteresInclus , -1 , TxtTmp$ )
  Next
 EndIf
EndProcedure
Procedure AfficheImage ( _TrackBar_Zoom.a = 1.0 )
 Protected .i ImageTmp
 Protected .f Largeur , Hauteur , Zoom
 Protected .s ZoomTxt
 
 If _TrackBar_Zoom < #TrackBarZoomInit
  If ListImage()\Largeur > #TailleImageMaxi And ListImage()\Hauteur > #TailleImageMaxi
   Zoom = TbZoom ( _TrackBar_Zoom )
   ZoomTxt = TbZoomTxt ( _TrackBar_Zoom )
  Else
   Zoom = TbZoom ( #TrackBarZoomInit )
   ZoomTxt = TbZoomTxt ( #TrackBarZoomInit )
  EndIf
  
 Else
  Zoom = TbZoom ( _TrackBar_Zoom )
  ZoomTxt = TbZoomTxt ( _TrackBar_Zoom )
 EndIf
 
 SetGadgetText( Text_ValeurZoom , ZoomTxt )
 Largeur = ListImage()\Largeur * Zoom
 Hauteur = ListImage()\Hauteur * Zoom
 
 If ImageTmp : FreeImage( ImageTmp ) : EndIf
 ImageTmp = CreateImage ( #PB_Any , Largeur , Hauteur )
 ResizeGadget ( ImageGadget_Bmp , #PB_Ignore , #PB_Ignore , Largeur , Hauteur )
 SetGadgetAttribute ( ScrollArea_ImageBmp , #PB_ScrollArea_InnerWidth , Largeur )
 SetGadgetAttribute ( ScrollArea_ImageBmp , #PB_ScrollArea_InnerHeight , Hauteur )
 
 If StartVectorDrawing ( ImageVectorOutput( ImageTmp , #PB_Unit_Pixel ) )
   ResetCoordinates ( #PB_Coordinate_User )
   ScaleCoordinates ( Zoom , Zoom , #PB_Coordinate_User )
   MovePathCursor ( 0 , 0 )
   DrawVectorImage ( ImageID( ListImage()\IdImage ) , 255 )
  StopVectorDrawing ( )
  SetGadgetState ( ImageGadget_Bmp , ImageID( ImageTmp ) ) 
 EndIf
 
EndProcedure


; *****************
; Les procédures d'événements
Procedure BoutonFichierOnClick (EventType)
 Protected .i length
 Protected .i MemoryIndex , MemoryOffset
 Protected .l TmpLarge , TmpHaut
 
 FilenameOpen$ = OpenFileRequester("Ouvrir ...", FilenameOpen$, Filtre$, 0 )
 If FilenameOpen$
  Filename$ = GetFilePart( FilenameOpen$ )
  SetGadgetText ( String_Fichier , Filename$ )
  If OpenFile( #FileOpen , FilenameOpen$ ) 
   length = Lof( #FileOpen )
   *MemoryID = ReAllocateMemory( *MemoryID , length , #PB_Memory_NoClear )
   If *MemoryID
    ReadData( #FileOpen , *MemoryID , length)
   EndIf
   CloseFile( #FileOpen )
  EndIf
  
  ClearGadget ( )
  ForEach ListImage()
   FreeList ( ListImage()\Point() )
   FreeImage ( ListImage()\IdImage )
  Next
  ClearList ( ListImage ( ) )
  ClearGadgetItems ( Combo_Image )
  
  MemoryIndex = 0
  AfficheEnteteFichier ( *MemoryID )
  
  Select UCase( FichierType$ )
   Case "FPG"
    ChargePaletteCouleur ( *MemoryID + 8 )
    MemoryIndex = 1352 ; $0548
    
    While MemoryIndex < length
     MemoryOffset = 0
     AddElement( ListImage() )
     ListImage()\Code = PeekL( *MemoryID + MemoryIndex + MemoryOffset ) : MemoryOffset + 4
     ListImage()\Longueur = PeekL( *MemoryID + MemoryIndex + MemoryOffset ) : MemoryOffset + 4
     ListImage()\Description = PeekS( *MemoryID + MemoryIndex + MemoryOffset , 32 , #PB_Ascii ) : MemoryOffset + 32
     ListImage()\NomDuFichier = PeekS( *MemoryID + MemoryIndex + MemoryOffset , 12 , #PB_Ascii ) : MemoryOffset + 12
     ListImage()\Largeur = PeekL( *MemoryID + MemoryIndex + MemoryOffset ) : MemoryOffset + 4
     ListImage()\Hauteur = PeekL( *MemoryID + MemoryIndex + MemoryOffset ) : MemoryOffset + 4
     ListImage()\PointNb = PeekL( *MemoryID + MemoryIndex + MemoryOffset ) : MemoryOffset + 4
     If ListImage()\PointNb > 0
      For i.a = 1 To ListImage()\PointNb
       AddElement( ListImage()\Point() )
       ListImage()\Point()\x = PeekW( *MemoryID + MemoryIndex + MemoryOffset ) : MemoryOffset + 2
       ListImage()\Point()\y = PeekW( *MemoryID + MemoryIndex + MemoryOffset ) : MemoryOffset + 2
      Next
     EndIf
     ListImage()\IdImage = ChargeImageBmp ( *MemoryID + MemoryIndex + MemoryOffset ) : 
     TxtTmp$ = RSet( Str( ListImage()\Code ) , 3 , "0" ) + "-" + ListImage()\NomDuFichier + " : " + ListImage()\Description
     AddGadgetItem( Combo_Image , -1 , TxtTmp$ )
     MemoryIndex + ListImage()\Longueur
    Wend
    
    SetGadgetState ( Combo_Image , 0 )
    SelectElement ( ListImage() , GetGadgetState( Combo_Image ) )
    AfficheInfoFichierFpg ( )
    AfficheImage ( GetGadgetState( TrackBar_Zoom ) )
   ;CaseEnd
   
   Case "MAP"
    MemoryIndex = 8
    AddElement( ListImage() )
    ListImage()\Largeur = PeekU( *MemoryID + MemoryIndex ) : MemoryIndex + 2
    ListImage()\Hauteur = PeekU( *MemoryID + MemoryIndex ) : MemoryIndex + 2
    ListImage()\Code = PeekL( *MemoryID + MemoryIndex ) : MemoryIndex + 4
    ListImage()\Description = PeekS( *MemoryID + MemoryIndex , 32 , #PB_Ascii ) : MemoryIndex + 32
    ChargePaletteCouleur ( *MemoryID + MemoryIndex ) : MemoryIndex = 1392
    ListImage()\PointNb = PeekU( *MemoryID + MemoryIndex )
    If ListImage()\PointNb > 0
     For i.a = 1 To ListImage()\PointNb
      AddElement( ListImage()\Point() )
      ListImage()\Point()\x = PeekW( *MemoryID + MemoryIndex + MemoryOffset ) : MemoryOffset + 2
      ListImage()\Point()\y = PeekW( *MemoryID + MemoryIndex + MemoryOffset ) : MemoryOffset + 2
     Next
    EndIf
    ListImage()\IdImage = ChargeImageBmp ( *MemoryID + MemoryIndex )
    
    TxtTmp$ = RSet( Str( ListImage()\Code ) , 3 , "0" ) + "-" + ListImage()\NomDuFichier + " : " + ListImage()\Description
    AddGadgetItem( Combo_Image , -1 , TxtTmp$ )
    SetGadgetState ( Combo_Image , 0 )
    SelectElement ( ListImage() , GetGadgetState( Combo_Image ) )
    
    AfficheInfoFichierFpg ( )
    AfficheImage ( GetGadgetState( TrackBar_Zoom ) )
   ;CaseEnd
   
   Case "FNT"
    ChargePaletteCouleur ( *MemoryID + 8 )
    MemoryIndex = 1352
    ValTmp_L = PeekI( *MemoryID + MemoryIndex ) : MemoryIndex + 4
    If ValTmp_L & 01 : AddGadgetItem( Editor_CaracteresInclus , -1 , "X - Nombres" )
    Else : AddGadgetItem( Editor_CaracteresInclus , -1 , "0 - Nombres" )
    EndIf
    If ValTmp_L & 02 : AddGadgetItem( Editor_CaracteresInclus , -1 , "X - Majuscules" )
    Else : AddGadgetItem( Editor_CaracteresInclus , -1 , "0 - Majuscules" )
    EndIf
    If ValTmp_L & 04 : AddGadgetItem( Editor_CaracteresInclus , -1 , "X - Minuscules" )
    Else : AddGadgetItem( Editor_CaracteresInclus , -1 , "0 - Minuscules" )
    EndIf
    If ValTmp_L & 08 : AddGadgetItem( Editor_CaracteresInclus , -1 , "X - Symboles" )
    Else : AddGadgetItem( Editor_CaracteresInclus , -1 , "0 - Symboles" )
    EndIf
    If ValTmp_L & 16 : AddGadgetItem( Editor_CaracteresInclus , -1 , "X - Etendus" )
    Else : AddGadgetItem( Editor_CaracteresInclus , -1 , "0 - Etendus" )
    EndIf
    For ValTmp_L = 0 To 255
     
     TmpLarge = PeekL( *MemoryID + MemoryIndex )
     TmpHaut = PeekL( *MemoryID + MemoryIndex + 4 )
     MemoryOffset = PeekL( *MemoryID + MemoryIndex + 12 )
     
     If MemoryOffset > 0 And ( TmpLarge * TmpHaut > 0 )
      AddElement( ListImage() )
      ListImage()\Largeur = PeekL( *MemoryID + MemoryIndex ) : MemoryIndex + 4
      ListImage()\Hauteur = PeekL( *MemoryID + MemoryIndex ) : MemoryIndex + 4
      ListImage()\GlissementVert = PeekL( *MemoryID + MemoryIndex ) : MemoryIndex + 4
      MemoryOffset = PeekL( *MemoryID + MemoryIndex ) : MemoryIndex + 4
      ListImage()\Code = ValTmp_L
      ListImage()\IdImage = ChargeImageBmp ( *MemoryID + MemoryOffset )
      TxtTmp$ = "Car N° " + RSet( Str( ListImage()\Code ) , 3 , "0" )
      AddGadgetItem( Combo_Image , -1 , TxtTmp$ )
     Else 
      MemoryIndex + 16
     EndIf
    Next
    SetGadgetState ( Combo_Image , 0 )
    SelectElement ( ListImage() , GetGadgetState( Combo_Image ) )
    AfficheInfoFichierFpg ( )
    AfficheImage ( GetGadgetState( TrackBar_Zoom ) )
   ;CaseEnd
   
  EndSelect
  If ListSize( ListImage() )
   DisableGadget( TrackBar_Zoom , 0 )
  Else
   DisableGadget( TrackBar_Zoom , 1 )
  EndIf
  
 EndIf
EndProcedure
Procedure ObjButtonQuitterOnClik(EventType)
 End
EndProcedure
Procedure ObjButtonExtraireOnClik(EventType)
 Filename$ = GetFilePart( FilenameOpen$ , #PB_FileSystem_NoExtension )
 ForEach ListImage()
  TxtTmp$ = Filename$ + "-" + RSet( Str( ListImage()\Code ) , 3 , "0" ) + "-" + ListImage()\NomDuFichier + "-" + ListImage()\Description + ".bmp"
  SaveImage( ListImage()\IdImage , TxtTmp$ , #PB_ImagePlugin_BMP )
 Next
 MessageRequester( "Information !" , "L'extraction est terminé." , #PB_MessageRequester_Info )
EndProcedure
Procedure ObjComboImageOnClik(EventType)
 If EventType = #PB_EventType_Change
  ClearGadget ( )
  SelectElement ( ListImage() , GetGadgetState( Combo_Image ) )
  AfficheInfoFichierFpg ( )
  AfficheImage ( GetGadgetState( TrackBar_Zoom ) )
 EndIf
EndProcedure
Procedure ObjTrackBarZoomEvent(EventType)
 AfficheImage ( GetGadgetState( TrackBar_Zoom ) )
EndProcedure

; *****************
; La boucle principale
Repeat
 Evenement = WaitWindowEvent()
 Select EventWindow()
  Case Win_0
   Win_0_Events(Evenement)
  ;CaseEnd
  
 EndSelect
Until Evenement = #PB_Event_CloseWindow


*****************************************************************************
Ce code permet d'extraire les sons.
Un curseur de volume et une ProgressBar est disponible.
Certains paramètres peuvent être avec modifié à l'aide de ComboBox.
Un bouton servira à enregistrer le son dans le dossier du fichier au format wav.
Pour charger un fichier, le bouton est en haut à droite de la fenêtre.

Les valeur par défaut correspondent aux fichiers Pcm
La fréquence d'échantillonnage est fixée à 5400Hz ( valeur estimée ).
La modification manuelle des valeurs est possible.

Code : Tout sélectionner


;Global Titre .s = "Format Pcm-V20260426"
;Global Titre .s = "Format Pcm-V20260427" ; SetCurrentDirectory
;Global Titre .s = "Format Pcm-V20260427a" ; TrackBar volume + ProgresseBar + CheckBox Boucle
Global Titre .s = "Format Pcm-V20260430" ; ProgresseBar à 100% en fin de lecture


Structure Wave
 RiffChunkId .a[4] ; "RIFF"
 RiffSize .l    ; xxxx : Taille du fichier ( calculé )
 RiffSubType .a[4] ; "WAVE"
 
 Fmt_ChunkId .a[4] ; "fmt "
 Fmt_ChunkSize .l ; 16 : Taille du bloc fmt
 wFormatTag .u   ; 1 : Type de compression :1 = PCM
 NbChannels .u   ; xx : Nombre de voies ( Combo )
 NbSamplesPerSec .l; xxxx : Fréquence d'échantillonnage ( Combo )
 NbAvgBytesPerSec .l ; xxxx : Nombre d’octets par seconde ( calculé )
 NbBlockAlign .u   ; xx : Nombre d’octets par échantillon ( calculé )
 wBitsPerSample .u  ; xx : Nombre de bits par échantillon ( Combo )
 
 DataChunkId .a[4] ; "data"
 DataChunkSize .l ; xxxx : Taille du fichier ( calculé )
 DataSnd .a[0]   ; Données audio
EndStructure


Global FilenameOpen .s = GetCurrentDirectory() ; 20260427
Global FilenameSave .s = ""
Global FontConsolas .i
Global *MemoryWave.Wave = AllocateMemory( 44 , #PB_Memory_NoClear )
Global TestAudio .i

Declare CalculeDatas ( )
Declare AfficheDatas ( )


Enumeration Fichier
 #FileOpen
 #FileSave
EndEnumeration


; *****************
;{ Code créé avec IceDesign
EnableExplicit

;- Global
Global Win0

Global Win0_Btn_Fichier, Win0_Btn_Play, Win0_Btn_Quitter, Win0_Btn_SauveAudio, Win0_Btn_Stop
Global Win0_CheckBox_Boucle, Win0_Combo_NbChannels, Win0_Combo_NbSamplesPerSec, Win0_Combo_wBitsPerSample, Win0_ProgressBar_Snd
Global Win0_Text_Fichier, Win0_Text_SubChunkId, Win0_Text_SubChunkSize, Win0_Text_Vol, Win0_TrackBar_Volume
Global Win0_Txt_1, Win0_Txt_10, Win0_Txt_11, Win0_Txt_12, Win0_Txt_2
Global Win0_Txt_3, Win0_Txt_4, Win0_Txt_5, Win0_Txt_6, Win0_Txt_7
Global Win0_Txt_8, Win0_Txt_9, Win0_Txt_NbAvgBytesPerSec, Win0_Txt_NbAvgBytesPerSecVal, Win0_Txt_NbBlockAlign
Global Win0_Txt_NbBlockAlignVal, Win0_Txt_NbChannels, Win0_Txt_NbSamplesPerSec, Win0_Txt_RiffChunkId, Win0_Txt_RiffChunkIdVal
Global Win0_Txt_RiffSize, Win0_Txt_RiffSizeVal, Win0_Txt_RiffSubType, Win0_Txt_RiffSubTypeVal, Win0_Txt_SubChunkIdVal
Global Win0_Txt_SubChunkSizeVal, Win0_Txt_WavSize, Win0_Txt_WavSizeVal, Win0_Txt_wBitsPerSample, Win0_Txt_wFormatTag
Global Win0_Txt_wFormatTagVal

Global Win0_Quit

;- Declare
Declare Open_Win0(X = 0, Y = 0, Width = 470, Height = 300)
Declare Event_Win0_Btn_Fichier()
Declare Event_Win0_Btn_Play()
Declare Event_Win0_Btn_Stop()
Declare Event_Win0_TrackBar_Volume()
Declare Event_Win0_Btn_SauveAudio()
Declare Event_Win0_Combo_NbChannels()
Declare Event_Win0_Combo_NbSamplesPerSec()
Declare Event_Win0_Combo_wBitsPerSample()
Declare Event_Win0_Btn_Quitter()
Declare Event_Close_Win0()

Procedure Event_Win0_Btn_Fichier()
 Protected length.i
 
 FilenameOpen = OpenFileRequester("Ouvrir ...", FilenameOpen , "Audio|*.pcm|Tous les fichiers|*.*", 0)
 If FilenameOpen
  SetCurrentDirectory( GetPathPart ( FilenameOpen ) )
  FilenameSave = GetPathPart ( FilenameOpen ) + GetFilePart( FilenameOpen , #PB_FileSystem_NoExtension ) + ".wav"
  SetGadgetText ( Win0_Text_Fichier , GetFilePart(FilenameOpen) )
  DisableGadget ( Win0_Btn_SauveAudio , #False )
  If OpenFile( #FileOpen, FilenameOpen ) 
   length = Lof( #FileOpen )
   *MemoryWave.Wave = ReAllocateMemory( *MemoryWave , 44 + length , #PB_Memory_NoClear )
   If *MemoryWave
    ReadData( #FileOpen , *MemoryWave , length)
    MoveMemory( *MemoryWave , *MemoryWave + 44 , length )
   EndIf
   CloseFile( #FileOpen )
  EndIf
  PokeS( *MemoryWave + 0 , "RIFF", 4 , #PB_Ascii | #PB_String_NoZero )
  PokeS( *MemoryWave + 8 , "WAVE", 4 , #PB_Ascii | #PB_String_NoZero )
  PokeS( *MemoryWave + 12 , "fmt ", 4 , #PB_Ascii | #PB_String_NoZero )
  PokeS( *MemoryWave + 36 , "data", 4 , #PB_Ascii | #PB_String_NoZero )
  *MemoryWave\Fmt_ChunkSize = 16
  *MemoryWave\wFormatTag = 1
  *MemoryWave\DataChunkSize = length
  *MemoryWave\RiffSize = length + 36
  
  CalculeDatas( )
  AfficheDatas( )
  DisableGadget ( Win0_Btn_SauveAudio , #False )
  DisableGadget ( Win0_Btn_Play , #False )
  DisableGadget ( Win0_Btn_Stop , #False )
  
 Else 
  DisableGadget ( Win0_Btn_SauveAudio , #True )
  DisableGadget ( Win0_Btn_Play , #True )
  DisableGadget ( Win0_Btn_Stop , #True )
  
  SetGadgetText ( Win0_Text_Fichier , "" )
  
 EndIf
EndProcedure

Procedure Event_Win0_Btn_Play()
 If TestAudio : FreeSound( TestAudio ) : EndIf
 TestAudio = CatchSound( #PB_Any , *MemoryWave )
 SetGadgetAttribute( Win0_ProgressBar_Snd , #PB_ProgressBar_Minimum , 0 ) ; 20260427
 SetGadgetAttribute( Win0_ProgressBar_Snd , #PB_ProgressBar_Maximum , SoundLength( TestAudio ) )
 If GetGadgetState( Win0_CheckBox_Boucle ) = #PB_Checkbox_Checked ; 20260427
  PlaySound( TestAudio , #PB_Sound_Loop , GetGadgetState( Win0_TrackBar_Volume ) )
 Else
  PlaySound( TestAudio , 0 , GetGadgetState( Win0_TrackBar_Volume ) )
 EndIf
EndProcedure

Procedure Event_Win0_Btn_Stop()
 If TestAudio
  StopSound ( TestAudio )
  SetGadgetState ( Win0_ProgressBar_Snd , 0 ) ; 20260427
 EndIf
 
EndProcedure

Procedure Event_Win0_TrackBar_Volume()
 If TestAudio : SoundVolume( TestAudio , GetGadgetState( Win0_TrackBar_Volume ) ) : EndIf ; 20260427
EndProcedure

Procedure Event_Win0_Btn_SauveAudio()
 If CreateFile( #FileSave , FilenameSave )
  WriteData( #FileSave , *MemoryWave , MemorySize( *MemoryWave ) )
  CloseFile( #FileSave ) 
  MessageRequester( "Information !" , "L'extraction est terminé." , #PB_MessageRequester_Info )
 EndIf
 
EndProcedure

Procedure Event_Win0_Combo_NbChannels()
 Select EventType()
  Case #PB_EventType_Change
   CalculeDatas( )
   AfficheDatas( )
  ;CaseEnd
 EndSelect
EndProcedure

Procedure Event_Win0_Combo_NbSamplesPerSec()
 Select EventType()
  Case #PB_EventType_Change
   CalculeDatas( )
   AfficheDatas( )
  ;CaseEnd
 EndSelect
EndProcedure

Procedure Event_Win0_Combo_wBitsPerSample()
 Select EventType()
  Case #PB_EventType_Change
   CalculeDatas( )
   AfficheDatas( )
  ;CaseEnd
 EndSelect
EndProcedure

Procedure Event_Win0_Btn_Quitter()
 FreeMemory( *MemoryWave )
 End
EndProcedure

Procedure Event_Close_Win0()
 Win0_Quit = #True
EndProcedure



Macro SetTabOrder(Gadget)
 CompilerIf #PB_Compiler_OS = #PB_OS_Windows : SetWindowPos_(GadgetID(Gadget), #HWND_BOTTOM, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE) : CompilerEndIf
EndMacro

Procedure Open_Win0(X = 0, Y = 0, Width = 470, Height = 300)
 Win0 = OpenWindow(#PB_Any, X, Y, Width, Height, "Title", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
 If Win0
  Win0_Text_Fichier = TextGadget(#PB_Any, 10, 10, 340, 20, "Fichier", #PB_Text_Border)
  Win0_Btn_Fichier = ButtonGadget(#PB_Any, 440, 10, 20, 20, ". . .")
  Win0_Txt_RiffChunkId = TextGadget(#PB_Any, 10, 40, 130, 20, "Riff Chunk Id")
  Win0_Txt_1 = TextGadget(#PB_Any, 140, 40, 20, 20, ":", #PB_Text_Center)
  Win0_Txt_RiffChunkIdVal = TextGadget(#PB_Any, 160, 40, 70, 20, "RIFF ", #PB_Text_Right)
  Win0_Btn_Play = ButtonGadget(#PB_Any, 240, 40, 90, 30, "Play")
  Win0_Btn_Stop = ButtonGadget(#PB_Any, 340, 40, 90, 30, "Stop")
  Win0_TrackBar_Volume = TrackBarGadget(#PB_Any, 440, 40, 20, 230, 0, 100, #PB_TrackBar_Vertical)
  Win0_Txt_RiffSize = TextGadget(#PB_Any, 10, 60, 130, 20, "Riff Size")
  Win0_Txt_2 = TextGadget(#PB_Any, 140, 60, 20, 20, ":", #PB_Text_Center)
  Win0_Txt_RiffSizeVal = TextGadget(#PB_Any, 160, 60, 70, 20, "11936 ", #PB_Text_Right)
  Win0_Txt_RiffSubType = TextGadget(#PB_Any, 10, 80, 130, 20, "Riff Sub Type")
  Win0_Txt_3 = TextGadget(#PB_Any, 140, 80, 20, 20, ":", #PB_Text_Center)
  Win0_Txt_RiffSubTypeVal = TextGadget(#PB_Any, 160, 80, 70, 20, "WAVE ", #PB_Text_Right)
  Win0_CheckBox_Boucle = CheckBoxGadget(#PB_Any, 240, 80, 190, 20, "Jouer en boucle", #PB_CheckBox_Center)
  Win0_Text_SubChunkId = TextGadget(#PB_Any, 10, 110, 130, 20, "Sub Chunk Id")
  Win0_Txt_4 = TextGadget(#PB_Any, 140, 110, 20, 20, ":", #PB_Text_Center)
  Win0_Txt_SubChunkIdVal = TextGadget(#PB_Any, 160, 110, 70, 20, "fmt ", #PB_Text_Right)
  Win0_ProgressBar_Snd = ProgressBarGadget(#PB_Any, 240, 120, 190, 10, 0, 100 ) ; #PB_ProgressBar_Smooth)
  Win0_Text_SubChunkSize = TextGadget(#PB_Any, 10, 130, 130, 20, "Sub Chunk Size")
  Win0_Txt_5 = TextGadget(#PB_Any, 140, 130, 20, 20, ":", #PB_Text_Center)
  Win0_Txt_SubChunkSizeVal = TextGadget(#PB_Any, 160, 130, 70, 20, "16 ", #PB_Text_Right)
  Win0_Txt_wFormatTag = TextGadget(#PB_Any, 10, 150, 130, 20, "wFormatTag")
  Win0_Txt_6 = TextGadget(#PB_Any, 140, 150, 20, 20, ":", #PB_Text_Center)
  Win0_Txt_wFormatTagVal = TextGadget(#PB_Any, 160, 150, 70, 20, "1(PCM) ", #PB_Text_Right)
  Win0_Btn_SauveAudio = ButtonGadget(#PB_Any, 240, 150, 190, 50, "Enregistrer format Wav", #PB_Button_MultiLine)
  Win0_Txt_NbChannels = TextGadget(#PB_Any, 10, 170, 130, 20, "Nb Channels")
  Win0_Txt_7 = TextGadget(#PB_Any, 140, 170, 20, 20, ":", #PB_Text_Center)
  Win0_Combo_NbChannels = ComboBoxGadget(#PB_Any, 160, 170, 70, 20, #PB_ComboBox_Editable)
  Win0_Txt_NbSamplesPerSec = TextGadget(#PB_Any, 10, 190, 130, 20, "Nb Samples Per Sec")
  Win0_Txt_8 = TextGadget(#PB_Any, 140, 190, 20, 20, ":", #PB_Text_Center)
  Win0_Combo_NbSamplesPerSec = ComboBoxGadget(#PB_Any, 160, 190, 70, 20, #PB_ComboBox_Editable)
  Win0_Txt_NbAvgBytesPerSec = TextGadget(#PB_Any, 10, 210, 130, 20, "Nb Avg Bytes Per Sec")
  Win0_Txt_9 = TextGadget(#PB_Any, 140, 210, 20, 20, ":", #PB_Text_Center)
  Win0_Txt_NbAvgBytesPerSecVal = TextGadget(#PB_Any, 160, 210, 70, 20, "88200 ", #PB_Text_Right)
  Win0_Txt_NbBlockAlign = TextGadget(#PB_Any, 10, 230, 130, 20, "Nb Block Align")
  Win0_Txt_10 = TextGadget(#PB_Any, 140, 230, 20, 20, ":", #PB_Text_Center)
  Win0_Txt_NbBlockAlignVal = TextGadget(#PB_Any, 160, 230, 70, 20, "4 ", #PB_Text_Right)
  Win0_Txt_wBitsPerSample = TextGadget(#PB_Any, 10, 250, 130, 20, "wBits Per Sample")
  Win0_Txt_11 = TextGadget(#PB_Any, 140, 250, 20, 20, ":", #PB_Text_Center)
  Win0_Combo_wBitsPerSample = ComboBoxGadget(#PB_Any, 160, 250, 70, 20, #PB_ComboBox_Editable)
  Win0_Btn_Quitter = ButtonGadget(#PB_Any, 240, 260, 190, 30, "Quitter")
  Win0_Txt_WavSize = TextGadget(#PB_Any, 10, 270, 130, 20, "Wav Size")
  Win0_Txt_12 = TextGadget(#PB_Any, 140, 270, 20, 20, ":", #PB_Text_Center)
  Win0_Txt_WavSizeVal = TextGadget(#PB_Any, 160, 270, 70, 20, "-1 ", #PB_Text_Right)
  Win0_Text_Vol = TextGadget(#PB_Any, 430, 270, 40, 20, "VOL", #PB_Text_Center)
  
  SetTabOrder(Win0_Combo_NbChannels) : SetTabOrder(Win0_Combo_NbSamplesPerSec) : SetTabOrder(Win0_Combo_wBitsPerSample) : SetTabOrder(Win0_Btn_Play) : SetTabOrder(Win0_Btn_Stop)
  SetTabOrder(Win0_CheckBox_Boucle) : SetTabOrder(Win0_TrackBar_Volume) : SetTabOrder(Win0_Btn_SauveAudio) : SetTabOrder(Win0_Btn_Quitter)
  
  BindGadgetEvent(Win0_Btn_Fichier, @Event_Win0_Btn_Fichier())
  BindGadgetEvent(Win0_Btn_Play, @Event_Win0_Btn_Play())
  BindGadgetEvent(Win0_Btn_Stop, @Event_Win0_Btn_Stop())
  BindGadgetEvent(Win0_TrackBar_Volume, @Event_Win0_TrackBar_Volume())
  BindGadgetEvent(Win0_Btn_SauveAudio, @Event_Win0_Btn_SauveAudio())
  BindGadgetEvent(Win0_Combo_NbChannels, @Event_Win0_Combo_NbChannels())
  BindGadgetEvent(Win0_Combo_NbSamplesPerSec, @Event_Win0_Combo_NbSamplesPerSec())
  BindGadgetEvent(Win0_Combo_wBitsPerSample, @Event_Win0_Combo_wBitsPerSample())
  BindGadgetEvent(Win0_Btn_Quitter, @Event_Win0_Btn_Quitter())
  PostEvent(#PB_Event_SizeWindow, Win0, 0)
  BindEvent(#PB_Event_CloseWindow, @Event_Close_Win0(), Win0)
  ProcedureReturn #True
 EndIf
EndProcedure

;}


Procedure AfficheDatas ( )
 SetGadgetText( Win0_Txt_RiffChunkIdVal , "RIFF " )
 SetGadgetText ( Win0_Txt_RiffSizeVal , Str( *MemoryWave\RiffSize ) )
 SetGadgetText( Win0_Txt_RiffSubTypeVal , "WAVE " )
 
 SetGadgetText( Win0_Txt_SubChunkIdVal , "fmt " )
 SetGadgetText( Win0_Txt_SubChunkSizeVal , "16 " )
 SetGadgetText ( Win0_Txt_wFormatTagVal , "1" )
 
 SetGadgetText ( Win0_Txt_NbAvgBytesPerSecVal , Str( *MemoryWave\NbAvgBytesPerSec ) )
 SetGadgetText ( Win0_Txt_NbBlockAlignVal , Str( *MemoryWave\NbBlockAlign ) )
 SetGadgetText ( Win0_Txt_WavSizeVal , Str( *MemoryWave\DataChunkSize ) )
 
EndProcedure
Procedure CalculeDatas ( )
 *MemoryWave\NbChannels = Val( GetGadgetText( Win0_Combo_NbChannels ) )
 *MemoryWave\NbSamplesPerSec = Val( GetGadgetText( Win0_Combo_NbSamplesPerSec ) )
 *MemoryWave\wBitsPerSample = Val( GetGadgetText( Win0_Combo_wBitsPerSample ) )
 *MemoryWave\NbBlockAlign = *MemoryWave\NbChannels * *MemoryWave\wBitsPerSample / 8
 *MemoryWave\NbAvgBytesPerSec = *MemoryWave\NbSamplesPerSec * *MemoryWave\NbBlockAlign
EndProcedure


InitSound()

; *****************
Open_Win0 ()
SetWindowTitle ( Win0 , Titre )
AddGadgetItem ( Win0_Combo_NbChannels , -1 , "1" )
AddGadgetItem ( Win0_Combo_NbChannels , -1 , "2" ) ; PCM Div Game Studio
AddGadgetItem ( Win0_Combo_NbChannels , -1 , "3" )
AddGadgetItem ( Win0_Combo_NbChannels , -1 , "4" )
AddGadgetItem ( Win0_Combo_NbChannels , -1 , "5" )
SetGadgetState ( Win0_Combo_NbChannels , 1 )

AddGadgetItem ( Win0_Combo_NbSamplesPerSec , -1, "5400" ) ; PCM Div Game Studio
AddGadgetItem ( Win0_Combo_NbSamplesPerSec , -1, "8000" )
AddGadgetItem ( Win0_Combo_NbSamplesPerSec , -1, "11025" )
AddGadgetItem ( Win0_Combo_NbSamplesPerSec , -1, "22050" )
AddGadgetItem ( Win0_Combo_NbSamplesPerSec , -1, "44100" )
AddGadgetItem ( Win0_Combo_NbSamplesPerSec , -1, "48000" )
AddGadgetItem ( Win0_Combo_NbSamplesPerSec , -1, "96000" )
SetGadgetState ( Win0_Combo_NbSamplesPerSec , 0 )

AddGadgetItem ( Win0_Combo_wBitsPerSample , -1, "8" ) ; PCM Div Game Studio
AddGadgetItem ( Win0_Combo_wBitsPerSample , -1, "16" )
AddGadgetItem ( Win0_Combo_wBitsPerSample , -1, "32" )
SetGadgetState ( Win0_Combo_wBitsPerSample , 0 )

DisableGadget ( Win0_Btn_SauveAudio , #True )
DisableGadget ( Win0_Btn_Play , #True )
DisableGadget ( Win0_Btn_Stop , #True )
SetGadgetState ( Win0_TrackBar_Volume , 25 )

CalculeDatas( )
AfficheDatas( )



;- Programme Principal
Repeat
 
 If TestAudio
  If SoundStatus( TestAudio ) = #PB_Sound_Playing ; 20260427
   SetGadgetState ( Win0_ProgressBar_Snd , GetSoundPosition( TestAudio ) )
   
  ElseIf SoundStatus( TestAudio ) = #PB_Sound_Stopped
   SetGadgetState ( Win0_ProgressBar_Snd , SoundLength( TestAudio ) )
   
  EndIf
  Delay(100)
 EndIf
 
 Select WindowEvent()
 EndSelect
Until Win0_Quit


Re: Extraire images et sons Div Game Studio

Publié : mar. 12/mai/2026 10:02
par MetalOS
Je ne connaissais pas Div Game Studio. Merci du partage. Moi j'utilise Godot Engine.

Re: Extraire images et sons Div Game Studio

Publié : jeu. 14/mai/2026 7:47
par Kwai chang caine
C'est incroyable qu'il existe des logiciels de ce type gratuitement 8O
Evidemment je ne connaissais aucun des deux puisque ils ne crée pas d'utilitaires, mais je suis admiratif de ces usines à gaz permettant d'aider un utilisateur lambda (Et encore je viens de lire qu'il faut des connaissances en prog) de créer un jeu, une démonstration, et peut être même un dessin animé je suppose :?:
Après tout... C'est un utilitaire qui crée un pont avec le monde du jeu, ce doit être la raison de mon intérêt 8)