Thanks for the video, this make things much clearer. So each row has just one foreground color and one background color and each column owns a foreground pixel or not. Weird…
This makes things a little bit trickier. I put in a new program with is more structured and it’s better to read and to maintain:
Code: Select all
;- META
EnableExplicit
#AppName = "Playfield Editor"
#Version = "0.0.1"
;- DECLARATIONS
; defining named constants for all objects
; important for much better code readability
Enumeration windows
#Window_Main
#Window_Code
EndEnumeration
Enumeration gadgets
#Button_Clear
#Button_ColorWhite
#Button_ColorBlack
#Button_ColorRed
#Button_ColorBlue
#Button_ColorYellow
#Button_ColorGreen
#Button_Draw
#Button_EditBG
#Button_EditFG
#Canvas_Playfield
#Combo_Rows
#Text_EditingMode
#Text_Color
#Text_Footer
#Text_Mode
#Text_Title
EndEnumeration
Enumeration fonts
#Font_UiBig
#Font_UiNormal
#Font_UiSmall
EndEnumeration
;- SETTINGS
; defines several settings for the appearance
; change as you wish
; ui
Global colorWindowBG = RGB(64,64,64) ; colors for the editor
Global colorText = RGB(255,255,255)
Global fontUiBig.s = "Arial" ; fonts for text in editor ui
Global fontUiBigSize = 30
Global fontUiNormal.s = "Arial"
Global fontUiNormalSize = 16
Global fontUiSmall.s = "Arial"
Global fontUiSmallSize = 10
Global spacer = 10 ; space between ui elements; change as you like
Global textFooter.s = #AppName + " v." + #Version + " by randomterrain.com"
; playyfield
Global mode = #Button_Draw ; default mode
Global colorFG = #Black ; default foreground color
Global colorBG = #White ; default background color
Global cols = 32 ; fixed value for number of columns
Global colScale = 15 ; currently set to 15, which results in 15*32 columns = 480 pixel width; change as you wish
Global rows = 176 ; same as for columns
Global rowScale = 2 ; same as for columns
Global rowHeight = 16 ; set to 16 by default because I put 11 rows as default in the initUI() procedure
Global x, y
Global Dim playfieldData(cols, rows)
Global Dim playfieldFG(rows)
Global Dim playfieldBG(rows)
Define i
For i = 0 To rows-1
playfieldFG(i) = colorFG
playfieldBG(i) = colorBG
Next
;- PROCEDURES
Procedure GadgetEvents()
; handle all that happens during runtime
Protected gadget = EventGadget()
Protected i
Select gadget
Case #Canvas_Playfield
If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas_Playfield, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
If StartDrawing(CanvasOutput(#Canvas_Playfield))
; find out which column and row was clicked
x = (GetGadgetAttribute(#Canvas_Playfield, #PB_Canvas_MouseX)/colScale)
y = (GetGadgetAttribute(#Canvas_Playfield, #PB_Canvas_MouseY)/(rowHeight*rowScale))
; perform drawing depending on current mode
If mode = #Button_Draw
playfieldData(x, y*rowHeight) = 1
Box(x*colScale, y*rowScale*rowHeight, colScale, rowHeight*rowScale, playfieldFG(y*rowheight))
ElseIf mode = #Button_EditBG
playfieldBG(y*rowHeight) = colorBG
Box(0, y*rowHeight*rowScale, cols*colScale, rowHeight*rowScale, colorBG)
For i = 0 To cols-1
If playfieldData(i,y*rowHeight) = 1
Box(i*colScale, y*rowScale*rowHeight, colScale, rowHeight*rowScale, playfieldFG(y*rowheight))
EndIf
Next
ElseIf mode = #Button_EditFG
playfieldFG(y*rowHeight) = colorFG
For i = 0 To cols-1
If playfieldData(i,y*rowHeight) = 1
Box(i*colScale, y*rowScale*rowHeight, colScale, rowHeight*rowScale, colorFG)
EndIf
Next
EndIf
StopDrawing()
EndIf
EndIf
Case #Combo_Rows
rowHeight = Pow(2, GetGadgetState(2))
Case #Button_Draw To #Button_EditFG
; set drawing mode
SetGadgetState(#Button_Draw, 0)
SetGadgetState(#Button_EditBG, 0)
SetGadgetState(#Button_EditFG, 0)
SetGadgetState(gadget, 1)
mode = gadget
Case #Button_ColorWhite To #Button_ColorGreen
; color selection (provisory solution to test, you might want to change this for a better one)
For i = #Button_ColorWhite To #Button_ColorGreen
SetGadgetState(i, 0)
Next
SetGadgetState(gadget, 1)
If mode = #Button_EditFG
colorFG = GetGadgetData(gadget)
ElseIf mode = #Button_EditBG
colorBG = GetGadgetData(gadget)
EndIf
Case #Button_Clear
Dim playfieldData(cols, rows)
Dim playfieldFG(rows)
Dim playfieldBG(rows)
StartDrawing(CanvasOutput(#Canvas_Playfield))
Box(0, 0, cols*colScale, rows*rowHeight, #White)
StopDrawing()
EndSelect
EndProcedure
Procedure initUI()
; create main window and user interface
LoadFont(#Font_UiBig, fontUiBig, fontUiBigSize)
LoadFont(#Font_UiNormal, fontUiNormal, fontUiNormalSize)
LoadFont(#Font_UiSmall, fontUiSmall, fontUiSmallSize)
If OpenWindow(#Window_Main, 0, 0, 0, 0, #AppName, #PB_Window_Background)
SetWindowColor(#Window_Main, colorWindowBG)
; title
TextGadget(#Text_Title, 5*spacer, 5*spacer, cols*colScale*3, fontUiBigSize, #AppName)
SetGadgetFont(#Text_Title, FontID(#Font_UiBig))
SetGadgetColor(#Text_Title, #PB_Gadget_FrontColor, colorText)
; playfield
CanvasGadget(#Canvas_Playfield, GadgetX(#Text_Title), GadgetY(#Text_Title)+GadgetHeight(#Text_Title)+4*spacer,
cols*colScale, rows*rowScale, #PB_Canvas_Border)
; clear button
ButtonGadget(#Button_Clear, GadgetX(#Text_Title), GadgetY(#Canvas_Playfield)+GadgetHeight(#Canvas_Playfield)+3*spacer,
80, 30, "Clear")
; row modes
TextGadget(#Text_Mode, GadgetX(#Canvas_Playfield)+GadgetWidth(#Canvas_Playfield)+3*spacer, GadgetY(#Canvas_Playfield),
200, fontUiNormalSize, "Row Mode")
SetGadgetFont(#Text_Mode, FontID(#Font_UiNormal))
SetGadgetColor(#Text_Mode, #PB_Gadget_FrontColor, colorText)
ComboBoxGadget(#Combo_Rows, GadgetX(#Text_Mode), GadgetY(#Text_Mode)+fontUiNormalSize+spacer, 240, 30)
AddGadgetItem(#Combo_Rows, -1, " 32 columns with 176 rows")
AddGadgetItem(#Combo_Rows, -1, " 32 columns with 88 rows")
AddGadgetItem(#Combo_Rows, -1, " 32 columns with 44 rows")
AddGadgetItem(#Combo_Rows, -1, " 32 columns with 22 rows")
AddGadgetItem(#Combo_Rows, -1, " 32 columns with 11 rows")
SetGadgetState(#Combo_Rows, 4)
; editing mode
TextGadget(#Text_EditingMode, GadgetX(#Text_Mode), GadgetY(#Combo_Rows)+30+3*spacer, 240, fontUiNormalSize, "Editing Mode")
SetGadgetFont(#Text_EditingMode, FontID(#Font_UiNormal))
SetGadgetColor(#Text_EditingMode, #PB_Gadget_FrontColor, colorText)
ButtonGadget(#Button_Draw, GadgetX(#Text_Mode), GadgetY(#Text_EditingMode)+fontUiNormalSize+spacer, 80, 30,
"Draw", #PB_Button_Toggle )
ButtonGadget(#Button_EditFG, GadgetX(#Text_Mode)+80, GadgetY(#Text_EditingMode)+fontUiNormalSize+spacer, 80, 30,
"Color FG", #PB_Button_Toggle )
ButtonGadget(#Button_EditBG, GadgetX(#Text_Mode)+160, GadgetY(#Text_EditingMode)+fontUiNormalSize+spacer, 80, 30,
"Color BG", #PB_Button_Toggle)
SetGadgetState(#Button_Draw, 1)
; color
TextGadget(#Text_Color, GadgetX(#Text_Mode), GadgetY(#Button_EditFG)+30+3*spacer, 240, fontUiNormalSize, "Color")
SetGadgetFont(#Text_Color, FontID(#Font_UiNormal))
SetGadgetColor(#Text_Color, #PB_Gadget_FrontColor, colorText)
ButtonGadget(#Button_ColorWhite, GadgetX(#Text_Mode), GadgetY(#Text_Color)+fontUiNormalSize+spacer, 80, 30,
"White", #PB_Button_Toggle)
SetGadgetData(#Button_ColorWhite, #White)
ButtonGadget(#Button_ColorBlack, GadgetX(#Text_Mode)+80, GadgetY(#Text_Color)+fontUiNormalSize+spacer, 80, 30,
"Black", #PB_Button_Toggle)
SetGadgetData(#Button_ColorBlack, #Black)
ButtonGadget(#Button_ColorRed, GadgetX(#Text_Mode)+160, GadgetY(#Text_Color)+fontUiNormalSize+spacer, 80, 30,
"Red", #PB_Button_Toggle)
SetGadgetData(#Button_ColorRed, #Red)
ButtonGadget(#Button_ColorBlue, GadgetX(#Text_Mode), GadgetY(#Text_Color)+fontUiNormalSize+spacer+30, 80, 30,
"Blue", #PB_Button_Toggle)
SetGadgetData(#Button_ColorBlue, #Blue)
ButtonGadget(#Button_ColorGreen, GadgetX(#Text_Mode)+80, GadgetY(#Text_Color)+fontUiNormalSize+spacer+30, 80, 30,
"Green", #PB_Button_Toggle)
SetGadgetData(#Button_ColorGreen, #Green)
ButtonGadget(#Button_ColorYellow, GadgetX(#Text_Mode)+160, GadgetY(#Text_Color)+fontUiNormalSize+spacer+30, 80, 30,
"Yellow", #PB_Button_Toggle)
SetGadgetData(#Button_ColorYellow, #Yellow)
SetGadgetState(#Button_ColorBlack, 1)
; footer
TextGadget(#Text_Footer, GadgetX(#Text_Title), GadgetY(#Button_Clear)+GadgetHeight(#Button_Clear)+3*spacer,
cols*colScale*3, fontUiSmallSize, textFooter)
SetGadgetFont(#Text_Footer, FontID(#Font_UiSmall))
SetGadgetColor(#Text_Footer, #PB_Gadget_FrontColor, colorText)
EndIf
EndProcedure
;- POINT OF ENTRY
; programm starts here
initUI()
BindEvent(#PB_Event_Gadget, @GadgetEvents())