editor places tiles

This commit is contained in:
PossiblyAxolotl 2022-05-21 20:06:58 -06:00
parent cdfec95084
commit 9ff93fdf2e
14 changed files with 144 additions and 38 deletions

View file

@ -5,19 +5,39 @@ local gfx <const> = playdate.graphics
local prevtext = "" local prevtext = ""
gfx.setLineWidth(5) gfx.setLineWidth(5)
local tileTable <const> = gfx.imagetable.new("gfx/tiles")
local tilemapEditor = gfx.tilemap.new()
tilemapEditor:setImageTable(tileTable)
local tiles = {}
tilemapEditor:setSize(10,10)
local imgtiles = gfx.sprite.new(tilemapEditor)
local w, h = imgtiles:getSize()
imgtiles:moveTo(w/2,h/2)
local position = {x=0,y=0} local position = {x=0,y=0}
local positionLerp = {x=0,y=0}
local bool2int = {[true]=1,[false]=0} local bool2int = {[true]=1,[false]=0}
local menu = playdate.getSystemMenu()
local toolTipButton, error
local editor = "main"
local imgSwitch = gfx.imagetable.new("gfx/switch") local imgSwitch = gfx.imagetable.new("gfx/switch")
local imgFloppy = gfx.image.new("gfx/floppy") local imgFloppy = gfx.image.new("gfx/floppy")
local imgAdd = gfx.image.new("gfx/add")
local imgMus = gfx.image.new("gfx/music")
local imgLine = gfx.image.new("gfx/line")
local imgSpin = gfx.image.new("gfx/spin")
local imgCursor = gfx.image.new("gfx/cursor2")
assert(imgSwitch) assert(imgSwitch)
assert(imgFloppy) assert(imgFloppy)
local sprSwitch = gfx.sprite.new(imgSwitch:getImage(1)) assert(imgAdd)
local sprFloppy = gfx.sprite.new(imgFloppy) assert(imgMus)
assert(imgLine)
sprSwitch:moveTo(381,47) assert(imgSpin)
sprFloppy:moveTo(381,17) assert(imgCursor)
function newProject() function newProject()
mode = "newproj" mode = "newproj"
@ -37,9 +57,11 @@ function playdate.keyboard.keyboardWillHideCallback(ok)
editLoad() editLoad()
else else
mode = "editor" mode = "editor"
sprSwitch:add() toolTipButton, error = menu:addCheckmarkMenuItem("show help",true, function(value)
sprFloppy:add() print(value)
end)
imgtiles:add()
menuButton:setTitle("save & quit")
playdate.wait(0.1) playdate.wait(0.1)
end end
end end
@ -56,7 +78,7 @@ end
local tileIndex = 0.0 local tileIndex = 0.0
local curY = math.floor( tileIndex ) * 30 + 2 local curY = math.floor( tileIndex ) * 28 + 3
local curYlerp = -32 local curYlerp = -32
function editUpdate() function editUpdate()
@ -65,14 +87,24 @@ function editUpdate()
tileIndex += change * 0.01 tileIndex += change * 0.01
curY = math.floor( tileIndex ) * 30 + 2 if tileIndex > 7.9 then tileIndex = 0 end
if tileIndex < 0 then tileIndex = 7.9 end
curYlerp = playdate.math.lerp(curYlerp, curY, 0.3) curY = math.floor( tileIndex ) * 28 +7
curYlerp = playdate.math.lerp(curYlerp, curY, 0.4)
positionLerp.x = playdate.math.lerp(positionLerp.x, position.x * 16, 0.5)
positionLerp.y = playdate.math.lerp(positionLerp.y, position.y * 16, 0.5)
if playdate.buttonJustPressed(playdate.kButtonA) then if playdate.buttonJustPressed(playdate.kButtonA) then
if math.floor( tileIndex ) == 1 then if math.floor( tileIndex ) == 1 then
playdate.display.setInverted(not playdate.display.getInverted()) playdate.display.setInverted(not playdate.display.getInverted())
sprSwitch:setImage(imgSwitch:getImage(bool2int[playdate.display.getInverted()] + 1)) elseif math.floor( tileIndex ) == 3 then
tilemapEditor:setTileAtPosition(position.x+12,position.y+8,2)
tiles[#tiles+1] = {x=position.x + 12, y=position.y + 8, 2}
imgtiles = gfx.sprite.new(tilemapEditor)
w, h = imgtiles:getSize()
imgtiles:moveTo(w/2,h/2)
end end
end end
@ -81,22 +113,46 @@ function editUpdate()
elseif playdate.buttonJustPressed(playdate.kButtonRight) then elseif playdate.buttonJustPressed(playdate.kButtonRight) then
position.x += 1 position.x += 1
end end
if playdate.buttonJustPressed(playdate.kButtonUp) then
position.y -= 1
elseif playdate.buttonJustPressed(playdate.kButtonDown) then
position.y += 1
end
gfx.clear()
-- draw map -- draw map
gfx.setDrawOffset(position.x*16,position.y*16) gfx.setDrawOffset(-positionLerp.x, -positionLerp.y)
imgtiles:update()
imgCursor:draw((position.x + 11) * 16, (position.y + 7) * 16)
-- draw ui -- draw ui/
gfx.setDrawOffset(0,0) gfx.setDrawOffset(0,0)
gfx.sprite.update() gfx.setColor(gfx.kColorBlack)
gfx.fillRect(365,0,400,240)
gfx.setColor(gfx.kColorWhite) gfx.setColor(gfx.kColorWhite)
gfx.drawLine(360,0,360,240) gfx.drawLine(360,0,360,240)
-- draw changes
if editor == "main" then
imgMus:draw(366, 64)
imgAdd:draw(366,93)
imgSwitch:getImage(bool2int[playdate.display.getInverted()] + 1):draw(366,36)
imgFloppy:draw(366,8)
imgLine:draw(366,120)
imgSpin:draw(366,148)
end
gfx.setColor(playdate.graphics.kColorXOR) gfx.setColor(playdate.graphics.kColorXOR)
gfx.fillRect(365,curYlerp,33,30) gfx.fillRect(365,curYlerp,33,28)
end end
function editClose() function editClose()
sprSwitch:remove() for tile = 1, #tiles, 1 do
sprFloppy:remove() tilemapEditor:setTileAtPosition(tiles[tile].x,tiles[tile].y,0)
end
imgtiles:remove()
playdate.getSystemMenu():removeMenuItem(toolTipButton)
menuButton:setTitle("game menu")
end end

View file

@ -48,6 +48,8 @@ createMenu(mainmenu)
local menu = playdate.getSystemMenu() local menu = playdate.getSystemMenu()
menuButton, error = menu:addMenuItem("game menu", function() menuButton, error = menu:addMenuItem("game menu", function()
if mode == "game" then if mode == "game" then
removeMap()
playdate.datastore.delete("savegame.json")
playdate.datastore.write({savedLevel=map,savedDeaths=deaths},"savegame") playdate.datastore.write({savedLevel=map,savedDeaths=deaths},"savegame")
elseif mode == "editor" then elseif mode == "editor" then
editClose() editClose()
@ -100,7 +102,7 @@ function playdate.update()
gfx.clear() gfx.clear()
updateNewproj() updateNewproj()
elseif mode == "editor" then elseif mode == "editor" then
gfx.clear()
editUpdate() editUpdate()
if playdate.isCrankDocked() then if playdate.isCrankDocked() then
@ -117,6 +119,7 @@ end
function playdate.gameWillTerminate() function playdate.gameWillTerminate()
if mode == "game" then if mode == "game" then
playdate.datastore.delete("savegame.json")
playdate.datastore.write({savedLevel=map,savedDeaths=deaths},"savegame") playdate.datastore.write({savedLevel=map,savedDeaths=deaths},"savegame")
end end
end end

View file

@ -35,6 +35,15 @@ function addMap(_file, rs)
tilemap:setTileAtPosition(level.tiles[i].x,level.tiles[i].y,level.tiles[i].t) tilemap:setTileAtPosition(level.tiles[i].x,level.tiles[i].y,level.tiles[i].t)
end end
song:stop()
if level.song then
song:load("sfx/"..level.song)
else
song:load("sfx/song2")
end
song:play(0)
if level.inverted then playdate.display.setInverted(true) else playdate.display.setInverted(false) end if level.inverted then playdate.display.setInverted(true) else playdate.display.setInverted(false) end
if level.saws then loadBlades(level.saws) end if level.saws then loadBlades(level.saws) end
if level.rotators then loadSpins(level.rotators) end if level.rotators then loadSpins(level.rotators) end
@ -50,3 +59,12 @@ function addMap(_file, rs)
sprTiles:moveTo(sprTiles.width/2,sprTiles.height/2) sprTiles:moveTo(sprTiles.width/2,sprTiles.height/2)
sprTiles:add() sprTiles:add()
end end
function removeMap()
if #tiles > 0 then
for i = 1, #tiles, 1 do
tiles[i]:remove()
end
end
sprTiles:remove()
end

View file

@ -27,9 +27,11 @@ function mainMenuCreation()
mainmenu = {} mainmenu = {}
mainmenu[4],mainmenu[3],mainmenu[2], mainmenu[1], mainmenu[0] = "START NEW GAME", "USER LEVELS", "LEVEL EDITOR", "EXTRAS", "mainNoPlay" mainmenu[4],mainmenu[3],mainmenu[2], mainmenu[1], mainmenu[0] = "START NEW GAME", "USER LEVELS", "LEVEL EDITOR", "EXTRAS", "mainNoPlay"
if playdate.datastore.read("savegame") then local g = playdate.datastore.read("savegame")
map = playdate.datastore.read("savegame").savedLevel
deaths = playdate.datastore.read("savegame").savedDeaths if g then
map = g.savedLevel
deaths = g.savedDeaths
mainmenu[5], mainmenu[0] = "CONTINUE", "mainPlay" mainmenu[5], mainmenu[0] = "CONTINUE", "mainPlay"
end end
end end
@ -108,12 +110,35 @@ function updateMenu()
end end
end end
local function dataLoad()
barpos = 160
logopos = -112
local lvls = playdate.file.listFiles("data")
local m = {}
m[0], m[1] = "data", "EXTRAS"
if #lvls - ((10*page)) <= 0 then page = 0 end
if #lvls <= 11 then
for i = 1, #lvls, 1 do
m[i+1] = lvls[i]:upper()
end
elseif lvls[1 + (10*page)] then
m[2] = "NEXT PAGE"
for i = 1, 10, 1 do
if lvls[i+(10*page)] then
m[i+2] = lvls[i+(10*page)]:upper()
end
end
end
createMenu(m)
end
local function customLoad() local function customLoad()
barpos = 160 barpos = 160
logopos = -112 logopos = -112
local lvls = playdate.file.listFiles("levels") local lvls = playdate.file.listFiles("levels")
local m = {} local m = {}
m[0], m[1] = "customs", "BACK" m[0], m[1] = "customs", "MENU"
if #lvls - ((10*page)) <= 0 then page = 0 end if #lvls - ((10*page)) <= 0 then page = 0 end
if #lvls <= 11 then if #lvls <= 11 then
for i = 1, #lvls, 1 do for i = 1, #lvls, 1 do
@ -136,7 +161,7 @@ function editLoad()
barpos = 160 barpos = 160
local lvls = playdate.file.listFiles("levels") local lvls = playdate.file.listFiles("levels")
local m = {} local m = {}
m[0], m[1], m[2] = "edits", "BACK", "CREATE NEW" m[0], m[1], m[2] = "edits", "MENU", "CREATE NEW"
if #lvls - (1 + (9*page)) <= 0 then page = 0 end if #lvls - (1 + (9*page)) <= 0 then page = 0 end
if #lvls <= 10 then if #lvls <= 10 then
for i = 1, #lvls, 1 do for i = 1, #lvls, 1 do
@ -175,7 +200,7 @@ function menuButtonPress(name)
local m = {} local m = {}
--barpos = 160 --barpos = 160
--logopos = -112 --logopos = -112
m[0],m[1], m[2], m[3], m[4], m[5] = "extras", "BACK", "MUSIC BOX", "END CUTSCENE", "START CUTSCENE", "LEVEL SELECT" m[0],m[1], m[2], m[3], m[4], m[5] = "extras", "MENU", "MUSIC BOX", "END CUTSCENE", "START CUTSCENE", "LEVEL SELECT"
if playdate.file.exists("bonusLevels.rocketbytes") then if playdate.file.exists("bonusLevels.rocketbytes") then
m[6] = "EXTRA LEVELS" m[6] = "EXTRA LEVELS"
end end
@ -187,6 +212,8 @@ function menuButtonPress(name)
elseif name == "LEVEL EDITOR" then elseif name == "LEVEL EDITOR" then
page = 0 page = 0
editLoad() editLoad()
elseif name == "LEVEL SELECT" then
dataLoad()
elseif name == "CREATE NEW" then elseif name == "CREATE NEW" then
newProject() newProject()
elseif name == "NEXT PAGE" then elseif name == "NEXT PAGE" then
@ -197,11 +224,14 @@ function menuButtonPress(name)
editLoad() editLoad()
end end
elseif name == "BACK" or name == "CANCEL" then elseif name == "BACK" or name == "CANCEL" or name == "MENU" then
createMenu(mainmenu) createMenu(mainmenu)
elseif menu == "customs" then elseif menu == "customs" then
addMap("levels/"..name, true) addMap("levels/"..name, true)
mode = "play" mode = "play"
elseif menu == "data" then
addMap("data/"..name, true)
mode = "play"
end end
end end

View file

@ -31,9 +31,6 @@ sprBigRocket:setCollideRect(8,8,48,48)
sprBigRocket:setGroups({2}) sprBigRocket:setGroups({2})
function addPlayer(_x,_y,__x,__y) function addPlayer(_x,_y,__x,__y)
song:stop()
song:load("sfx/song2")
song:play(0)
exists = true exists = true
dead = false dead = false
scale = 1 scale = 1
@ -52,6 +49,7 @@ function killPlayer()
exists = false exists = false
active = false active = false
sprRocket:remove() sprRocket:remove()
sprBigRocket:remove()
gfx.setDrawOffset(0,0) gfx.setDrawOffset(0,0)
end end
@ -74,20 +72,20 @@ local function playerWin()
if next then if next then
map = next map = next
end end
playdate.datastore.delete("savegame")
playdate.datastore.write({savedLevel=map,savedDeaths=deaths},"savegame")
totalEnergy = 0 totalEnergy = 0
showEnergy = false showEnergy = false
energy = 0 energy = 0
if next == nil then if mode == "game" and next then
mainMenuCreation() playdate.datastore.delete("savegame")
createMenu(mainmenu) playdate.datastore.write({savedLevel=map,savedDeaths=deaths},"savegame")
next = nil
else
next = nil next = nil
killBlades() killBlades()
killPlayer() killPlayer()
addMapSave(map, false) addMapSave(map, false)
else
mainMenuCreation()
createMenu(mainmenu)
next = nil
end end
end) end)

View file

@ -1 +1 @@
{"bigrocket":{"x":73.333333,"y":144.79638},"next":"data/level2.rocketbyte","fuel":[{"x":73.333333,"y":100}],"dimensions":{"x":22,"y":17},"rocket":{"x":276.27907,"y":144.651163},"tiles":[{"t":2,"x":2,"y":1},{"t":2,"x":14,"y":1},{"t":2,"x":14,"y":5},{"t":2,"x":22,"y":5},{"t":2,"x":8,"y":6},{"t":2,"x":2,"y":12},{"t":2,"x":8,"y":12},{"t":2,"x":11,"y":12},{"t":2,"x":14,"y":12},{"t":2,"x":8,"y":17},{"t":2,"x":22,"y":17},{"t":3,"x":3,"y":1},{"t":3,"x":4,"y":1},{"t":3,"x":5,"y":1},{"t":3,"x":6,"y":1},{"t":3,"x":7,"y":1},{"t":3,"x":8,"y":1},{"t":3,"x":9,"y":1},{"t":3,"x":10,"y":1},{"t":3,"x":11,"y":1},{"t":3,"x":12,"y":1},{"t":3,"x":13,"y":1},{"t":3,"x":15,"y":5},{"t":3,"x":16,"y":5},{"t":3,"x":17,"y":5},{"t":3,"x":18,"y":5},{"t":3,"x":19,"y":5},{"t":3,"x":20,"y":5},{"t":3,"x":21,"y":5},{"t":3,"x":3,"y":12},{"t":3,"x":4,"y":12},{"t":3,"x":5,"y":12},{"t":3,"x":6,"y":12},{"t":3,"x":7,"y":12},{"t":3,"x":9,"y":12},{"t":3,"x":10,"y":12},{"t":3,"x":9,"y":17},{"t":3,"x":10,"y":17},{"t":3,"x":11,"y":17},{"t":3,"x":12,"y":17},{"t":3,"x":13,"y":17},{"t":3,"x":14,"y":17},{"t":3,"x":15,"y":17},{"t":3,"x":16,"y":17},{"t":3,"x":17,"y":17},{"t":3,"x":18,"y":17},{"t":3,"x":19,"y":17},{"t":3,"x":20,"y":17},{"t":3,"x":21,"y":17},{"t":4,"x":2,"y":2},{"t":4,"x":14,"y":2},{"t":4,"x":2,"y":3},{"t":4,"x":14,"y":3},{"t":4,"x":2,"y":4},{"t":4,"x":14,"y":4},{"t":4,"x":2,"y":5},{"t":4,"x":2,"y":6},{"t":4,"x":14,"y":6},{"t":4,"x":22,"y":6},{"t":4,"x":2,"y":7},{"t":4,"x":8,"y":7},{"t":4,"x":14,"y":7},{"t":4,"x":22,"y":7},{"t":4,"x":2,"y":8},{"t":4,"x":8,"y":8},{"t":4,"x":14,"y":8},{"t":4,"x":22,"y":8},{"t":4,"x":2,"y":9},{"t":4,"x":8,"y":9},{"t":4,"x":14,"y":9},{"t":4,"x":22,"y":9},{"t":4,"x":2,"y":10},{"t":4,"x":8,"y":10},{"t":4,"x":14,"y":10},{"t":4,"x":22,"y":10},{"t":4,"x":2,"y":11},{"t":4,"x":8,"y":11},{"t":4,"x":14,"y":11},{"t":4,"x":22,"y":11},{"t":4,"x":22,"y":12},{"t":4,"x":8,"y":13},{"t":4,"x":22,"y":13},{"t":4,"x":8,"y":14},{"t":4,"x":22,"y":14},{"t":4,"x":8,"y":15},{"t":4,"x":22,"y":15},{"t":4,"x":8,"y":16},{"t":4,"x":22,"y":16}]} {"bigrocket":{"x":73.333333,"y":144.79638},"song":"song5","next":"data/level2.rocketbyte","fuel":[{"x":73.333333,"y":100}],"dimensions":{"x":22,"y":17},"rocket":{"x":276.27907,"y":144.651163},"tiles":[{"t":2,"x":2,"y":1},{"t":2,"x":14,"y":1},{"t":2,"x":14,"y":5},{"t":2,"x":22,"y":5},{"t":2,"x":8,"y":6},{"t":2,"x":2,"y":12},{"t":2,"x":8,"y":12},{"t":2,"x":11,"y":12},{"t":2,"x":14,"y":12},{"t":2,"x":8,"y":17},{"t":2,"x":22,"y":17},{"t":3,"x":3,"y":1},{"t":3,"x":4,"y":1},{"t":3,"x":5,"y":1},{"t":3,"x":6,"y":1},{"t":3,"x":7,"y":1},{"t":3,"x":8,"y":1},{"t":3,"x":9,"y":1},{"t":3,"x":10,"y":1},{"t":3,"x":11,"y":1},{"t":3,"x":12,"y":1},{"t":3,"x":13,"y":1},{"t":3,"x":15,"y":5},{"t":3,"x":16,"y":5},{"t":3,"x":17,"y":5},{"t":3,"x":18,"y":5},{"t":3,"x":19,"y":5},{"t":3,"x":20,"y":5},{"t":3,"x":21,"y":5},{"t":3,"x":3,"y":12},{"t":3,"x":4,"y":12},{"t":3,"x":5,"y":12},{"t":3,"x":6,"y":12},{"t":3,"x":7,"y":12},{"t":3,"x":9,"y":12},{"t":3,"x":10,"y":12},{"t":3,"x":9,"y":17},{"t":3,"x":10,"y":17},{"t":3,"x":11,"y":17},{"t":3,"x":12,"y":17},{"t":3,"x":13,"y":17},{"t":3,"x":14,"y":17},{"t":3,"x":15,"y":17},{"t":3,"x":16,"y":17},{"t":3,"x":17,"y":17},{"t":3,"x":18,"y":17},{"t":3,"x":19,"y":17},{"t":3,"x":20,"y":17},{"t":3,"x":21,"y":17},{"t":4,"x":2,"y":2},{"t":4,"x":14,"y":2},{"t":4,"x":2,"y":3},{"t":4,"x":14,"y":3},{"t":4,"x":2,"y":4},{"t":4,"x":14,"y":4},{"t":4,"x":2,"y":5},{"t":4,"x":2,"y":6},{"t":4,"x":14,"y":6},{"t":4,"x":22,"y":6},{"t":4,"x":2,"y":7},{"t":4,"x":8,"y":7},{"t":4,"x":14,"y":7},{"t":4,"x":22,"y":7},{"t":4,"x":2,"y":8},{"t":4,"x":8,"y":8},{"t":4,"x":14,"y":8},{"t":4,"x":22,"y":8},{"t":4,"x":2,"y":9},{"t":4,"x":8,"y":9},{"t":4,"x":14,"y":9},{"t":4,"x":22,"y":9},{"t":4,"x":2,"y":10},{"t":4,"x":8,"y":10},{"t":4,"x":14,"y":10},{"t":4,"x":22,"y":10},{"t":4,"x":2,"y":11},{"t":4,"x":8,"y":11},{"t":4,"x":14,"y":11},{"t":4,"x":22,"y":11},{"t":4,"x":22,"y":12},{"t":4,"x":8,"y":13},{"t":4,"x":22,"y":13},{"t":4,"x":8,"y":14},{"t":4,"x":22,"y":14},{"t":4,"x":8,"y":15},{"t":4,"x":22,"y":15},{"t":4,"x":8,"y":16},{"t":4,"x":22,"y":16}]}

BIN
Source/gfx/add.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

BIN
Source/gfx/cursor2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

BIN
Source/gfx/line.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

BIN
Source/gfx/music.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

BIN
Source/gfx/spin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

BIN
Source/gfx/square.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

View file

@ -5,3 +5,4 @@ bundleID=com.PossiblyAxolotl.RocketBytes
version=DEV version=DEV
buildNumber=1 buildNumber=1
imagePath=launcher imagePath=launcher
contentWarning=This game requires extremely precise and quick crank movement.

BIN
Source/sfx/song5.wav Normal file

Binary file not shown.