Post by Mark Dunham on Apr 17, 2018 21:23:55 GMT -5
- Added grid to make placing tiles easier
- Undo now works without having to select tiles
- Optimized saving and loading of .dat files
- Went from multiple arrays to one array for tiles
- Changed tile selections from branch labels to sub routines
- specified global variables
- Reformatted if blocks to case statements
- Generally optimized all the code I could
I believe I am ready to take my optimizations and apply them to the main level editor project which at this point is close to 10k lines cannot wait to get it done I am really excited about these changes I hope someone finds this useful.
www.dropbox.com/s/4ccr5zfizg3depa/LevelEditor_3.1.4.0_Refactor%204.17.2018.zip?dl=0
'LEVEL EDITOR
'BY: MARK A. DUNHAM
'ART BY: RUSSELL DUNHAM
'DATE: 3.3.2018
'UPDATED: 4.17.2018
'##############################################################################################
'### SETUP GLOBAL VARIABLES ###
'##############################################################################################
global unit, gX, gY, graphicsX, graphicsY, mapSize$, tileSelected$, previousTile$, MaxTiles
global Version$
'INITIALIZED VARIABLES
Version$ = "3.1.4.0"
unit = 32
tileSelected$ = ""
previousTile$ = ""
MaxTiles = 1000
tileCount = 0
dim Tile$(MaxTiles)
dim TileX(MaxTiles)
dim TileY(MaxTiles)
nomainwin
[ScreenRes]
graphicsX = 0
graphicsY = 0
WindowWidth = 640
WindowHeight = 480
UpperLeftX = int((DisplayWidth - WindowWidth)/2)
UpperLeftY = int((DisplayHeight - WindowHeight)/2)
BackgroundColor$ = "black"
ForegroundColor$ = "green"
'ComboboxColor$ = "black"
ListboxColor$ = "black"
dim ScreenH$(2)
ScreenH$(1) = "480"
ScreenH$(2) = "640"
dim ScreenW$(7)
ScreenW$(1) = "640"
ScreenW$(2) = "800"
ScreenW$(3) = "1024"
ScreenW$(4) = "1280"
ScreenW$(5) = "1366"
'ScreenW$(6) = "1600"
'ScreenW$(7) = "3200"
statictext #SR.1, "Please select the screen resolution", 100, 25, 450, 30
statictext #SR.2, " you are designing a level for. ", 100, 65, 450, 30
statictext #SR.3, "Screen Width", 25, 220, 100, 60
listbox #SR.screenhcmb, ScreenH$(), [], 400, 160, 100, 175
statictext #SR.4, "Screen Height", 300, 220, 100, 60
listbox #SR.screenwcmb, ScreenW$(), [], 125, 160, 100, 175
stylebits #SR.screenhcmb, 0, _LBS_DISABLENOSCROLL, 0, 0
stylebits #SR.screenwcmb, 0, _LBS_DISABLENOSCROLL, 0, 0
bmpbutton #SR.startbtn, "Buttons\StartButton.bmp", [Start], UL, 210, 400
bmpbutton #SR.quitbtn, "Buttons\QuitButton.bmp", [SR.Quit], UL 320, 400
open "Screen Resolution" for window_nf as #SR
#SR, "trapclose [SR.Quit]"
#SR, "font Comic_Sans_MS 12 0 bold"
#SR.screenhcmb, "singleClickSelect [SingleClickAction]"
#SR.screenwcmb, "singleClickSelect [SingleClickAction]"
wait
[SingleClickAction]
calldll #user32, "GetDoubleClickTime", delay as ulong
timer delay, [Combo.ScreenRes]
wait
[Combo.ScreenRes]
timer 0
#SR.screenhcmb, "selection? screenHSel$"
#SR.screenwcmb, "selection? screenWSel$"
select case screenHSel$
case "480" : graphicsY = 480
case "640" : graphicsY = 640
case else : graphicsY = 640
end select
select case screenWSel$
case "640" : graphicsX = 640
case "800" : graphicsX = 800
case "1024" : graphicsX = 1024
case "1280" : graphicsX = 1280
case "1366" : graphicsX = 1366
'case "1600" : graphicsX = 1600
'case "3200" : graphicsX = 3200
case else : graphicsX = 800
end select
'CALCULATE HOW MANY LINES TO DRAW ON THE X AND Y AXIS
'THE GX AND GY VARIABLES ARE USED IN THE DRAWGRID SUBROUTINE
gX = graphicsX / unit
gY = graphicsY / unit
wait
[Start]
if graphicsX <> 0 and graphicsY <> 0 then
close #SR
goto [Main]
end if
wait
[SR.Quit]
close #SR
end
'##############################################################################################
'### MAIN WINDOW SETUP ###
'##############################################################################################
[Main]
WindowWidth = 1366
WindowHeight = 768
UpperLeftX = int((DisplayWidth - WindowWidth)/2)
UpperLeftY = int((DisplayHeight - WindowHeight)/2)
BackgroundColor$ = "black"
ForegroundColor$ = "green"
ComboboxColor$ = "black"
'##############################################################################################
'### LOAD BITMAPS FOR LEVEL EDITOR ###
'##############################################################################################
loadbmp "BG", "Images\BG_Black_640x480.bmp"
'GROUND BITMAPS
loadbmp "soilS", "Sprites\Ground\Soil_32X32.bmp"
loadbmp "grassS", "Sprites\Ground\SoilGrass_32X32.bmp"
loadbmp "GreenGrass", "Sprites\Ground\GreenGrass.bmp"
loadbmp "DarkGrass", "Sprites\Ground\DarkGrass.bmp"
loadbmp "LightDesert", "Sprites\Ground\LightDesert.bmp"
'##############################################################################################
'### SETUP MAIN LEVEL EDITOR WINDOW AND CONTROLS ###
'##############################################################################################
graphicbox #LE.GB, -1, -1, graphicsX, graphicsY
'bmpbutton #LE.wallsbtn, "Buttons\WallsButton.bmp", [Walls], UL 10, 705
'bmpbutton #LE.floorsbtn, "Buttons\FloorsButton.bmp", [Floors], UL 120, 705
'bmpbutton #LE.orebtn, "Buttons\OreButton.bmp", [Ore], UL 230, 705
bmpbutton #LE.groundbtn, "Buttons\GroundButton.bmp", [Ground], UL 340, 705
bmpbutton #LE.newbtn, "Buttons\NewMapButton.bmp", [NewMap], UL 1141, 640
bmpbutton #LE.undobtn, "Buttons\UndoTileButton.bmp", [UndoTile], UL 1141, 675
bmpbutton #LE.savebtn, "Buttons\SaveDataButton.bmp", [SaveData], UL 1251, 640
bmpbutton #LE.loadbtn, "Buttons\LoadDataButton.bmp", [LoadData], UL 1251, 675
bmpbutton #LE.quitbtn, "Buttons\SmQuitButton.bmp", [LE.Quit], UL 1251, 710
'bmpbutton #LE.miscbtn, "Buttons\MiscTilesButton.bmp", [Misc.Tiles], UL 450, 705
'bmpbutton #LE.Pipesbtn, "Buttons\PipesButton.bmp", [Pipes], UL 10, 670
'bmpbutton #LE.Lavabtn, "Buttons\LavaButton.bmp", [Lava], UL 120, 670
'bmpbutton #LE.Waterbtn, "Buttons\WaterButton.bmp", [Water], UL 230, 670
'bmpbutton #LE.PlatFormbtn, "Buttons\PlatFormButton.bmp", [PlatForms], UL 450, 670
'bmpbutton #LE.Doorsbtn, "Buttons\DoorButton.bmp", [Doors], UL 340, 670
'bmpbutton #LE.Potionsbtn, "Buttons\PotionButton.bmp", [Potions], UL 560, 705
open "Level Editor " + Version$ for window_nf as #LE
#LE, "trapclose [LE.Quit]"
#LE.GB, "when characterInput [KeyBoardInput]"
#LE.GB, "when mouseMove [MouseMove]"
#LE.GB, "when leftButtonDown [LeftMouseClick]"
#LE.GB, "when rightButtonDown [RightMouseClick]"
#LE, "font Comic_Sans_MS 0 0 bold"
if graphicsX > 1600 then #LE.GB, "Horizscrollbar on 0 600"
#LE.GB, "background BG"
#LE.GB, "locate -1 -1"
#LE.GB, "drawsprites"
call DrawGrid
#LE.GB, "home; posxy graphicsX graphicsY"
#LE.GB, "getbmp BG 0 0 ";graphicsX*2;" ";graphicsY*2
#LE.GB, "background BG"
[LE.Main]
timer 0
#LE.GB, "setfocus"
'WE USE THE TIMER TO DRAW OUR SPRITES
timer 50, [LE.Loop]
wait
[LE.Loop]
#LE.GB, "drawsprites"
wait
[KeyBoardInput]
if len(Inkey$) = 2 then key = asc(right$(Inkey$,1)) else key = 0
char$ = Inkey$
if lower$(char$) = "b" then gosub[previousTile]
Inkey$ = ""
wait
'##############################################################################################
'### MAKE THE SPRITE TRACK WITH THE MOUSE POINTER ###
'##############################################################################################
[MouseMove]
scan
select case tileSelected$
case "Soil" : #LE.GB, "spritexy soil "; MouseX; " "; MouseY
case "GrassSoil" : #LE.GB, "spritexy grassSoil "; MouseX; " "; MouseY
case "GreenGrass" : #LE.GB, "spritexy GreenGrass "; MouseX; " "; MouseY
case "DarkGrass" : #LE.GB, "spritexy DarkGrass "; MouseX; " "; MouseY
case "LightDesert" : #LE.GB, "spritexy LightDesert "; MouseX; " "; MouseY
end select
wait
'##############################################################################################
'### PLACE THE SELECTED TILE AND SNAP IT TO THE MOUSE LOCATION ###
'##############################################################################################
[LeftMouseClick]
select case tileSelected$
case "Soil"
tileCount = tileCount + 1
Tile$(tileCount) = "soil" + str$(tileCount)
#LE.GB, "addsprite "; Tile$(tileCount); " soilS"
TileX(tileCount) = int(MouseX/unit)*unit
TileY(tileCount) = int(MouseY/unit)*unit
#LE.GB, "spritexy "; Tile$(tileCount); " "; TileX(tileCount); " "; TileY(tileCount)
#LE.GB, "removesprite soil"
case "GrassSoil"
tileCount = tileCount + 1
Tile$(tileCount) = "grassSoil" + str$(tileCount)
#LE.GB, "addsprite "; Tile$(tileCount); " grassS"
TileX(tileCount) = int(MouseX/unit)*unit
TileY(tileCount) = int(MouseY/unit)*unit
#LE.GB, "spritexy "; Tile$(tileCount); " "; TileX(tileCount); " "; TileY(tileCount)
#LE.GB, "removesprite grassSoil"
case "GreenGrass"
tileCount = tileCount + 1
Tile$(tileCount) = "GreenGrass" + str$(tileCount)
#LE.GB, "addsprite "; Tile$(tileCount); " GreenGrass"
TileX(tileCount) = int(MouseX/unit)*unit
TileY(tileCount) = int(MouseY/unit)*unit
#LE.GB, "spritexy "; Tile$(tileCount); " "; TileX(tileCount); " "; TileY(tileCount)
#LE.GB, "removesprite GreenGrass"
case "DarkGrass"
tileCount = tileCount + 1
Tile$(tileCount) = "DarkGrass" + str$(tileCount)
#LE.GB, "addsprite "; Tile$(tileCount); " DarkGrass"
TileX(tileCount) = int(MouseX/unit)*unit
TileY(tileCount) = int(MouseY/unit)*unit
#LE.GB, "spritexy "; Tile$(tileCount); " "; TileX(tileCount); " "; TileY(tileCount)
#LE.GB, "removesprite DarkGrass"
case "LightDesert"
tileCount = tileCount + 1
Tile$(tileCount) = "LightDesert" + str$(tileCount)
#LE.GB, "addsprite "; Tile$(tileCount); " LightDesert"
TileX(tileCount) = int(MouseX/unit)*unit
TileY(tileCount) = int(MouseY/unit)*unit
#LE.GB, "spritexy "; Tile$(tileCount); " "; TileX(tileCount); " "; TileY(tileCount)
#LE.GB, "removesprite LightDesert"
end select
tileSelected$ = ""
wait
'DOES NOTHING AT THIS TIME
[RightMouseClick]
wait
'##############################################################################################
'### GROUND TILE TYPES WINDOW ###
'##############################################################################################
[Ground]
WindowWidth = 1366
WindowHeight = 768
UpperLeftX = 10
UpperLeftY = 10
statictext #Ground.titlest, "Ground", 175, 10, 75, 25
'ALL BUTTON ACTIONS ARE SUBROUTINES
statictext #Ground.GrassSoilst, "Grass Soil", 20, 70, 100, 25
bmpbutton #Ground.GrassSoilbtn, "Buttons\Ground\SoilGrass_32X32.bmp", GrassSoil, UL, 140, 70
statictext #Ground.Soilst, "Soil", 20, 140, 100, 25
bmpbutton #Ground.Soilbtn, "Buttons\Ground\Soil_32X32.bmp", Soil, UL, 140, 140
statictext #Ground.GreenGrassst, "Green Grass", 20, 210, 100, 25
bmpbutton #Ground.GreenGrassbtn, "Buttons\Ground\GreenGrass.bmp", GreenGrass, UL, 140, 210
statictext #Ground.DarkGrassst, "Dark Grass", 20, 280, 100, 25
bmpbutton #Ground.DarkGrassbtn, "Buttons\Ground\DarkGrass.bmp", DarkGrass, UL, 140, 280
statictext #Ground.LightDesertst, "Light Desert", 20, 350, 100, 25
bmpbutton #Ground.LightDesertbtn, "Buttons\Ground\LightDesert.bmp", LightDesert, UL, 140, 350
open "Ground" for dialog_nf_modal as #Ground
#Ground, "trapclose [Ground.Quit]"
#Ground, "font Comic_Sans_MS 0 0 bold"
#Ground.titlest, "!font Comic_Sans_MS 12 28 bold"
wait
'##############################################################################################
'### SETS THE PREVIOUS TILE TO THE TILE SELECTED TO PLACE TILES FASTER ###
'##############################################################################################
[previousTile]
select case previousTile$
case "Soil"
tileSelected$ = "Soil"
#LE.GB, "addsprite soil soilS"
#LE.GB, "spritexy soil -100 -100"
case "GrassSoil"
tileSelected$ = "GrassSoil"
#LE.GB, "addsprite grassSoil grassS"
#LE.GB, "spritexy grassSoil -100 -100"
case "GreenGrass"
tileSelected$ = "GreenGrass"
#LE.GB, "addsprite GreenGrass GreenGrass"
#LE.GB, "spritexy GreenGrass -100 -100"
case "DarkGrass"
tileSelected$ = "DarkGrass"
#LE.GB, "addsprite DarkGrass DarkGrass"
#LE.GB, "spritexy DarkGrass -100 -100"
case "LightDesert"
tileSelected$ = "LightDesert"
#LE.GB, "addsprite LightDesert LightDesert"
#LE.GB, "spritexy LightDesert -100 -100"
end select
wait
'##############################################################################################
'### SAVE THE LEVEL TO .DAT FILE TYPE ###
'##############################################################################################
[SaveData]
filedialog "Save as... ", ".dat", fileName$
'IF THE FILE EXTENSION IS MISSING ADD IT TO THE FILENAME
if right$(fileName$,4) <> ".dat" then
fileName$ = fileName$ + ".dat"
end if
open fileName$ for output as #Save
'#####################################
'### SAVE GROUND'S ###
'#####################################
#Save, tileCount
for i = 1 to tileCount
#Save, Tile$(i)
#Save, TileX(i)/unit; ", "; TileY(i)/unit
next i
close #Save
wait
'##############################################################################################
'### LOAD SAVE LEVELS OF .DAT TYPE ###
'##############################################################################################
[LoadData]
'CLEAR ARRAYS SO YOU DO NOT GET GARBAGE DATA
gosub [ClearArrays]
filedialog "Open dat file...", "*.dat", fileName$
if fileName$<>"" then
open fileName$ for input as #Load
input #Load, tileCount
for i = 1 to tileCount
input #Load, Tile$(i)
input #Load, TileX(i), TileY(i)
next i
for i = 1 to tileCount
select case Tile$(i)
case "soil" + str$(i)
TileX(i) = TileX(i) * unit : TileY(i) = TileY(i) * unit
#LE.GB, "addsprite "; Tile$(i); " soilS"
#LE.GB, "spritexy "; Tile$(i); " "; TileX(i); " "; TileY(i)
case "grassSoil" + str$(i)
TileX(i) = TileX(i) * unit : TileY(i) = TileY(i) * unit
#LE.GB, "addsprite "; Tile$(i); " grassS"
#LE.GB, "spritexy "; Tile$(i); " "; TileX(i); " "; TileY(i)
case "GreenGrass" + str$(i)
TileX(i) = TileX(i) * unit : TileY(i) = TileY(i) * unit
#LE.GB, "addsprite "; Tile$(i); " GreenGrass"
#LE.GB, "spritexy "; Tile$(i); " "; TileX(i); " "; TileY(i)
case "DarkGrass" + str$(i)
TileX(i) = TileX(i) * unit : TileY(i) = TileY(i) * unit
#LE.GB, "addsprite "; Tile$(i); " DarkGrass"
#LE.GB, "spritexy "; Tile$(i); " "; TileX(i); " "; TileY(i)
case "LightDesert" + str$(i)
TileX(i) = TileX(i) * unit : TileY(i) = TileY(i) * unit
#LE.GB, "addsprite "; Tile$(i); " LightDesert"
#LE.GB, "spritexy "; Tile$(i); " "; TileX(i); " "; TileY(i)
end select
next i
close #Load
else
notice "No file chosen!"
end if
#LE.GB, "drawsprites"
wait
'##############################################################################################
'### REMOVES THE LAST TYPE OF TILE SELECTED UNTIL THERE ARE 0 TILES OF THAT TYPE LEFT ###
'##############################################################################################
[UndoTile]
if tileCount > 0 then
#LE.GB, "removesprite "; Tile$(tileCount); " "; TileX(tileCount); " "; TileY(tileCount)
tileCount = tileCount - 1
end if
wait
'##############################################################################################
'### CLEARS THE ARRAYS THEN GOES BACK TO MAIN ###
'##############################################################################################
[NewMap]
timer 0
gosub [ClearArrays]
close #LE
goto [ScreenRes]
wait
[LE.Quit]
timer 0
'UNLOAD BITMAPS
close #LE
end
[Ground.Quit]
close #Ground
wait
'##############################################################################################
'### SUB ROUTINE CALLED BY LOAD AND BY NEW TO CLEAR ARRAYS OF GARBAGE DATA ###
'##############################################################################################
[ClearArrays]
for i = 1 to tileCount
select case Tile$(i)
case "soil" + str$(i)
TileX(i) = TileX(i) * unit : TileY = TileY(i) * unit
#LE.GB, "removesprite "; Tile$(i); " soilS"
case "grassS" + str$(i)
TileX(i) = TileX(i) * unit : TileY = TileY(i) * unit
#LE.GB, "removesprite "; Tile$(i); " grassS"
case "GreenGrass" + str$(i)
TileX(i) = TileX(i) * unit : TileY = TileY(i) * unit
#LE.GB, "removesprite "; Tile$(i); " GreenGrass"
case "DarkGrass" + str$(i)
TileX(i) = TileX(i) * unit : TileY = TileY(i) * unit
#LE.GB, "removesprite "; Tile$(i); " DarkGrass"
case "LightDesert" + str$(i)
TileX(i) = TileX(i) * unit : TileY = TileY(i) * unit
#LE.GB, "removesprite "; Tile$(i); " LightDesert"
end select
next i
for i = 1 to MaxTiles
Tile$(i) = ""
TileX(i) = 0
TileY(i) = 0
next i
tileCount = 0
return
sub DrawGrid
'DRAW LINES ON THE Y AXIS
'HERE WE LOOK AT THE WIDTH OF THE GRAPHICBOX TO DRAW THE CORRECT AMOUNT OF LINES
'WE THEN USE GRAPHICSY TO MAKE SURE WE DRAW THEM THE HEIGHT OF OUR GRAPHICBOX
#LE.GB, "down; size 1"
for i = 1 to gX
#LE.GB, "place "; i*32; " 0; north; turn 180; go ";graphicsY
next i
'DRAW LINES ON THE X AXIS
'HERE WE LOOK AT THE HEIGHT OF THE GRAPHICBOX TO DRAW THE CORRECT AMOUTN OF LINES
'WE THEN USE GRAPHICSX TO MAKE SURE WE DRAW THEM THE WIDTH OF OUR GRAPHICBOX
for i = 1 to gY
#LE.GB, "place 0 "; i*32; "; north; turn 90; go ";graphicsX
next i
#LE.GB, "flush"
end sub
'SUBROUTINE EVENT HANDLERS FOR GROUND TILES
sub GrassSoil GrassSoil$
print GrassSoil$
tileSelected$ = "GrassSoil"
previousTile$ = tileSelected$
#LE.GB, "addsprite grassSoil grassS"
#LE.GB, "spritexy grassSoil -100 -100"
close #Ground
end sub
sub Soil Soil$
tileSelected$ = "Soil"
previousTile$ = tileSelected$
#LE.GB, "addsprite soil soilS"
#LE.GB, "spritexy soil -100 -100"
close #Ground
end sub
sub GreenGrass GreenGrass$
tileSelected$ = "GreenGrass"
previousTile$ = tileSelected$
#LE.GB, "addsprite GreenGrass GreenGrass"
#LE.GB, "spritexy GreenGrass -100 -100"
close #Ground
end sub
sub DarkGrass DarkGrass$
tileSelected$ = "DarkGrass"
previousTile$ = tileSelected$
#LE.GB, "addsprite DarkGrass DarkGrass"
#LE.GB, "spritexy DarkGrass -100 -100"
close #Ground
end sub
sub LightDesert LightDesert$
tileSelected$ = "LightDesert"
previousTile$ = tileSelected$
#LE.GB, "addsprite LightDesert LightDesert"
#LE.GB, "spritexy LightDesert -100 -100"
close #Ground
end sub