Page 1 sur 2

tut éditeur de map simplifié

Publié : jeu. 21/oct./2004 20:49
par comtois
l'objet de ce tut est de donner les bases pour réaliser un éditeur de map.
il n'y aura pas de gestion de scrolling , de couches , etc ...
ça sera sommaire , pour qu'ensuite chacun puisse l'adapter à son besoin.

Que devra faire cet éditeur ?

(en sachant qu'il est prévu pour fonctionner en mode plein écran , en 800x600)

1 afficher 10 briques (tiles) de 32x32.
pour les besoins du tut , elles seront créées dans le programme.
il sera aisé de remplacer les CreateSprite() par des LoadSprite() plus tard.

2 Permettre la construction d'une map à l'aide des 10 briques .
la map fera 20x15 briques.
il sera aussi possible de choisir un numéro de map , afin de créer plusieurs niveaux d'un jeu .

3 Sauvegarder la map

4 Charger la map

_________________________________________________

Entrons dans le vif du sujet , tout d'abord les initialisations habituelles.

Je ne détaille pas , si jamais ce début de code nécessite quelques précisions , il ne faut pas hésiter à demander .

Code : Tout sélectionner

;Définition de l'écran
#LargeurEcran  = 800
#HauteurEcran = 600
#ProfondeurEcran  = 32
  
;{- Initialisation
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
  End
ElseIf OpenScreen( #LargeurEcran, #HauteurEcran , #ProfondeurEcran , "Editeur map 2D" ) = 0
  MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
  End
EndIf
on a besoin de 10 briques , alors on va les créer :

Code : Tout sélectionner

;Création des Briques
For i=1 To #NbBriques
  CreateSprite(i,#TailleBriqueX,#TailleBriqueY)
  StartDrawing(SpriteOutput(i))
    Box(0,0,SpriteWidth(i),SpriteHeight(i),RGB(Random(255),Random(255),Random(255)))
  StopDrawing()
Next i
j'oubliais ,il faudra aussi afficher une souris , pour cela on fait un petit sprite

Code : Tout sélectionner

;Creation d'un sprite pour la souris
CreateSprite(#Souris, 32, 32)
StartDrawing(SpriteOutput(#Souris))
  Circle(4, 4, 5, RGB(255, 255, 255))
  Line(0, 0, SpriteWidth(#Souris), SpriteHeight(#Souris), RGB(255, 255, 255))
StopDrawing()
et on peut déjà afficher le résultat à l'écran

Code : Tout sélectionner

;Définition de l'écran
#LargeurEcran  = 800
#HauteurEcran = 600
#ProfondeurEcran  = 32 
;Définition souris
#Souris = 0                                                   ; No du sprite de la souris 

;Définitions des briques
#NbBriques = 10                                               ; Nombre de briques (Tiles) 
#TailleBriqueX = 32                                           ; Dimension en largeur d'une brique
#TailleBriqueY = 32                                           ; Dimension en hauteur d'une brique
#BriqueMiniX   = 10                                           ; Position de départ en X pour l'affichage des briques
#BriqueMiniY   = 550                                          ; Position de départ en Y pour l'affichage des briques
#BriqueMaxiX   = #BriqueMiniX + #NbBriques * #TailleBriqueX   ; Position de fin en X pour l'affichage des briques
#BriqueMaxiY   = #BriqueMiniY + #TailleBriqueY                ; Position de fin en Y pour l'affichage des briques
  
;- Initialisation
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
  End
ElseIf OpenScreen( #LargeurEcran, #HauteurEcran , #ProfondeurEcran , "Editeur map 2D" ) = 0
  MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
  End
EndIf

;Creation d'un sprite pour la souris
CreateSprite(#Souris, 32, 32)
StartDrawing(SpriteOutput(#Souris))
  Circle(4, 4, 5, RGB(255, 255, 255))
  Line(0, 0, SpriteWidth(#Souris), SpriteHeight(#Souris), RGB(255, 255, 255))
StopDrawing()

;Création des Briques
For i=1 To #NbBriques
  CreateSprite(i, #TailleBriqueX, #TailleBriqueY)
  StartDrawing(SpriteOutput(i))
    Box(0,0,#TailleBriqueX, #TailleBriqueY, RGB(Random(255), Random(255), Random(255)))
  StopDrawing()
Next i

;- Les procédures
Procedure AfficheBriques()
  ;Affichage horizontale des briques à partir des coordonnées (#BriqueMiniX,#BriqueMiniY)
  For i=1 To #NbBriques
    DisplaySprite(i,#BriqueMiniX + ((i-1)* #TailleBriqueX), #BriqueMiniY)
  Next i  
EndProcedure  

;-Boucle principale
Repeat
  ClearScreen(0,0,0)
  ExamineKeyboard()
  ExamineMouse()
  AfficheBriques()
  ;Affiche la souris
  DisplayTransparentSprite(#Souris,MouseX(),MouseY())
  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) 


La prochaine fois , j'ajouterai l'affichage d'un cadre pour limiter la zone de la map , et la sélection d'une brique . Un cadre indiquera la brique sélectionnée .

Publié : jeu. 21/oct./2004 21:39
par garzul
Grrrr tu reprend mon éditeur :lol: Nan je m'en fous :) j'ai fait un editeur pour mon Labyrinthus ( vous en saurez plus quand tout sa seras finie ) donc voici l'éditeur que j'ai coder et merci comtois et aux autre même si a part pour placer des texture j'ai eu dezs probleme les autre truc c'est du 100% Garzul :) ====> http://purebasicmeslog.chez.tiscali.fr/LabyEditor.zip j'atend les commentaire . @++

Publié : jeu. 21/oct./2004 22:29
par comtois
désolé d'avoir repris ton éditeur :)

Voila la suite

Code : Tout sélectionner

;/ Constantes
;Définition de l'écran
#LargeurEcran  = 800
#HauteurEcran = 600
#ProfondeurEcran  = 32 

;Définition souris
#Souris = 11            ; No du sprite de la souris 
;Efface 
#Efface = 0

;Définitions des briques
Structure Brique
  No.l                  ; Numéro de la brique sélectionnée 
  Nb.l                  ; Nombre de briques (Tiles) 
  TailleX.l             ; Dimension en largeur d'une brique
  TailleY.l             ; Dimension en hauteur d'une brique
  MiniX.l               ; Position de départ en X pour l'affichage des briques
  MiniY.l               ; Position de départ en Y pour l'affichage des briques
  MaxiX.l               ; Position de fin en X pour l'affichage des briques
  MaxiY.l               ; Position de fin en Y pour l'affichage des briques  
  CadreX1.l             ; Coordonnée en X du cadre de sélection 
  CadreY1.l             ; Coordonnée en Y du cadre de sélection  
EndStructure  
  
;Définitions de la map  
Structure Map
  TailleX.l             ; Nombre de briques en X
  TailleY.l             ; Nombre de briques en Y
  MiniX.l               ; Position de départ en X pour l'affichage de la map
  MiniY.l               ; Position de départ en Y pour l'affichage de la map
  MaxiX.l               ; Position de fin en X pour l'affichage de la map
  MaxiY.l               ; Position de fin en Y pour l'affichage de la map
EndStructure

Global Brique.Brique
Global Map.Map
  
Brique\No      = 1 
Brique\Nb      = 10                                        
Brique\TailleX = 32  
Brique\TailleY = 32                                        
Brique\MiniX   = 50                                           
Brique\MiniY   = 550                                          
Brique\MaxiX   = Brique\MiniX + Brique\Nb * Brique\TailleX  
Brique\MaxiY   = Brique\MiniY + Brique\TailleY    
Brique\CadreX1 = Brique\MiniX 
Brique\CadreY1 = Brique\MiniY            

 
Map\TailleX    = 20                                            
Map\TailleY    = 15                                              
Map\MiniX      = 50                                               
Map\MiniY      = 50                                               
Map\MaxiX      = Map\MiniX + Map\TailleX * Brique\TailleX       
Map\MaxiY      = Map\MiniY + Map\TailleY * Brique\TailleY   
Dim TabMap(Map\TailleX,Map\TailleY) 

;- Initialisation
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
  End
ElseIf OpenScreen( #LargeurEcran, #HauteurEcran , #ProfondeurEcran , "Editeur map 2D" ) = 0
  MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
  End
EndIf

;Creation d'un sprite pour la souris
CreateSprite(#Souris, 32, 32)
StartDrawing(SpriteOutput(#Souris))
  Circle(4, 4, 5, #White)
  Line(0, 0, SpriteWidth(#Souris), SpriteHeight(#Souris), #White)
StopDrawing()

;Creation d'un sprite pour effacer
CreateSprite(#Efface, 32, 32)
StartDrawing(SpriteOutput(#Efface))
  Box(0,0,Brique\TailleX, Brique\TailleY, 0)
StopDrawing()

;Création des Briques
For i=1 To Brique\Nb
  CreateSprite(i, Brique\TailleX, Brique\TailleY)
  StartDrawing(SpriteOutput(i))
    Box(0,0,Brique\TailleX, Brique\TailleY, RGB(Random(255), Random(255), Random(255)))
  StopDrawing()
Next i

;- Les procédures
Procedure AfficheBriques()
  ;Affichage horizontale des briques à partir des coordonnées (#BriqueMiniX,#BriqueMiniY)
  For i=1 To Brique\Nb
    DisplaySprite(i,Brique\MiniX + ((i-1)* Brique\TailleX), Brique\MiniY)
  Next i  
EndProcedure  
Procedure AfficheCadres()
  StartDrawing(ScreenOutput())
    DrawingMode(4)
    ;Trace le cadre de la map
    Box(Map\MiniX,Map\MiniY,Map\TailleX * Brique\TailleX, Map\TailleY * Brique\TailleY,#White)
    ;Trace le cadre de la brique sélectionnée
    Box(Brique\CadreX1,Brique\CadreY1,Brique\TailleX,Brique\TailleY,#White)
  StopDrawing()
EndProcedure
Procedure AfficheMap()
  For v=0 To Map\TailleY-1
    For u=0 To Map\TailleX-1
      DisplaySprite(TabMap(u,v),Map\MiniX + u * Brique\TailleX, Map\MiniY + v * Brique\TailleY)
    Next u
  Next v
EndProcedure 

;-Boucle principale
Repeat
  ClearScreen(0,0,0)
  ExamineKeyboard()
  ExamineMouse()
  ;Affiche les briques
  AfficheBriques()
  ;Affiche la map
  AfficheMap()  
  ;Affiche les cadres
  AfficheCadres()
  ;Affiche la souris
  DisplayTransparentSprite(#Souris,MouseX(),MouseY())
  ;Test le bouton gauche de la souris
  Mx = MouseX()
  My = MouseY()
  If MouseButton(1)
    ; la souris se trouve sur une brique ?
    If Mx > Brique\MiniX And Mx < Brique\MaxiX
      If My > Brique\MiniY And My < Brique\MaxiY
        Brique\No = ((Mx - Brique\MiniX) / Brique\TailleX) + 1
        Brique\CadreX1 = Brique\MiniX + (Brique\No-1)* Brique\TailleX
      EndIf
    EndIf  
    ; la souris se trouve sur la map ?
    If Mx > Map\MiniX And Mx < Map\MaxiX
      If My > Map\MiniY And My < Map\MaxiY
        Bx = ((Mx - Map\MiniX) / Brique\TailleX) 
        by = ((My - Map\MiniY) / Brique\TailleY)
        TabMap(Bx,by)=Brique\No
      EndIf
    EndIf 
  EndIf  
  ;Test le bouton droit de la souris
  If MouseButton(2)
    ; la souris se trouve sur la map ?
    If Mx > Map\MiniX And Mx < Map\MaxiX
      If My > Map\MiniY And My < Map\MaxiY
        Bx = ((Mx - Map\MiniX) / Brique\TailleX) 
        by = ((My - Map\MiniY) / Brique\TailleY)
        TabMap(Bx,by)=#Efface
      EndIf
    EndIf 
  EndIf  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)  

Publié : ven. 22/oct./2004 18:26
par comtois
C'est le même code légèrement remanié , à la prochaine étape , il sera possible de sauvegarder et charger la map.

Code : Tout sélectionner

;/ Constantes
;Définition de l'écran
#LargeurEcran  = 800
#HauteurEcran = 600
#ProfondeurEcran  = 32 

;Définition souris
#Souris = 11            ; No du sprite de la souris 
;Efface 
#Efface = 0

;Définitions des briques
Structure Brique
  No.l                  ; Numéro de la brique sélectionnée 
  Nb.l                  ; Nombre de briques (Tiles) 
  TailleX.l             ; Dimension en largeur d'une brique
  TailleY.l             ; Dimension en hauteur d'une brique
  MiniX.l               ; Position de départ en X pour l'affichage des briques
  MiniY.l               ; Position de départ en Y pour l'affichage des briques
  MaxiX.l               ; Position de fin en X pour l'affichage des briques
  MaxiY.l               ; Position de fin en Y pour l'affichage des briques  
  CadreX1.l             ; Coordonnée en X du cadre de sélection 
  CadreY1.l             ; Coordonnée en Y du cadre de sélection  
EndStructure  
  
;Définitions de la map  
Structure Map
  TailleX.l             ; Nombre de briques en X
  TailleY.l             ; Nombre de briques en Y
  MiniX.l               ; Position de départ en X pour l'affichage de la map
  MiniY.l               ; Position de départ en Y pour l'affichage de la map
  MaxiX.l               ; Position de fin en X pour l'affichage de la map
  MaxiY.l               ; Position de fin en Y pour l'affichage de la map
EndStructure

Global Brique.Brique
Global Map.Map
  
Brique\No      = 1 
Brique\Nb      = 10                                        
Brique\TailleX = 32  
Brique\TailleY = 32                                        
Brique\MiniX   = 50                                           
Brique\MiniY   = 550                                          
Brique\MaxiX   = Brique\MiniX + Brique\Nb * Brique\TailleX  
Brique\MaxiY   = Brique\MiniY + Brique\TailleY    
Brique\CadreX1 = Brique\MiniX 
Brique\CadreY1 = Brique\MiniY            

 
Map\TailleX    = 20                                            
Map\TailleY    = 15                                              
Map\MiniX      = 50                                               
Map\MiniY      = 50                                               
Map\MaxiX      = Map\MiniX + Map\TailleX * Brique\TailleX       
Map\MaxiY      = Map\MiniY + Map\TailleY * Brique\TailleY   
Dim TabMap(Map\TailleX,Map\TailleY) 

;- Initialisation
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
  End
ElseIf OpenScreen( #LargeurEcran, #HauteurEcran , #ProfondeurEcran , "Editeur map 2D" ) = 0
  MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
  End
EndIf

;Creation d'un sprite pour la souris
CreateSprite(#Souris, 32, 32)
StartDrawing(SpriteOutput(#Souris))
  Circle(4, 4, 5, #White)
  Line(0, 0, SpriteWidth(#Souris), SpriteHeight(#Souris), #White)
StopDrawing()

;Creation d'un sprite pour effacer
CreateSprite(#Efface, 32, 32)
StartDrawing(SpriteOutput(#Efface))
  Box(0,0,Brique\TailleX, Brique\TailleY, 0)
StopDrawing()

;Création des Briques
For i=1 To Brique\Nb
  CreateSprite(i, Brique\TailleX, Brique\TailleY)
  StartDrawing(SpriteOutput(i))
    Box(0,0,Brique\TailleX, Brique\TailleY, RGB(Random(255), Random(255), Random(255)))
  StopDrawing()
Next i

;- Les procédures
Procedure AfficheBriques()
  ;Affichage horizontale des briques à partir des coordonnées (#BriqueMiniX,#BriqueMiniY)
  For i=1 To Brique\Nb
    DisplaySprite(i,Brique\MiniX + ((i-1)* Brique\TailleX), Brique\MiniY)
  Next i  
EndProcedure  
Procedure AfficheCadres()
  StartDrawing(ScreenOutput())
    DrawingMode(4)
    ;Trace le cadre de la map
    Box(Map\MiniX,Map\MiniY,Map\TailleX * Brique\TailleX, Map\TailleY * Brique\TailleY,#White)
    ;Trace le cadre de la brique sélectionnée
    Box(Brique\CadreX1,Brique\CadreY1,Brique\TailleX,Brique\TailleY,#White)
  StopDrawing()
EndProcedure
Procedure AfficheMap()
  For v=0 To Map\TailleY-1
    For u=0 To Map\TailleX-1
      DisplaySprite(TabMap(u,v),Map\MiniX + u * Brique\TailleX, Map\MiniY + v * Brique\TailleY)
    Next u
  Next v
EndProcedure 
Procedure TestBrique(SourisX.l,SourisY.l)
  ; la souris se trouve sur une brique ?
  If SourisX > Brique\MiniX And SourisX < Brique\MaxiX
    If SourisY > Brique\MiniY And SourisY < Brique\MaxiY
      ;Calcul le no de la brique sélectionnée
      Brique\No = ((SourisX - Brique\MiniX) / Brique\TailleX) + 1
      ;Calcul la position du cadre de sélection 
      Brique\CadreX1 = Brique\MiniX + (Brique\No-1)* Brique\TailleX
    EndIf
  EndIf  
EndProcedure
Procedure TestMap(SourisX.l,SourisY.l,NoBrique.l)
  ; la souris se trouve sur la map ?
  If SourisX > Map\MiniX And SourisX < Map\MaxiX
    If SourisY > Map\MiniY And SourisY < Map\MaxiY
      ;Conversion des coordonnées écran en coordonnées map 
      Bx = ((SourisX - Map\MiniX) / Brique\TailleX) 
      by = ((SourisY - Map\MiniY) / Brique\TailleY)
      TabMap(Bx,by)=NoBrique
    EndIf
  EndIf 
EndProcedure  
Procedure GestionSouris()
  If ExamineMouse()
    Mx = MouseX()
    My = MouseY()
    ;Affiche la souris
    DisplayTransparentSprite(#Souris,Mx,My)
    ;Test le bouton gauche de la souris
    If MouseButton(1)
      ; la souris se trouve sur une brique ?
      TestBrique(Mx, My)
      ; la souris se trouve sur la map ?
      TestMap(Mx, My, Brique\No)
    EndIf  
    ;Test le bouton droit de la souris
    If MouseButton(2)
      ; la souris se trouve sur la map ?
      TestMap(Mx, My, #Efface)
    EndIf  
  EndIf
EndProcedure    

;-Boucle principale
Repeat
  ClearScreen(0,0,0)
  ExamineKeyboard()
  ;Affiche les briques
  AfficheBriques()
  ;Affiche la map
  AfficheMap()  
  ;Affiche les cadres
  AfficheCadres()
  ;Gestion de la souris
  GestionSouris()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) 

Publié : ven. 22/oct./2004 18:57
par garzul
Cool Merci Comtois ( même si sa me sert pas , on peut voir differente façon de programmer un éditeur :) ) . ( Par contre pour les débutant c'est génial :P )

Publié : ven. 22/oct./2004 19:02
par comtois
ben oui ,tu n'en as pas besoin toi :)

mais bon , comme il est presque fini , je vais ajouter une gestion multi couches .
Disons 3 couches
1 couche pour le décor , il n'y a pas de collision avec cette couche
1 couche pour les briques avec lesquelles il y a collision ( bloque le perso )
1 couche pour les bonus , dans cette couche , tout ce qui est en collision sera ramassé et supprimé de la couche .

et ensuite il faudra programmer un petit code qui utilise la map , pour montrer comment gérer les couches .

Publié : ven. 22/oct./2004 21:19
par comtois
Nouvelle version , cette fois ci , elle comporte la sauvegarde des maps , il est possible d'en créer à volonté :)

J'ai aussi changé la gestion de la souris et le contrôle des briques et de la map , histoire de montrer une autre façon de procéder .

et j'ai figé la couleur des briques dans des datas , comme ça quand on charge une map , on retrouve les bonnes couleurs.

Bon la prochaine étape , gérer 3 couches.

[EDIT] Changement léger du code pour afficher la brique sélectionnée sous la souris (seulement au dessus de la map) .

Code : Tout sélectionner

;Comtois 
;22/10/2004
;Nouveau > Check Box

;/ Constantes
;/Racine pour le nom du fichier
#Fichier = "Niveau"      ; Le nom du fichier de sauvegarde sera constitué de cette racine , et du numéro de la map  

;/Définition de l'écran
#LargeurEcran  = 800
#HauteurEcran = 600
#ProfondeurEcran  = 32 

;/Définition souris
#Souris = 11            ; No du sprite de la souris 
#SO_AucunBouton  = 0
#SO_BoutonGauche = 1
#SO_BoutonDroit  = 2
#SO_HorsCadre    = -1
Structure Souris
  x.l
  y.l
EndStructure  
Global Souris.Souris 

;/Définitions CheckBox
Enumeration
  #CB_Couche0  
  #CB_Couche1
  #CB_Couche2 
EndEnumeration
Structure CheckBox
  id.l
  x1.l                  ; Position de départ en X pour l'affichage
  Y1.l                  ; Position de départ en Y pour l'affichage
  X2.l
  Y2.l
  Largeur.l  
  Hauteur.l
  Etat.l
  MemCheck.l
EndStructure
NewList CheckBox.CheckBox()
For i=0 To 2
  AddElement(CheckBox())
  CheckBox()\id = i
  Read CheckBox()\Largeur
  Read CheckBox()\Hauteur
  Read CheckBox()\x1
  Read CheckBox()\Y1
  CheckBox()\X2 = CheckBox()\x1 + CheckBox()\Largeur
  CheckBox()\Y2 = CheckBox()\Y1 + CheckBox()\Hauteur
Next i  
  
;/Définitions Boutons 
Enumeration
  #BT_Couche0  
  #BT_Couche1
  #BT_Couche2 
  #BT_Sauve 
  #BT_Charge
  #BT_EffaceTout
  #BT_Remplissage
  #BT_Precedent
  #BT_NoMap
  #BT_Suivant
EndEnumeration

Structure Bouton
  id.l
  Texte.s
  x1.l                  ; Position de départ en X pour l'affichage
  Y1.l                  ; Position de départ en Y pour l'affichage
  X2.l
  Y2.l
  Largeur.l  
  Hauteur.l
  MemBouton.l
EndStructure
NewList Bouton.Bouton()
Restore Boutons
For i=0 To 9
  AddElement(Bouton())
  Bouton()\id = i
  Read Bouton()\Texte 
  ;je lis un string uniquement pour faire tenir sur une ligne Data les paramètres d'un bouton 
  Read t$ : Bouton()\Largeur = Val(t$) 
  Read t$ : Bouton()\Hauteur = Val(t$) 
  Read t$ : Bouton()\x1      = Val(t$)   
  Read t$ : Bouton()\Y1      = Val(t$) 
  Bouton()\X2 = Bouton()\x1 + Bouton()\Largeur
  Bouton()\Y2 = Bouton()\Y1 + Bouton()\Hauteur
Next i 
 
;/Définitions des briques
;Efface 
#Efface = 0             ; No du sprite de la brique noire ( pour effacer )
Structure Brique
  No.l                  ; Numéro de la brique sélectionnée 
  Nb.l                  ; Nombre de briques (Tiles) 
  Largeur.l             ; Dimension en largeur d'une brique
  Hauteur.l             ; Dimension en hauteur d'une brique
  x1.l                  ; Position de départ en X pour l'affichage des briques
  Y1.l                  ; Position de départ en Y pour l'affichage des briques
  X2.l                  ; Position de fin en X pour l'affichage des briques
  Y2.l                  ; Position de fin en Y pour l'affichage des briques  
  CadreX1.l             ; Coordonnée en X du cadre de sélection 
  CadreY1.l             ; Coordonnée en Y du cadre de sélection  
EndStructure  
Global Brique.Brique
Brique\No      = 1 
Brique\Nb      = 10                                        
Brique\Largeur = 32  
Brique\Hauteur = 32                                        
Brique\x1   = 50                                           
Brique\Y1   = 550                                          
Brique\X2   = Brique\x1 + Brique\Nb * Brique\Largeur  
Brique\Y2   = Brique\Y1 + Brique\Hauteur    
Brique\CadreX1 = Brique\x1 
Brique\CadreY1 = Brique\Y1 

;/Définitions de la map  
#MaxCouche = 2
Structure Map
  No.l                  ; Numéro de la map en cours 
  Couche.l              ; Numéro de la couche ( 0 à 2)
  Largeur.l             ; Nombre de briques en X
  Hauteur.l             ; Nombre de briques en Y
  x1.l                  ; Position de départ en X pour l'affichage de la map
  Y1.l                  ; Position de départ en Y pour l'affichage de la map
  X2.l                  ; Position de fin en X pour l'affichage de la map
  Y2.l                  ; Position de fin en Y pour l'affichage de la map
EndStructure
Global Map.Map
Map\No         = 1 
Map\Couche     = 0
Map\Largeur    = 20                                            
Map\Hauteur    = 15                                              
Map\x1      = 50                                               
Map\Y1      = 50                                               
Map\X2      = Map\x1 + Map\Largeur * Brique\Largeur       
Map\Y2      = Map\Y1 + Map\Hauteur * Brique\Hauteur   
Dim TabMap(#MaxCouche,Map\Largeur,Map\Hauteur)

;- Initialisation
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
  End
ElseIf OpenScreen( #LargeurEcran, #HauteurEcran , #ProfondeurEcran , "Editeur map 2D" ) = 0
  MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
  End
EndIf

;Creation d'un sprite pour la souris
CreateSprite(#Souris, 32, 32)
StartDrawing(SpriteOutput(#Souris))
  Circle(4, 4, 5, #White)
  Line(0, 0, SpriteWidth(#Souris), SpriteHeight(#Souris), #White)
StopDrawing()

;Creation d'un sprite pour effacer
CreateSprite(#Efface, 32, 32)
StartDrawing(SpriteOutput(#Efface))
  Box(0,0,Brique\Largeur, Brique\Hauteur, 0)
StopDrawing()

;Création des Briques
For i=1 To Brique\Nb
  Read rouge
  Read vert
  Read bleu
  CreateSprite(i, Brique\Largeur, Brique\Hauteur)
  StartDrawing(SpriteOutput(i))
    Box(0,0,Brique\Largeur, Brique\Hauteur, RGB(rouge, vert, bleu))
  StopDrawing()
Next i

;- Les procédures
Procedure SauveMap()
  Fichier$=#Fichier + Str(Map\No) + ".Map" 
  If CreateFile(0,Fichier$)
    For Couche=0 To #MaxCouche
      For v=0 To Map\Hauteur-1
        For u=0 To Map\Largeur-1
          WriteLong(TabMap(Couche,u,v))
        Next u
      Next v
    Next Couche  
    CloseFile(0)
  EndIf  
EndProcedure  
Procedure ChargeMap()
  Fichier$=#Fichier + Str(Map\No) + ".Map" 
  If OpenFile(0,Fichier$)
    For Couche=0 To #MaxCouche
      For v=0 To Map\Hauteur-1
        For u=0 To Map\Largeur-1
          TabMap(Couche,u,v)=ReadLong()
        Next u
      Next v
    Next Couche  
    CloseFile(0)
  EndIf  
EndProcedure 
Procedure.l Souris(x1.l,Y1.l,X2.l,Y2.l)
  If ExamineMouse()
    Souris\x = MouseX()
    Souris\y = MouseY()
    ;Contrôle l'encadrement  
    If Souris\x > x1 And Souris\x < X2 And Souris\y > Y1 And Souris\y < Y2
      If MouseButton(#SO_BoutonGauche)
        ProcedureReturn #SO_BoutonGauche
      ElseIf MouseButton(#SO_BoutonDroit)  
        ProcedureReturn #SO_BoutonDroit
      Else 
        ProcedureReturn #SO_AucunBouton
      EndIf 
    EndIf
    ProcedureReturn #SO_HorsCadre
  EndIf  
EndProcedure  
Procedure AfficheBriques()
  ;Affichage horizontal des briques à partir des coordonnées (#BriqueX1,#BriqueY1)
  For i=1 To Brique\Nb
    DisplaySprite(i,Brique\x1 + ((i-1)* Brique\Largeur), Brique\Y1)
  Next i  
EndProcedure  
Procedure FillMap(Briq.l)
  For v=0 To Map\Hauteur-1
    For u=0 To Map\Largeur-1
      TabMap(Map\Couche,u,v)=Briq
    Next u
  Next v
EndProcedure  
Procedure Cadre(x1.l,Y1.l,Largeur.l,Hauteur.l,Coul1.l,Coul2.l)
  ;Startdrawing doit être lancé avant d'appeler cette procédure
  DrawingMode(0)
  Box(x1,Y1,Largeur,Hauteur,Coul1)
  DrawingMode(4)
  Box(x1,Y1,Largeur,Hauteur,Coul2)
EndProcedure  
Procedure AfficheCheckBox()
  StartDrawing(ScreenOutput())
  ForEach CheckBox()
    ;Trace le cadre 
    Cadre(CheckBox()\x1,CheckBox()\Y1,CheckBox()\Largeur, CheckBox()\Hauteur,#Black,#White)
    ;Affiche le texte
    DrawingMode(1) : DrawingFont(#PB_Default)
    BackColor(0,0,0) : FrontColor(255,255,255)
    Texte$ = " "
    If CheckBox()\Etat 
      Texte$ = "X" 
    EndIf  
    CentreX = CheckBox()\x1 + (CheckBox()\Largeur-TextLength(Texte$))/2
    Locate(CentreX,CheckBox()\Y1+1)
    DrawText(Texte$)
  Next 
  StopDrawing()
EndProcedure
Procedure AfficheBoutons()
  StartDrawing(ScreenOutput())
    ForEach Bouton()
      ;Trace le cadre 
      If Bouton()\id=Map\Couche
        Cadre(Bouton()\x1,Bouton()\Y1,Bouton()\Largeur, Bouton()\Hauteur,#White,#Black)
      Else
        Cadre(Bouton()\x1,Bouton()\Y1,Bouton()\Largeur, Bouton()\Hauteur,#Black,#White)
      EndIf  
      ;Affiche le texte
      DrawingMode(1) : DrawingFont(#PB_Default)
      If Bouton()\id=Map\Couche
        BackColor(255,255,255) : FrontColor(0,0,0)
      Else
        BackColor(0,0,0) : FrontColor(255,255,255)
      EndIf
      If Bouton()\id = #BT_NoMap
        Bouton()\Texte = "Map " + Str(Map\No)
      EndIf  
      CentreX = Bouton()\x1 + (Bouton()\Largeur-TextLength(Bouton()\Texte))/2
      Locate(CentreX,Bouton()\Y1+1)
      DrawText(Bouton()\Texte)
    Next 
  StopDrawing()
EndProcedure
Procedure AfficheCadres()
  StartDrawing(ScreenOutput())
    DrawingMode(4)
    ;Trace le cadre de la map
    Box(Map\x1,Map\Y1,Map\Largeur * Brique\Largeur, Map\Hauteur * Brique\Hauteur,#White)
    ;Trace le cadre de la brique sélectionnée
    Box(Brique\CadreX1,Brique\CadreY1,Brique\Largeur,Brique\Hauteur,#White)
    Box(Brique\CadreX1+1,Brique\CadreY1+1,Brique\Largeur-2,Brique\Hauteur-2,#Black)
  StopDrawing()
EndProcedure
Procedure AfficheMap()
  ;Nettoie la map 
  For v=0 To Map\Hauteur-1
    For u=0 To Map\Largeur-1
      DisplaySprite(#Efface,Map\x1 + u * Brique\Largeur, Map\Y1 + v * Brique\Hauteur)
    Next u
  Next v
  ForEach CheckBox()
    If CheckBox()\Etat
      For v=0 To Map\Hauteur-1
        For u=0 To Map\Largeur-1
          If TabMap(CheckBox()\id,u,v)
            DisplaySprite(TabMap(CheckBox()\id,u,v),Map\x1 + u * Brique\Largeur, Map\Y1 + v * Brique\Hauteur)
          EndIf 
        Next u
      Next v
    EndIf
  Next  
EndProcedure 
Procedure SetCheckBox(id.l,Etat.l)
  ForEach CheckBox()
    If CheckBox()\id = id
      CheckBox()\Etat = Etat
      Break
    EndIf
  Next
EndProcedure  
Procedure.l GetCheckBox(id.l)
  ForEach CheckBox()
    If CheckBox()\id = id
      ProcedureReturn CheckBox()\Etat 
      Break
    EndIf
  Next
  ProcedureReturn -1 
EndProcedure 
Procedure TestCheckBox()
  ; la souris se trouve sur un bouton ?
  ForEach CheckBox()
    NoBouton=Souris(CheckBox()\x1,CheckBox()\Y1,CheckBox()\X2,CheckBox()\Y2)
    If NoBouton=#SO_BoutonGauche 
      If CheckBox()\MemCheck<>#SO_BoutonGauche
        CheckBox()\MemCheck=#SO_BoutonGauche
        CheckBox()\Etat = 1 - CheckBox()\Etat
      EndIf
    Else  
      CheckBox()\MemCheck=NoBouton
    EndIf  
  Next  
EndProcedure
Procedure TestBoutons()
  ; la souris se trouve sur un bouton ?
  ForEach Bouton()
    NoBouton=Souris(Bouton()\x1,Bouton()\Y1,Bouton()\X2,Bouton()\Y2)
    If NoBouton=#SO_BoutonGauche 
      If Bouton()\MemBouton<>#SO_BoutonGauche
        Bouton()\MemBouton=#SO_BoutonGauche
        If Bouton()\id >= #BT_Couche0 And Bouton()\id <= #BT_Couche2 
          Map\Couche = Bouton()\id
        ElseIf Bouton()\id = #BT_Sauve
          SauveMap()
        ElseIf Bouton()\id = #BT_Charge
          ChargeMap()
        ElseIf Bouton()\id = #BT_EffaceTout
          FillMap(#Efface) 
        ElseIf Bouton()\id = #BT_Remplissage
          FillMap(Brique\No)  
        ElseIf Bouton()\id = #BT_Precedent And Map\No>1
          Map\No-1
        ElseIf Bouton()\id = #BT_Suivant
          Map\No+1  
        EndIf 
      EndIf
    Else  
      Bouton()\MemBouton=NoBouton
    EndIf  
  Next  
EndProcedure
Procedure TestBrique()
  ; la souris se trouve sur une brique ?
  NoBouton=Souris(Brique\x1, Brique\Y1, Brique\X2, Brique\Y2)
  If NoBouton=#SO_BoutonGauche
    ;Calcul le no de la brique sélectionnée
    Brique\No = ((Souris\x - Brique\x1) / Brique\Largeur) + 1
    ;Calcul la position du cadre de sélection 
    Brique\CadreX1 = Brique\x1 + (Brique\No-1)* Brique\Largeur
  EndIf
EndProcedure
Procedure TestMap()
  ; la souris se trouve sur la map ?
  NoBouton = Souris(Map\x1, Map\Y1, Map\X2, Map\Y2) 
  ;Conversion des coordonnées écran en coordonnées map 
  Bx=((Souris\x - Map\x1) / Brique\Largeur) 
  By=((Souris\y - Map\Y1) / Brique\Hauteur)
  If NoBouton=#SO_BoutonGauche
    TabMap(Map\Couche,Bx,By)=Brique\No
  ElseIf NoBouton=#SO_BoutonDroit
    TabMap(Map\Couche,Bx,By)=#Efface
  EndIf 
  ;Affiche la brique sélectionnée sous la souris
  If NoBouton<>#SO_HorsCadre
    DisplaySprite(Brique\No,Souris\x-Brique\Largeur/2,Souris\y-Brique\Hauteur/2)
  EndIf 
EndProcedure  
  
;-Boucle principale
Repeat
  ClearScreen(0,0,0)
  ExamineKeyboard()
  ;Affiche les boutons
  AfficheBoutons()
  ;Affiche les checkbox
  AfficheCheckBox()
  ;Affiche les briques
  AfficheBriques()
  ;Affiche la map
  AfficheMap()  
  ;Affiche les cadres
  AfficheCadres()
  ;Gestion des boutons
  TestBoutons()
  ;Gestion des Checkox
  TestCheckBox()
  ;Gestion des briques
  TestBrique()
  ;Gestion de la map 
  TestMap()
  ;Affiche la souris en dernier , pour qu'elle soit au dessus des briques
  DisplayTransparentSprite(#Souris,Souris\x,Souris\y)  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)  

DataSection
Data.l 18,18,692,50
Data.l 18,18,692,70
Data.l 18,18,692,90
Boutons:
Data.s "Couche 0","86","18","712","50"
Data.s "Couche 1","86","18","712","70"
Data.s "Couche 2","86","18","712","90"
Data.s "Sauve map","106","18","692","110" 
Data.s "Charge map","106","18","692","130"
Data.s "Efface Tout","106","18","692","150"
Data.s "Remplissage","106","18","692","170"
Data.s  "<","18","18","692","190"
Data.s "Map ","64","18","712","190"
Data.s ">","18","18","778","190"
Couleurs:
Data.l 255,0,0
Data.l 255,255,0
Data.l 255,0,255
Data.l 0,0,255
Data.l 255,200,200
Data.l 200,255,200
Data.l 55,0,0
Data.l 255,0,125
Data.l 180,55,225
Data.l 0,255,0
EndDataSection

Publié : sam. 23/oct./2004 8:33
par comtois
la gestion des couches est terminée .
C'est plus un tut , c'est une usine à gaz ce code .Je vais en rester là .

Si j'ai du temps , je ferai une version Window , ça sera quand même plus simple pour la gestion des boutons et surtout les SaveRequester() et compagnie seront grandement appréciés pour la gestion des fichiers :)

Code : Tout sélectionner

;Comtois 
;22/10/2004
;Nouveau > Fonction Fill

;/ Constantes
;/Racine pour le nom du fichier
#Fichier = "Niveau"      ; Le nom du fichier de sauvegarde sera constitué de cette racine , et du numéro de la map  

;/Définition de l'écran
#LargeurEcran  = 800
#HauteurEcran = 600
#ProfondeurEcran  = 32 

;/Définition souris
#Souris = 11            ; No du sprite de la souris 
#SO_AucunBouton  = 0
#SO_BoutonGauche = 1
#SO_BoutonDroit  = 2
#SO_HorsCadre    = -1
Structure Souris
  x.l
  y.l
EndStructure  
Global Souris.Souris 

;/Définitions CheckBox
Enumeration
  #CB_Couche0  
  #CB_Couche1
  #CB_Couche2 
EndEnumeration
Structure CheckBox
  id.l
  x1.l                  ; Position de départ en X pour l'affichage
  Y1.l                  ; Position de départ en Y pour l'affichage
  X2.l
  Y2.l
  Largeur.l  
  Hauteur.l
  Etat.l
  MemCheck.l
EndStructure
NewList CheckBox.CheckBox()
For i=0 To 2
  AddElement(CheckBox())
  CheckBox()\id = i
  Read CheckBox()\Largeur
  Read CheckBox()\Hauteur
  Read CheckBox()\x1
  Read CheckBox()\Y1
  CheckBox()\X2 = CheckBox()\x1 + CheckBox()\Largeur
  CheckBox()\Y2 = CheckBox()\Y1 + CheckBox()\Hauteur
Next i  
  
;/Définitions Boutons 
Enumeration
  #BT_Couche0  
  #BT_Couche1
  #BT_Couche2 
  #BT_Sauve 
  #BT_Charge
  #BT_EffaceTout
  #BT_Remplissage
  #BT_Precedent
  #BT_NoMap
  #BT_Suivant
EndEnumeration

Structure Bouton
  id.l
  Texte.s
  x1.l                  ; Position de départ en X pour l'affichage
  Y1.l                  ; Position de départ en Y pour l'affichage
  X2.l
  Y2.l
  Largeur.l  
  Hauteur.l
  MemBouton.l
  Etat.l
EndStructure
NewList Bouton.Bouton()
Restore Boutons
For i=0 To 9
  AddElement(Bouton())
  Bouton()\id = i
  Read Bouton()\Texte 
  ;je lis un string uniquement pour faire tenir sur une ligne Data les paramètres d'un bouton 
  Read t$ : Bouton()\Largeur = Val(t$) 
  Read t$ : Bouton()\Hauteur = Val(t$) 
  Read t$ : Bouton()\x1      = Val(t$)   
  Read t$ : Bouton()\Y1      = Val(t$) 
  Bouton()\X2 = Bouton()\x1 + Bouton()\Largeur
  Bouton()\Y2 = Bouton()\Y1 + Bouton()\Hauteur
Next i 
 
;/Définitions des briques
;Efface 
#Efface = 0             ; No du sprite de la brique noire ( pour effacer )
Structure Brique
  No.l                  ; Numéro de la brique sélectionnée 
  Nb.l                  ; Nombre de briques (Tiles) 
  Largeur.l             ; Dimension en largeur d'une brique
  Hauteur.l             ; Dimension en hauteur d'une brique
  x1.l                  ; Position de départ en X pour l'affichage des briques
  Y1.l                  ; Position de départ en Y pour l'affichage des briques
  X2.l                  ; Position de fin en X pour l'affichage des briques
  Y2.l                  ; Position de fin en Y pour l'affichage des briques  
  CadreX1.l             ; Coordonnée en X du cadre de sélection 
  CadreY1.l             ; Coordonnée en Y du cadre de sélection  
EndStructure  
Global Brique.Brique
Brique\No      = 1 
Brique\Nb      = 10                                        
Brique\Largeur = 32  
Brique\Hauteur = 32                                        
Brique\x1   = 50                                           
Brique\Y1   = 550                                          
Brique\X2   = Brique\x1 + Brique\Nb * Brique\Largeur  
Brique\Y2   = Brique\Y1 + Brique\Hauteur    
Brique\CadreX1 = Brique\x1 
Brique\CadreY1 = Brique\Y1 

;/Définitions de la map  
#MaxCouche = 2
Structure Map
  No.l                  ; Numéro de la map en cours 
  Couche.l              ; Numéro de la couche ( 0 à 2)
  Largeur.l             ; Nombre de briques en X
  Hauteur.l             ; Nombre de briques en Y
  x1.l                  ; Position de départ en X pour l'affichage de la map
  Y1.l                  ; Position de départ en Y pour l'affichage de la map
  X2.l                  ; Position de fin en X pour l'affichage de la map
  Y2.l                  ; Position de fin en Y pour l'affichage de la map
EndStructure
Global Map.Map
Map\No         = 1 
Map\Couche     = 0
Map\Largeur    = 20                                            
Map\Hauteur    = 15                                              
Map\x1      = 50                                               
Map\Y1      = 50                                               
Map\X2      = Map\x1 + Map\Largeur * Brique\Largeur       
Map\Y2      = Map\Y1 + Map\Hauteur * Brique\Hauteur   
Dim TabMap(#MaxCouche,Map\Largeur,Map\Hauteur)

;- Initialisation
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
  End
ElseIf OpenScreen( #LargeurEcran, #HauteurEcran , #ProfondeurEcran , "Editeur map 2D" ) = 0
  MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
  End
EndIf

;Creation d'un sprite pour la souris
CreateSprite(#Souris, 32, 32)
StartDrawing(SpriteOutput(#Souris))
  Circle(4, 4, 5, #White)
  Line(0, 0, SpriteWidth(#Souris), SpriteHeight(#Souris), #White)
StopDrawing()

;Creation d'un sprite pour effacer
CreateSprite(#Efface, 32, 32)
StartDrawing(SpriteOutput(#Efface))
  Box(0,0,Brique\Largeur, Brique\Hauteur, 0)
StopDrawing()

;Création des Briques
For i=1 To Brique\Nb
  Read rouge
  Read vert
  Read bleu
  CreateSprite(i, Brique\Largeur, Brique\Hauteur)
  StartDrawing(SpriteOutput(i))
    Box(0,0,Brique\Largeur, Brique\Hauteur, RGB(rouge, vert, bleu))
  StopDrawing()
Next i

;- Les procédures
Procedure SauveMap()
  Fichier$=#Fichier + Str(Map\No) + ".Map" 
  If CreateFile(0,Fichier$)
    For Couche=0 To #MaxCouche
      For v=0 To Map\Hauteur-1
        For u=0 To Map\Largeur-1
          WriteLong(TabMap(Couche,u,v))
        Next u
      Next v
    Next Couche  
    CloseFile(0)
  EndIf  
EndProcedure  
Procedure ChargeMap()
  Fichier$=#Fichier + Str(Map\No) + ".Map" 
  If OpenFile(0,Fichier$)
    For Couche=0 To #MaxCouche
      For v=0 To Map\Hauteur-1
        For u=0 To Map\Largeur-1
          TabMap(Couche,u,v)=ReadLong()
        Next u
      Next v
    Next Couche  
    CloseFile(0)
  EndIf  
EndProcedure 
Procedure.l Souris(x1.l,Y1.l,X2.l,Y2.l)
  If ExamineMouse()
    Souris\x = MouseX()
    Souris\y = MouseY()
    ;Contrôle l'encadrement  
    If Souris\x > x1 And Souris\x < X2 And Souris\y > Y1 And Souris\y < Y2
      If MouseButton(#SO_BoutonGauche)
        ProcedureReturn #SO_BoutonGauche
      ElseIf MouseButton(#SO_BoutonDroit)  
        ProcedureReturn #SO_BoutonDroit
      Else 
        ProcedureReturn #SO_AucunBouton
      EndIf 
    EndIf
    ProcedureReturn #SO_HorsCadre
  EndIf  
EndProcedure  
Procedure AfficheBriques()
  ;Affichage horizontal des briques à partir des coordonnées (#BriqueX1,#BriqueY1)
  For i=1 To Brique\Nb
    DisplaySprite(i,Brique\x1 + ((i-1)* Brique\Largeur), Brique\Y1)
  Next i  
EndProcedure  
Procedure FillMap(x.l,y.l,Fond.l,Briq.l )
  NoBrique = TabMap(Map\Couche,x,y)
  If NoBrique=Fond
    TabMap(Map\Couche,x,y)=Briq
    If x>0 : FillMap(x-1,y,Fond,Briq) : EndIf
    If x<Map\Largeur-1 : FillMap(x+1,y,Fond,Briq) : EndIf
    If y>0 : FillMap(x,y-1,Fond,Briq) : EndIf
    If y<Map\Hauteur-1 : FillMap(x,y+1,Fond,Briq) : EndIf
  EndIf  
EndProcedure  
Procedure Cadre(x1.l,Y1.l,Largeur.l,Hauteur.l,Coul1.l,Coul2.l)
  ;Startdrawing doit être lancé avant d'appeler cette procédure
  DrawingMode(0)
  Box(x1,Y1,Largeur,Hauteur,Coul1)
  DrawingMode(4)
  Box(x1,Y1,Largeur,Hauteur,Coul2)
EndProcedure  
Procedure AfficheCheckBox()
  StartDrawing(ScreenOutput())
  ForEach CheckBox()
    ;Trace le cadre 
    Cadre(CheckBox()\x1,CheckBox()\Y1,CheckBox()\Largeur, CheckBox()\Hauteur,#Black,#White)
    ;Affiche le texte
    DrawingMode(1) : DrawingFont(#PB_Default)
    BackColor(0,0,0) : FrontColor(255,255,255)
    Texte$ = " "
    If CheckBox()\Etat 
      Texte$ = "X" 
    EndIf  
    CentreX = CheckBox()\x1 + (CheckBox()\Largeur-TextLength(Texte$))/2
    Locate(CentreX,CheckBox()\Y1+1)
    DrawText(Texte$)
  Next 
  StopDrawing()
EndProcedure
Procedure AfficheBoutons()
  StartDrawing(ScreenOutput())
    ForEach Bouton()
      ;Trace le cadre 
      If Bouton()\id=Map\Couche Or (Bouton()\id=#BT_Remplissage And Bouton()\Etat)
        Cadre(Bouton()\x1,Bouton()\Y1,Bouton()\Largeur, Bouton()\Hauteur,#White,#Black)
      Else
        Cadre(Bouton()\x1,Bouton()\Y1,Bouton()\Largeur, Bouton()\Hauteur,#Black,#White)
      EndIf  
      ;Affiche le texte
      DrawingMode(1) : DrawingFont(#PB_Default)
      If Bouton()\id=Map\Couche Or (Bouton()\id=#BT_Remplissage And Bouton()\Etat)
        BackColor(255,255,255) : FrontColor(0,0,0)
      Else
        BackColor(0,0,0) : FrontColor(255,255,255)
      EndIf
      If Bouton()\id = #BT_NoMap
        Bouton()\Texte = "Map " + Str(Map\No)
      EndIf  
      CentreX = Bouton()\x1 + (Bouton()\Largeur-TextLength(Bouton()\Texte))/2
      Locate(CentreX,Bouton()\Y1+1)
      DrawText(Bouton()\Texte)
    Next 
  StopDrawing()
EndProcedure
Procedure AfficheCadres()
  StartDrawing(ScreenOutput())
    DrawingMode(4)
    ;Trace le cadre de la map
    Box(Map\x1,Map\Y1,Map\Largeur * Brique\Largeur, Map\Hauteur * Brique\Hauteur,#White)
    ;Trace le cadre de la brique sélectionnée
    Box(Brique\CadreX1,Brique\CadreY1,Brique\Largeur,Brique\Hauteur,#White)
    Box(Brique\CadreX1+1,Brique\CadreY1+1,Brique\Largeur-2,Brique\Hauteur-2,#Black)
    StopDrawing()
  EndProcedure
Procedure EffaceMap()
  ;Nettoie la map 
  For v=0 To Map\Hauteur-1
    For u=0 To Map\Largeur-1
      TabMap(Map\Couche,u,v)=#Efface
    Next u
  Next v
EndProcedure 
Procedure AfficheMap()
  ;Nettoie la map 
  For v=0 To Map\Hauteur-1
    For u=0 To Map\Largeur-1
      DisplaySprite(#Efface,Map\x1 + u * Brique\Largeur, Map\Y1 + v * Brique\Hauteur)
    Next u
  Next v
  ForEach CheckBox()
    If CheckBox()\Etat Or Map\Couche=CheckBox()\id
      For v=0 To Map\Hauteur-1
        For u=0 To Map\Largeur-1
          If TabMap(CheckBox()\id,u,v)
            DisplaySprite(TabMap(CheckBox()\id,u,v),Map\x1 + u * Brique\Largeur, Map\Y1 + v * Brique\Hauteur)
          EndIf 
        Next u
      Next v
    EndIf
  Next  
EndProcedure 
Procedure SetCheckBox(id.l,Etat.l)
  ForEach CheckBox()
    If CheckBox()\id = id
      CheckBox()\Etat = Etat
      Break
    EndIf
  Next
EndProcedure  
Procedure.l GetCheckBox(id.l)
  ForEach CheckBox()
    If CheckBox()\id = id
      ProcedureReturn CheckBox()\Etat 
      Break
    EndIf
  Next
  ProcedureReturn -1 
EndProcedure 
Procedure TestCheckBox()
  ; la souris se trouve sur un bouton ?
  ForEach CheckBox()
    NoBouton=Souris(CheckBox()\x1,CheckBox()\Y1,CheckBox()\X2,CheckBox()\Y2)
    If NoBouton=#SO_BoutonGauche 
      If CheckBox()\MemCheck<>#SO_BoutonGauche
        CheckBox()\MemCheck=#SO_BoutonGauche
        CheckBox()\Etat = 1 - CheckBox()\Etat
      EndIf
    Else  
      CheckBox()\MemCheck=NoBouton
    EndIf  
  Next  
EndProcedure
Procedure SetBouton(id.l,Etat.l)
  ForEach Bouton()
    If Bouton()\id = id
      Bouton()\Etat = Etat
      Break
    EndIf
  Next
EndProcedure
Procedure.l GetBouton(id.l)
  ForEach Bouton()
    If Bouton()\id = id
      ProcedureReturn Bouton()\Etat 
      Break
    EndIf
  Next
  ProcedureReturn -1 
EndProcedure 
Procedure TestBoutons()
  ; la souris se trouve sur un bouton ?
  ForEach Bouton()
    NoBouton=Souris(Bouton()\x1,Bouton()\Y1,Bouton()\X2,Bouton()\Y2)
    If NoBouton=#SO_BoutonGauche 
      If Bouton()\MemBouton<>#SO_BoutonGauche
        Bouton()\MemBouton=#SO_BoutonGauche
        If Bouton()\id >= #BT_Couche0 And Bouton()\id <= #BT_Couche2 
          Map\Couche = Bouton()\id
        ElseIf Bouton()\id = #BT_Sauve
          SauveMap()
        ElseIf Bouton()\id = #BT_Charge
          ChargeMap()
        ElseIf Bouton()\id = #BT_EffaceTout
          EffaceMap() 
        ElseIf Bouton()\id = #BT_Remplissage
          Bouton()\Etat = 1 - Bouton()\Etat  
        ElseIf Bouton()\id = #BT_Precedent And Map\No>1
          Map\No-1
        ElseIf Bouton()\id = #BT_Suivant
          Map\No+1  
        EndIf 
      EndIf
    Else  
      Bouton()\MemBouton=NoBouton
    EndIf  
  Next  
EndProcedure
Procedure TestBrique()
  ; la souris se trouve sur une brique ?
  NoBouton=Souris(Brique\x1, Brique\Y1, Brique\X2, Brique\Y2)
  If NoBouton=#SO_BoutonGauche
    ;Calcul le no de la brique sélectionnée
    Brique\No = ((Souris\x - Brique\x1) / Brique\Largeur) + 1
    ;Calcul la position du cadre de sélection 
    Brique\CadreX1 = Brique\x1 + (Brique\No-1)* Brique\Largeur
  EndIf
EndProcedure
Procedure TestMap()
  ; la souris se trouve sur la map ?
  NoBouton = Souris(Map\x1, Map\Y1, Map\X2, Map\Y2) 
  ;Conversion des coordonnées écran en coordonnées map 
  Bx=((Souris\x - Map\x1) / Brique\Largeur) 
  By=((Souris\y - Map\Y1) / Brique\Hauteur)
  If NoBouton=#SO_BoutonGauche
    If GetBouton(#BT_Remplissage)
      FillMap(Bx,By,TabMap(Map\Couche,Bx,By),Brique\No)
      SetBouton(#BT_Remplissage,0)
    Else  
      TabMap(Map\Couche,Bx,By)=Brique\No
    EndIf
  ElseIf NoBouton=#SO_BoutonDroit
    TabMap(Map\Couche,Bx,By)=#Efface
  EndIf 
  ;Affiche la brique sélectionnée sous la souris
  If NoBouton<>#SO_HorsCadre
    DisplaySprite(Brique\No,Souris\x-Brique\Largeur/2,Souris\y-Brique\Hauteur/2)
  EndIf 
EndProcedure  
  
;-Boucle principale
Repeat
  ClearScreen(0,0,0)
  ExamineKeyboard()
  ;Affiche les boutons
  AfficheBoutons()
  ;Affiche les checkbox
  AfficheCheckBox()
  ;Affiche les briques
  AfficheBriques()
  ;Affiche la map
  AfficheMap()  
  ;Affiche les cadres
  AfficheCadres()
  ;Gestion des boutons
  TestBoutons()
  ;Gestion des Checkox
  TestCheckBox()
  ;Gestion des briques
  TestBrique()
  ;Gestion de la map 
  TestMap()
  ;Affiche la souris en dernier , pour qu'elle soit au dessus des briques
  DisplayTransparentSprite(#Souris,Souris\x,Souris\y)  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)  

DataSection
Data.l 18,18,692,50
Data.l 18,18,692,70
Data.l 18,18,692,90
Boutons:
Data.s "Couche 0","86","18","712","50"
Data.s "Couche 1","86","18","712","70"
Data.s "Couche 2","86","18","712","90"
Data.s "Sauve map","106","18","692","110" 
Data.s "Charge map","106","18","692","130"
Data.s "Efface Tout","106","18","692","150"
Data.s "Remplissage","106","18","692","170"
Data.s  "<","18","18","692","190"
Data.s "Map ","64","18","712","190"
Data.s ">","18","18","778","190"
Couleurs:
Data.l 255,0,0
Data.l 255,255,0
Data.l 255,0,255
Data.l 0,0,255
Data.l 255,200,200
Data.l 200,255,200
Data.l 55,0,0
Data.l 255,0,125
Data.l 180,55,225
Data.l 0,255,0
EndDataSection

Publié : sam. 23/oct./2004 13:06
par comtois
je viens d'actualiser le code dans le post au dessus , j'ai ajouté des check box , pour sélectionner les couches à afficher , soit rien , une ou deux ou les 3 à la fois .

je vais préparer une fonction Fill ; l'équivalent de la fonction FillArea() , mais pour les sprites :)

Publié : sam. 23/oct./2004 13:39
par garzul
Super comtois , J'en aurais peut-être besoin alors la génial :D

Publié : sam. 23/oct./2004 17:04
par comtois
Je viens d'ajouter la fonction Fill , comme AreaFill()

Ce n'est pas la meilleure solution ,puisqu'elle utilise la récursivité , et donc ça limite la taille de la zone à remplir , mais pour une map c'est largement suffisant. J'avais fait des essais avec cet algo , en remplissant un cercle , la limite était un rayon d'environ 200 , au delà il y avait un dépassement de capacité de la pile ,c'est le problème de la récursivité .
Bien sûr, il est possible de faire autrement ,sans récursivité ,mais c'est un peu plus long à écrire .

Donc maintenant , en sélectionnant Remplissage, il est possible de remplir une zone délimitée .

Publié : dim. 24/oct./2004 9:30
par comtois
j'en avais marre des sprites en couleur , j'ai remplacé tout ça par des fichiers images.
J'ai modifié un peu la gestion de la souris
j'ai amélioré la fonction Fill , désormais on peut effacer une zone délimitée en appuyant sur le bouton droit .
et le mode remplissage est maintenu ( alors qu'avant il fallait le valider à chaque remplissage)

J'ai aussi agrandi la taille de la map , pour un jeu en 800x600.

Il reste à faire une démo avec un perso qui se déplace sur la map !
et qui ramasse les objets.

[EDIT]
Je viens de mettre à jour le zip , il fait 43ko maintenant .
J'ai ajouté quelques briques pour tester le scrolling des briques.
Plus l'affichage de la position de la souris sur la map.

http://perso.wanadoo.fr/comtois/sources/tutediteur2.zip

Publié : mar. 26/oct./2004 19:34
par comtois
Petite mise à jour , avec gestion de brosses , pour la construction automatique des murs.

http://perso.wanadoo.fr/comtois/sources/tutediteur3.zip

Publié : mer. 27/oct./2004 0:14
par garzul
Comtois tu chôme pas dis donc :D

Publié : mer. 27/oct./2004 17:53
par comtois
:wink:

ben les brosses ,je l'avais déjà fait pour un autre code, j'ai légèrement adapté , et c'est tout :)