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