Map Editor 2D

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Map Editor 2D

Message par Cool Dji »

Hello,

Je reprogramme complètement un Map Editor 2D et voici la première étape :
- 1 page de tuiles et 1 page carte : on passe de l'un à l'autre avec F1 et F2
- Selection des brush sur la page de tuile et sur la page de carte (space Bar + click gauche)

Il manque :
- paramétrage de la taille de la carte
- paramétrage de la taille de page des tuiles
- système d'ascenseur pour se promener sur une page de tuile ou de carte plus grande (x et y) que l'écran
- chargement/enregistrement de la carte

Tout ça fonctionnait à peu près dans l'ancienne version, je vais l'intégrer rapidement.
Je suis preneur de toutes suggestions pour améliorer le zinzin.

Je réflechis aussi à :
- un systeme permettant de modifier la taille d'une carte existante sans que ça ne chamboule pas tout
- insérer des tuiles animées
- avoir plusieurs types de décors (en lien avec tuiles statiques, tuiles animées)

J'ai découpé les décors en tuile de 32x32 et chaque case de la carte contient le n° de sprite correspondant à la tuile.

Voilà merci à vous si vous voulez tester

Fichiers graphiques :

Tuiles : http://xdji.free.fr/Telechargement/decor01d.jpg Edit : Nouveau fichier de tuiles extra large pour test
Mouse : http://xdji.free.fr/Telechargement/croixblanche.bmp
Curseur : http://xdji.free.fr/Telechargement/Greenpixel.bmp
Font : http://xdji.free.fr/Telechargement/letter1.bmp

Code : Tout sélectionner

; ------------------------------------------------------------
;
;   Editeur de terrain 2D
;
;    (c) 2011 - Xdji Design & Developpement
;
;   4.60 Beta 1
;
; ------------------------------------------------------------
;
 

;-
;------           I N I T I A L I S A T I O N
;-




;-----  1) Déclaration



If InitSprite() = 0
  MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
  End
EndIf

If InitSound() = 0
  MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Error", "Direct3D system can't be initialized correctly", 0)
  End
EndIf

If InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open DirectX 7 or Mouse not found..", 0)
  End
EndIf


 

;-----  2) Ouvre l'écran
    
    If OpenScreen(1024, 768, 32, "Map Editor 2011") = 0
       MessageRequester("Error", "Can't open a 1024*768 - 32 bit screen !", 0)
       End
     EndIf
     
    UseJPEGImageDecoder()
        
    LoadSprite(0,"Decor01d.jpg", #PB_Sprite_Texture )
    LoadSprite(1,"Greenpixel.bmp", #PB_Sprite_Texture )
    LoadSprite(2,"Croixblanche.bmp", #PB_Sprite_Texture )
    
    
    LoadImage(1, "Decor01d.jpg", #PB_Image_DisplayFormat)
    LoadImage(2, "letter1.bmp", #PB_Image_DisplayFormat )
    
    
    CreateSprite3D(0,0)
    CreateSprite3D(1,1)
    CreateSprite3D(2,2)
    
    
 Global PageState.i ; Etat de la page 0 = tuiles, 1 = carte
 Global NewBrush.i
 Global Dim Brush.i(0)
 
 
 
 
    ;---Création des tuiles du décor
    
Global n=100
Global FirstSpriteDecor = n
Global SizeCarteX.i,SizeCarteY.i

SizeCarteX=1024/32
SizeCarteY=768/32

Global Dim Mapx.i (SizeCarteX*SizeCarteY)

i=0
For y=0 To SizeCarteY-1
 For x=0 To SizeCarteX-1 
  Mapx(i)=6
  i+1
 Next
Next

For y=0 To (ImageHeight(1)/32)-1
 For x=0 To (ImageWidth(1)/32)-1 
  CreateSprite(n,32,32,#PB_Sprite_Texture) 
   StartDrawing(SpriteOutput(n))
   GrabImage(1, 0, x*32, y*32, 32, 32)
   DrawImage(ImageID(0),0,0)
  StopDrawing() 
  TransparentSpriteColor(n, RGB(0, 0, 0))
  CreateSprite3D(n,n)
  n+1
 Next
Next

  
;---Création des petites polices

Global FirstSpriteSmallFont = n
Global String$ = " !'#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}"


For j=1 To Len(String$)
  CreateSprite(n,32,32,#PB_Sprite_Texture) 
   StartDrawing(SpriteOutput(n))
   GrabImage(2, 0, (j-1)*16, 0, 16, 16)
   DrawImage(ImageID(0),0,0)
  StopDrawing() 
  TransparentSpriteColor(n, RGB(0, 0, 0))
  CreateSprite3D(n,n)
   n+1
Next




;-
;------           P R O C E D U R E S
;-

Procedure AfficheTextcentre3D(Text$,y.i,fondu.i)
 i=0
 For j=1 To Len(Text$)
    DisplaySprite3D(FirstSpriteSmallFont+Asc(Mid(Text$,j,1))-32,i+Random(0)+400-Len(Text$)*8-16, y+Random(0),fondu)
 i=i+16      
 Next
 
EndProcedure


;-
;------           T H E   L O O P
;-

    Repeat
     ExamineMouse() 
     ExamineKeyboard() 
     
     KeyRight.i=0
     KeyUp.i=0
     KeyLeft.I=0
     KeyDown.i=0

     If KeyboardPushed(#PB_Key_F1)
      PageState=0
     EndIf
     If KeyboardPushed(#PB_Key_F2)
      PageState=1
     EndIf
     If KeyboardPushed(#PB_Key_Space)
      Brush=0
     EndIf
     If KeyboardPushed(#PB_Key_Up)
      KeyUp=1
     EndIf
     If KeyboardPushed(#PB_Key_Down)
      KeyDown=1
     EndIf
     If KeyboardPushed(#PB_Key_Right)
      KeyRight=1
     EndIf
     If KeyboardPushed(#PB_Key_Left)
      KeyLeft=1
     EndIf

     
     
     If Start3D()
     ClearScreen(0)  
;-
;-
;--- Page des Tuiles
;-     
  If PageState=0
   If ImageHeight(1)>768 
    If KeyUp=1
      TuileY=TuileY-32
      If TuileY<0:TuileY=0:EndIf
    EndIf
    If KeyDown=1
      TuileY=TuileY+32
      If TuileY>ImageHeight(1)-768:TuileY=ImageHeight(1)-768:EndIf
    EndIf
   EndIf
   If ImageWidth(1)>1024
    If KeyLeft=1
      TuileX=TuileX-32
      If TuileX<0:TuileX=0:EndIf
    EndIf
    If KeyRight=1
      TuileX=TuileX+32
      If TuileX>ImageWidth(1)-1024:TuileX=ImageWidth(1)-1024:EndIf
    EndIf
   EndIf
  
    
     DisplaySprite3D(0,-TuileX,-TuileY,255)
     
     
     ;----- Le bouton est appuyé
     
  
     If MouseButton(1)
       If Brush=0:Brush=1:EndIf
       
        ;--       Definit le cadre de sélection
        PosXB=Int(MouseX()/32)*32+32
        PosYB=Int(MouseY()/32)*32+32
        If PosXB=<PosX : PosXB=PosX+32 : EndIf
        If PosYB=<PosY : PosYB=PosY+32 : EndIf
        If PosXB > SpriteWidth(0) : PosXB = SpriteWidth(0): EndIf
        
        ;--       Dessine le cadre de sélection
     
     
     For i=0 To (PosXB-PosX)
      DisplaySprite3D(1,PosX+i,PosY) 
      DisplaySprite3D(1,PosX+i,PosYB) 
     Next
     
     For i=0 To (PosYB-PosY)
      DisplaySprite3D(1,PosX,PosY+i)
      DisplaySprite3D(1,PosXB,PosY+i) 
     Next
  
     
     DisplaySprite3D(2,PosXB-7,PosYB-7)
  
     
     
   Else
     
      ;----- Le bouton est relaché
      
      
      ;--       Création de la Brush 
      If Brush=1
        BrushSizex=(PosXB-PosX)/32
        BrushSizey=(PosYB-PosY)/32
        ReDim Brush.i(BrushSizex*BrushSizey)
        
        k=0
        For i=0 To BrushSizex-1
         For j=0 To BrushSizey-1
         
         k=k+1
         Brush(k)=((TuileX+Posx)/32)+((TuileY+Posy)/32)*(ImageWidth(1)/32)+i+j*(ImageWidth(1)/32)
         Next
        Next
        
        
        Brush=2
      EndIf
      
      
      ;--       Dessine la Brush
     
     If Brush=2
       PosX=Int(MouseX()/32)*32
       PosY=Int(MouseY()/32)*32
       If PosX > SpriteWidth(0)-BrushSizex*32 : PosX = SpriteWidth(0)-BrushSizex*32: EndIf
       If PosY > SpriteHeight(0)-BrushSizey*32 : PosY = SpriteHeight(0)-BrushSizey*32: EndIf
        
       
       k=0
       For i=0 To BrushSizex-1
         For j=0 To BrushSizey-1
         
         k=k+1
         DisplaySprite3D(FirstSpriteDecor+Brush(k),PosX+i*32,PosY+j*32)
        Next
       Next
       
     EndIf
     
     
     
     ;--       Dessine la croix blanche
     If brush=0
       PosX=Int(MouseX()/32)*32
       PosY=Int(MouseY()/32)*32
       If PosX > SpriteWidth(0)-32 : PosX = SpriteWidth(0)-32: EndIf
       If PosY > SpriteHeight(0)-32 : PosY = SpriteHeight(0)-32: EndIf
       DisplaySprite3D(2,PosX-7,PosY-7)
     EndIf
   EndIf
   
   
   
 EndIf
 
 
 ;-
 ;-
 ;--- Page de la carte
 ;-
  If PageState=1
    
    
    For j=0 To SizeCarteX-1
     For i=0 To SizeCarteY-1
      
      DisplaySprite3D(FirstSpriteDecor+Mapx(j+i*SizeCarteX),j*32,i*32,255)
     Next     
    Next     
     
     ;----- Le bouton est appuyé
     
  
     If MouseButton(1)
       If Brush=0:Brush=1:EndIf
      ;--     Construction d'une Brush 
       If Brush=1
       
        ;--       Definit le cadre de sélection
        PosXB=Int(MouseX()/32)*32+32
        PosYB=Int(MouseY()/32)*32+32
        If PosXB=<PosX : PosXB=PosX+32 : EndIf
        If PosYB=<PosY : PosYB=PosY+32 : EndIf
        
        
         If PosXB > SizeCarteX*32 : PosXB = SizeCarteX*32: EndIf
         If PosYB > SizeCarteY*32 : PosYB = SizeCarteY*32: EndIf
      
        
        
        
        ;--       Dessine le cadre de sélection
     
     
     For i=0 To (PosXB-PosX)
      DisplaySprite3D(1,PosX+i,PosY) 
      DisplaySprite3D(1,PosX+i,PosYB) 
     Next
     
     For i=0 To (PosYB-PosY)
      DisplaySprite3D(1,PosX,PosY+i)
      DisplaySprite3D(1,PosXB,PosY+i) 
     Next
  
     
     DisplaySprite3D(2,PosXB-7,PosYB-7)
     EndIf
     
      ;--     Copie de la Brush dans la carte 
     
     If Brush=2
       
        k=0
        For i=0 To BrushSizex-1
         For j=0 To BrushSizey-1
         
         k=k+1
         Mapx((Posx/32)+(Posy/32)*SizeCarteX+i+j*SizeCarteX) = Brush(k) ;(Posx/32)+(Posy/32)*16+i+j*16
         
       Next
        Next
       
       
       
     EndIf
     
   Else
     
      ;----- Le bouton est relaché
      
      
      ;--       Création de la Brush 
      If Brush=1
        BrushSizex=(PosXB-PosX)/32
        BrushSizey=(PosYB-PosY)/32
        ReDim Brush.i(BrushSizex*BrushSizey)
        
        k=0
        For i=0 To BrushSizex-1
         For j=0 To BrushSizey-1
         
           k=k+1
           
         Brush(k)= Mapx((Posx/32)+(Posy/32)*SizeCarteX+i+j*SizeCarteX)      
           
         Next
        Next
        
        
        Brush=2
      EndIf
      
      
      ;--       Dessine la Brush
     
     If Brush=2
       PosX=Int(MouseX()/32)*32
       PosY=Int(MouseY()/32)*32
       If PosX > SizeCarteX*32-BrushSizex*32 : PosX = SizeCarteX*32-BrushSizex*32: EndIf
       If PosY > SizeCarteY*32-BrushSizey*32 : PosY = SizeCarteY*32-BrushSizey*32: EndIf
        
       
       k=0
       For i=0 To BrushSizex-1
         For j=0 To BrushSizey-1
         
         k=k+1
         DisplaySprite3D(FirstSpriteDecor+Brush(k),PosX+i*32,PosY+j*32)
        Next
       Next
       
     EndIf
     
     
     
     ;--       Dessine la croix blanche
     If brush=0
       PosX=Int(MouseX()/32)*32
       PosY=Int(MouseY()/32)*32
       If PosX > SizeCarteX*32-32 : PosX = SizeCarteX*32-32: EndIf
       If PosY > SizeCarteY*32-32 : PosY = SizeCarteY*32-32: EndIf
       DisplaySprite3D(2,PosX-7,PosY-7)
     EndIf
   EndIf
   
   
   
 EndIf
 
 
 
 
 
   If PageState= 0
     AfficheTextcentre3D("F2 = Carte",10,255)
   If Brush=0:   AfficheTextcentre3D("Select Brush with left Button",90,255) : EndIf
   If Brush=2:   AfficheTextcentre3D("Space = New Brush",90,255) : EndIf
   If Brush=0:   AfficheTextcentre3D("Press Up, Down To Move Picture",110,255) : EndIf
      
   EndIf
   
   
   If PageState= 1
     AfficheTextcentre3D("F1 = Tuiles",10,255)
   If Brush=0:   AfficheTextcentre3D("Select Brush with left Button",90,255) : EndIf
   If Brush=2:   AfficheTextcentre3D("Space = New Brush",90,255) : EndIf
   If Brush=2:   AfficheTextcentre3D("Insert Brush with left Button",110,255) : EndIf
   
   EndIf
   
   
  Stop3D()
  EndIf

    FlipBuffers()

    
Until KeyboardPushed(#PB_Key_Escape)
  
End     
Dernière modification par Cool Dji le mer. 08/juin/2011 21:35, modifié 1 fois.
Only PureBasic makes it possible
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Map Editor 2D

Message par Cool Dji »

Hop,

Un tout petit pas de plus :
Up & Down pour déplacer la page des tuiles / Maj dans code précédent.
Only PureBasic makes it possible
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Map Editor 2D

Message par Ar-S »

J'ai pas encore installé la beta de la 4.60...
~~~~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
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Map Editor 2D

Message par Cool Dji »

Ar-S a écrit :J'ai pas encore installé la beta de la 4.60...
Rhoooooooooo :D
Only PureBasic makes it possible
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Map Editor 2D

Message par Cool Dji »

Hop,

Encore un tout petit pas de plus :
Right & Left pour déplacer la page des tuiles / Maj dans code précédent.
Only PureBasic makes it possible
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Map Editor 2D

Message par G-Rom »

Dur dur l'interface :D
pas évident à prendre en main.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Map Editor 2D

Message par Cool Dji »

ouaip, je vais diminuer le nombre de touches à utiliser.
Déjà, je vais virer les touches up left down right et faire les déplacements en fonction du déplacement de la souris sur les bords.
Après le passage de l'écran de tuiles à la carte avec F1 et F2, c'est peut être un peu chiant.

Je me rends pas bien compte, j'ai l'habitude de cette interface :mrgreen:
Only PureBasic makes it possible
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Map Editor 2D

Message par G-Rom »

tu devrais te créer une mini-gui dans un premier temps qui corresponds à tes besoins , une gui que tu pourrais réutilisé dans un autre projet bien sur.
une fois que tu as l'outil de base , tu peut faire des outils plus évolué , cromagnon n'a pas fait de fusil tout de suite , mais des lances en bois et en silex :D
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Map Editor 2D

Message par Cool Dji »

Vi, c'est un peu l'idée...
Merci du conseil, je fais réflechir sur une extra-mini-GUI avec mon ami Google :D
Only PureBasic makes it possible
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Map Editor 2D

Message par G-Rom »

pas besoin de google.

tu devrais partir avec une structure standard que tu n'utiliseras jamais directement , je m'explique :

Code : Tout sélectionner

Structure guiGadget
  Position.vecteur2
  Taille.vecteur2
  Evenement.w
  *DrawCallBack.i
  *EventCallBack.i
EndStructure
Avec cette structure , tu créer toute les fonctions pour remplir les champs :

Code : Tout sélectionner

SetGadgetPosition(*Gadget.guiGadget, x.f , y.f ) 
etc...
et une fonction de rendu qui servira pour tout les gadgets que tu vas créer :

Code : Tout sélectionner

Procedure DrawGadget(*Gadget.guiGadget)
 CallCFunctionFast(DrawCallBack)
EndProcedure



une fois ta structure fonctionnel , code le premier gadget , par exemple un Bouton :

Code : Tout sélectionner

Structure ButtonGadget Extends guiGadget
  Toggle.b
EndStructure
avec les fonctions qui vont bien pour la création et le rendu du bouton :

Code : Tout sélectionner

Procedure DessineBoutton()
 DrawCeQueTuVeut(bouton,....)
endProcedure

Procedure EvenementBouton()
 If souris click & souris dans le bouton // pseudo code...
  toggle = 1
 endif 
endprocedure

Procedure CreateBouton(x,y)

*Boutton.ButtonGadget = allocatememory(sizeof(ButtonGadget))
*Boutton\DrawCallBack = @DessineBoutton()
*Boutton\EventCallBack = @EvenementBouton()
etc...
endprocedure
Ton bouton dépends donc de guiGadget.
tu peut faire le rendu de cette manière :

Code : Tout sélectionner

MonBouton =  CreateBouton(10,10,...)

DrawGadget(@MonBouton)

Ensuite tu peut avoir une liste qui répertories tout les gadgets existant , tu les ajoutes dans la liste à leur création :
Procedure CreateBouton(x,y)

*Boutton.ButtonGadget = allocatememory(sizeof(ButtonGadget))
*Boutton\DrawCallBack = @DessineBoutton()
*Boutton\EventCallBack = @EvenementBouton()

AddElement(MALISTEDEGADGET())
MALISTEDEGADGET() = *Boutton

endprocedure

et avec cette liste , tu appelles à intervalles régulière la procédure qui gère les événements de chaque gadget , chaque evenement part dans une pile , que tu vide au fur & à mesure que tu consultes les évenement survenu via une fct de ce genre : guiGetEvent()


@++
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Map Editor 2D

Message par graph100 »

[digression sur les GUI]
C'est super interressant ça G-rom :D , ça m'a éclaircit rapidement et sans trop de soucis mes idées sur les GUI.
Par contre y a un truc sur lequel j'ai buté :

CallCFunctionFast : tu l'utilise pour appeler une fonction écrite en pb, dans le même code ? c'est ça ? je ne savais pas que c'étais possible ^^, j'aurais plutôt utilisé les Interfaces.
G-Rom a écrit :et une fonction de rendu qui servira pour tout les gadgets que tu vas créer :

Code : Tout sélectionner

Procedure DrawGadget(*Gadget.guiGadget)
 CallCFunctionFast(DrawCallBack)
EndProcedure
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Map Editor 2D

Message par G-Rom »

je fait un petit zip avec des bases solides pour une gui , tu vas comprendre.
attends un peu je suis dessus. ;)
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Map Editor 2D

Message par G-Rom »

Voila le petit zip : http://code.google.com/p/purebasic-gui/downloads/list
Il contient 4 fichiers :
  • guiGadget.pbi
    guiSystem.pbi
    guiButtonGadget.pbi
    MonProgramme.pb
guiGadget.pbi
Contient la structure de base commune à tout les gadgets ainsi que les fonctions de base communes à tout les gadgets.

guiSystem.pbi
C'est un peu le fichier central de la gui , il s'occupe de rendre tout les gadgets à l'écran , gère les événements.

guiButtonGadget.pbi
Exemple basic d'un simple bouton à 2 états , on/off

MonProgramme.pb
Exemple d'utilisation de la GUI.

A vous de l'améliorer maintenant, vous avez des fondations solides ;)
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Map Editor 2D

Message par Cool Dji »

Effectivement, on passe au niveau supérieur avec ce genre de structure.
Merci G-Rom !

Juste un soucis, ça compile pas, bloque sur le _EventButtonGadget (Invalid Memory Access), je regarde ya peut être un pb de syntaxe qui traine...
Only PureBasic makes it possible
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Map Editor 2D

Message par G-Rom »

_EventGuiGadget() tu veut dire ?
sa plante sur cette ligne : CallCFunctionFast(*gadget\mEventCallBack,*gadget) ?

ici ca marche bien :/ , essaye avec CallFunctionFast au lieu de CallCFunctionFast
Répondre