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