Page 1 sur 1

Editor de personnage Votre avis m'interesse

Publié : mar. 15/janv./2008 9:53
par Thyphoon
J'ai dans l'idée de créer un Editeur de jeu de platforme. Mais avant d'attaquer l'éditeur de carte (j'en ai déjà fait un que je reprendrais), je me suis dit que ça pourrait être pratique de faire un éditeur de personnage générique. Que ce soit pour le personnage qu'on dirige ou bien les monstres.

En gros il s'agit d'un éditeur ou vous pouvez assembler les sprites pour créer les animations du personnage.

Un personnage est fait de plusieurs animations. Pour chaque animation on doit determiner le type d'animation : Stop, marche, saute etc...
Pour chaque image d'une animation on peut déterminer Un delta X et un Delta Y par rapport a l'image précédente.
On détermine aussi des "Check Pixels" (j'ai pas trouvé mieux comme nom)
Ce sont des points part exemple a mettre sous les pieds pour vérifier si il y a du sol, ou bien des points devant le personnage pour vérifier si il y a un mur.

Que pensez vous de mon idée ?
A votre avis comment faut-il structurer ces données ?

voici a quoi ressemblera l'éditeur :

Code : Tout sélectionner

;Character editor
;- Window Constants
;
Enumeration
  #Main
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #M_Menu
EndEnumeration

Enumeration
  #M_Load
  #M_Save
EndEnumeration

;- Gadget Constants
;
Enumeration
  #G_Txt_Chara
  #G_CharaName
  #G_ListAnim
  #G_AddAnim
  #G_DelAnim
  #G_Sprite
  #G_Slide
  #G_AddSprite
  #G_DelSprite
  #G_Type
  #G_Play
  #G_Mode
  #G_Txt_DeltaX
  #G_Txt_DeltaY
  #G_DeltaX
  #G_DeltaY
  #G_CheckPixel
  #G_AddCheck
  #G_DelCheck
  #G_CheckTypeFloor
  #G_CheckTypeWall
  #G_CheckTypeOther
EndEnumeration


Procedure Open_Main()
  If OpenWindow(#Main, 216, 0, 690, 377, "Characters Editor",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateMenu(#M_Menu, WindowID(#Main))
      MenuTitle("Files")
      MenuItem(#M_Load, "Load")
      MenuItem(#M_Save, "Save")
      EndIf

      If CreateGadgetList(WindowID(#Main))
        TextGadget(#G_Txt_Chara, 10, 10, 70, 20, "Characters")
        StringGadget(#G_CharaName, 80, 10, 130, 20, "")
        
        ;-
        ListIconGadget(#G_ListAnim, 10, 60, 200, 290, "Animation", 195)
        ButtonGadget(#G_AddAnim, 10, 40, 100, 20, "Add Animation")
        ButtonGadget(#G_DelAnim, 110, 40, 100, 20, "Del Animation")
        Frame3DGadget(#G_Sprite, 250, 50, 250, 250, "Sprite[0/0]")
        TrackBarGadget(#G_Slide, 250, 300, 250, 30, 0, 10, #PB_TrackBar_Ticks)
        ButtonGadget(#G_AddSprite, 250, 30, 70, 20, "Add Sprite")
        ButtonGadget(#G_DelSprite, 320, 30, 70, 20, "Delete Sprite")
        ComboBoxGadget(#G_Type, 250, 10, 250, 200)
        AddGadgetItem(#G_Type,-1,"Right Stop");
        AddGadgetItem(#G_Type,-1,"Right Walk");
        AddGadgetItem(#G_Type,-1,"Right Low Jump");
        AddGadgetItem(#G_Type,-1,"Right Jump");
        AddGadgetItem(#G_Type,-1,"Right Long Jump");
        AddGadgetItem(#G_Type,-1,"Right Pick up Floor Item");
        AddGadgetItem(#G_Type,-1,"Up Climb ladder");
        AddGadgetItem(#G_Type,-1,"Up Climb Rope");
        AddGadgetItem(#G_Type,-1,"Up Climb Stair");
  
        
        
        ButtonGadget(#G_Play, 450, 30, 50, 20, "Play")
        ButtonGadget(#G_Mode, 390, 30, 60, 20, "Mode")
        TextGadget(#G_Txt_DeltaX, 250, 330, 50, 20, "Delta X :")
        TextGadget(#G_Txt_DeltaY, 390, 330, 50, 20, "Delta Y :")
        StringGadget(#G_DeltaX, 300, 330, 60, 20, "0", #PB_String_Numeric)
        StringGadget(#G_DeltaY, 440, 330, 60, 20, "0", #PB_String_Numeric)
        
        ;-
        ListIconGadget(#G_CheckPixel, 540, 30, 140, 160, "Animation", 195)
        ButtonGadget(#G_AddCheck, 540, 10, 70, 20, "Add Check")
        ButtonGadget(#G_DelCheck, 610, 10, 70, 20, "Delete Check")
        OptionGadget(#G_CheckTypeFloor, 570, 190, 100, 20, "Floor")
        OptionGadget(#G_CheckTypeWall, 570, 210, 100, 20, "Wall")
        OptionGadget(#G_CheckTypeOther, 570, 230, 100, 20, "Other")
        
      EndIf
    EndIf
EndProcedure
 
;-Characters

Open_Main()

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1
  
End   ; All the opened windows are closed automatically by PureBasic

Publié : mar. 15/janv./2008 11:15
par Thyphoon
voici ce que j'ai créer comme Structure qu'en pensez vous ?
Est ce qu'on peut pas faire mieux ?

Code : Tout sélectionner

Global NbCharacters
#MaxCharacter=20
Structure Chara
  NbAnimation.l       ;Nombre d'Animation de ce Character
  X.l                 ;Coordonée X du Character
  Y.l                 ;Coordonée Y du Character
EndStructure

Global Dim Chara.Character(#MaxCharacter)

Structure Animation
  NbImage.l             ;Nombre d'Image de cette animation
  Type.l              ;Type d'animation Marche saute etc...
EndStructure

#MaxAnimation=50
Global Dim Animation.Animation(#MaxCharacter,#MaxAnimation)

#MaxImage=50
Structure Image
  IdSprite.l          ;Numero du Sprite
  DeltaX.l            ;Decalage Horizontal part rapport a l'image précedente
  DeltaY.l            ;Decalage Vertical part rapport a l'image précedente
EndStructure
Global Dim Image.Image(#MaxAnimation,#MaxImage)

#MaxCheckPixel=7
Structure CheckPixel
  X.l                 ;Coordonée X du point dans le sprite
  Y.l                 ;Coordonée Y du point dans le sprite
  Type.l              ;Type de Point Wall/Floor
EndStructure

Global Dim CheckPixel.CheckPixel(#MaxAnimation,#MaxImage,#MaxAnimation,#MaxCheckPixel)

Publié : mar. 15/janv./2008 18:51
par Chris
Dans certains jeux en 3D, (Half-Life, Unreal etc...), chaque perso est entouré par une "boîte" invisible qui permet de simplifier la gestion des collisions.

Ca peut peut-être fonctionner pour les sprites d'un jeu en 2D.

Publié : mar. 15/janv./2008 18:56
par Progi1984
Les champs de type X & Y peuvent être remplacés par la structure Point.

Publié : mar. 15/janv./2008 19:11
par Thyphoon
Chris a écrit :Dans certains jeux en 3D, (Half-Life, Unreal etc...), chaque perso est entouré par une "boîte" invisible qui permet de simplifier la gestion des collisions.

Ca peut peut-être fonctionner pour les sprites d'un jeu en 2D.
c'est pas bête tu as plus d'info là dessus ? sur le fonctionnement ?
Progi1984 a écrit :Les champs de type X & Y peuvent être remplacés par la structure Point.
Bonne idée :D