Compare commits

..

No commits in common. "fae2abf94e20430352b72c2787da781b82f17ff4" and "95b2c825db6e4b0b303838a3ead76e84bfca4764" have entirely different histories.

31 changed files with 106 additions and 483 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -29,7 +29,6 @@
"runtime.version": "Lua 5.4", "runtime.version": "Lua 5.4",
"workspace.library": [ "workspace.library": [
"/Users/oleksiiilienko/projects/playdate-luacats", "/Users/oleksiiilienko/projects/playdate-luacats",
"/Users/oleksiiilienko/Documents/fpv2/source/libraries", "/Users/oleksiiilienko/Documents/fpv2/source/libraries"
"/Users/oleksiiilienko/Documents/fpv2/source"
] ]
} }

BIN
source/.DS_Store vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -20,7 +20,7 @@ function pdDialogue.wrap(lines, width, font)
lines: an array of strings lines: an array of strings
width: the maximum width of each line (in pixels) width: the maximum width of each line (in pixels)
font: the font to use (optional, uses default font if not provided) font: the font to use (optional, uses default font if not provided)
]]-- ]] --
font = font or gfx.getFont() font = font or gfx.getFont()
local result = {} local result = {}
@ -62,10 +62,10 @@ function pdDialogue.window(text, startIndex, height, font)
startIndex: the row index to start the window startIndex: the row index to start the window
height: the height (in pixels) of the window height: the height (in pixels) of the window
font: the font to use (optional, uses default font if not provided) font: the font to use (optional, uses default font if not provided)
]]-- ]] --
font = font or gfx.getFont() font = font or gfx.getFont()
local result = {text[start_index]} local result = { text[start_index] }
local rows = pdDialogue.getRows(height, font) - 1 local rows = pdDialogue.getRows(height, font) - 1
for index = 1, rows do for index = 1, rows do
@ -85,7 +85,7 @@ function pdDialogue.paginate(lines, height, font)
lines: array of strings (pre-wrapped) lines: array of strings (pre-wrapped)
height: height to limit text (in pixels) height: height to limit text (in pixels)
font: optional, will get current font if not provided font: optional, will get current font if not provided
]]-- ]] --
local result = {} local result = {}
local currentLine = {} local currentLine = {}
@ -129,7 +129,7 @@ function pdDialogue.process(text, width, height, font)
width: width to limit text (in pixels) width: width to limit text (in pixels)
height: height to limit text (in pixels) height: height to limit text (in pixels)
font: optional, will get current font if not provided font: optional, will get current font if not provided
]]-- ]] --
local lines = {} local lines = {}
font = font or gfx.getFont() font = font or gfx.getFont()
@ -168,10 +168,10 @@ class("pdDialogueSprite").extends(gfx.sprite)
function pdDialogueSprite:init(dialogue) function pdDialogueSprite:init(dialogue)
--[[ --[[
dialogue: an instance of pdDialogueBox dialogue: an instance of pdDialogueBox
]]-- ]] --
pdDialogueSprite.super.init(self) pdDialogueSprite.super.init(self)
self.image = gfx.image.new(dialogue.width, dialogue.height) self.image = gfx.image.new(dialogue.width, dialogue.height)
self:setImage(self.image) self:setImage(self.image)
self.dialogue = dialogue self.dialogue = dialogue
-- Remove sprite when dialogue is closed -- Remove sprite when dialogue is closed
local onClose = self.dialogue.onClose local onClose = self.dialogue.onClose
@ -182,22 +182,22 @@ function pdDialogueSprite:init(dialogue)
end end
function pdDialogueSprite:add() function pdDialogueSprite:add()
pdDialogueSprite.super.add(self) pdDialogueSprite.super.add(self)
if not self.dialogue.enabled then if not self.dialogue.enabled then
self.dialogue:enable() self.dialogue:enable()
end end
end end
function pdDialogueSprite:update() function pdDialogueSprite:update()
pdDialogueSprite.super.update(self) pdDialogueSprite.super.update(self)
-- Redraw dialogue if it has changed (update returns true) -- Redraw dialogue if it has changed (update returns true)
if self.dialogue:update() then if self.dialogue:update() then
self.image:clear(gfx.kColorClear) self.image:clear(gfx.kColorClear)
gfx.pushContext(self.image) gfx.pushContext(self.image)
self.dialogue:draw(0, 0) self.dialogue:draw(0, 0)
gfx.popContext() gfx.popContext()
self:markDirty() self:markDirty()
end end
end end
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
@ -206,9 +206,11 @@ end
pdDialogueBox = {} pdDialogueBox = {}
class("pdDialogueBox").extends() class("pdDialogueBox").extends()
local ABTN = Graphics.image.new("assets/sprites/buttons/A")
function pdDialogueBox.buttonPrompt(x, y) function pdDialogueBox.buttonPrompt(x, y)
gfx.setImageDrawMode(gfx.kDrawModeCopy) gfx.setImageDrawMode(gfx.kDrawModeCopy)
gfx.getSystemFont():drawText("", x, y) ABTN:draw(x, y)
end end
function pdDialogueBox.arrowPrompt(x, y, color) function pdDialogueBox.arrowPrompt(x, y, color)
@ -226,7 +228,7 @@ function pdDialogueBox:init(text, width, height, font)
width: width of dialogue box (in pixels) width: width of dialogue box (in pixels)
height: height of dialogue box (in pixels) height: height of dialogue box (in pixels)
font: font to use for drawing text font: font to use for drawing text
]]-- ]] --
pdDialogueBox.super.init(self) pdDialogueBox.super.init(self)
self.speed = 0.5 -- char per frame self.speed = 0.5 -- char per frame
@ -248,19 +250,17 @@ function pdDialogueBox:asSprite()
end end
function pdDialogueBox:getInputHandlers() function pdDialogueBox:getInputHandlers()
local _speed = self:getSpeed()
return { return {
AButtonDown = function() AButtonDown = function()
self:setSpeed(2)
if self.dialogue_complete then if self.dialogue_complete then
self:disable() self:disable()
elseif self.line_complete then elseif self.line_complete then
self:nextPage() self:nextPage()
else
self:setSpeed(_speed * 2)
end end
end, end,
AButtonUp = function() AButtonUp = function()
self:setSpeed(_speed) self:setSpeed(0.5)
end, end,
BButtonDown = function() BButtonDown = function()
if self.line_complete then if self.line_complete then
@ -406,7 +406,6 @@ function pdDialogueBox:nextPage()
if self.currentPage + 1 <= #self.pages then if self.currentPage + 1 <= #self.pages then
self.currentPage += 1 self.currentPage += 1
self:restartLine() self:restartLine()
self:onNextPage()
end end
end end
@ -462,10 +461,6 @@ function pdDialogueBox:onPageComplete()
-- Overrideable by user -- Overrideable by user
end end
function pdDialogueBox:onNextPage()
-- Overrideable by user
end
function pdDialogueBox:onDialogueComplete() function pdDialogueBox:onDialogueComplete()
-- Overrideable by user -- Overrideable by user
end end
@ -527,7 +522,7 @@ function pdPortraitDialogueBox:init(name, drawable, text, width, height, font)
end end
end end
pdDialogueBox.init(self, text, width - self.portrait_width, height, font) pdDialogueBox.init(self, text, width - self.portrait_width, height, font)
self:setAlignment(kTextAlignment.left) self:setAlignment(kTextAlignment.left)
end end
function pdPortraitDialogueBox:setAlignment(alignment) function pdPortraitDialogueBox:setAlignment(alignment)
@ -544,7 +539,7 @@ function pdPortraitDialogueBox:getAlignment()
end end
function pdPortraitDialogueBox:draw(x, y) function pdPortraitDialogueBox:draw(x, y)
local offset = self.alignment == kTextAlignment.left and self.portrait_width or 0 local offset = self.alignment == kTextAlignment.left and self.portrait_width or 0
pdPortraitDialogueBox.super.draw(self, x + offset, y) pdPortraitDialogueBox.super.draw(self, x + offset, y)
end end
@ -576,123 +571,120 @@ end
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
-- #Section: dialogue box used in pdDialogue -- #Section: dialogue box used in pdDialogue
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
pdDialogue.DialogueBox_x, pdDialogue.DialogueBox_y = 5, 186 pdDialogue.DialogueBox_x, pdDialogue.DialogueBox_y = 5, 186
pdDialogue.DialogueBox = pdDialogueBox(nil, 390, 48) pdDialogue.DialogueBox = pdDialogueBox(nil, 390, 48)
pdDialogue.DialogueBox_Callbacks = {} pdDialogue.DialogueBox_Callbacks = {}
pdDialogue.DialogueBox_Say_Default = nil pdDialogue.DialogueBox_Say_Default = nil
pdDialogue.DialogueBox_Say_Nils = nil pdDialogue.DialogueBox_Say_Nils = nil
pdDialogue.DialogueBox_KeyValueMap = { pdDialogue.DialogueBox_KeyValueMap = {
width={ width = {
set=function(value) pdDialogue.DialogueBox:setWidth(value) end, set = function(value) pdDialogue.DialogueBox:setWidth(value) end,
get=function() return pdDialogue.DialogueBox:getWidth() end get = function() return pdDialogue.DialogueBox:getWidth() end
}, },
height={ height = {
set=function(value) pdDialogue.DialogueBox:setHeight(value) end, set = function(value) pdDialogue.DialogueBox:setHeight(value) end,
get=function() return pdDialogue.DialogueBox:getHeight() end get = function() return pdDialogue.DialogueBox:getHeight() end
}, },
x={ x = {
set=function(value) pdDialogue.DialogueBox_x = value end, set = function(value) pdDialogue.DialogueBox_x = value end,
get=function() return pdDialogue.DialogueBox_x end get = function() return pdDialogue.DialogueBox_x end
}, },
y={ y = {
set=function(value) pdDialogue.DialogueBox_y = value end, set = function(value) pdDialogue.DialogueBox_y = value end,
get=function() return pdDialogue.DialogueBox_y end get = function() return pdDialogue.DialogueBox_y end
}, },
padding={ padding = {
set=function(value) pdDialogue.DialogueBox:setPadding(value) end, set = function(value) pdDialogue.DialogueBox:setPadding(value) end,
get=function() return pdDialogue.DialogueBox:getPadding() end get = function() return pdDialogue.DialogueBox:getPadding() end
}, },
font={ font = {
set=function(value) pdDialogue.DialogueBox:setFont(value) end, set = function(value) pdDialogue.DialogueBox:setFont(value) end,
get=function() return pdDialogue.DialogueBox:getFont() end get = function() return pdDialogue.DialogueBox:getFont() end
}, },
fontFamily={ fontFamily = {
set=function(value) pdDialogue.DialogueBox.fontFamily = value end, set = function(value) pdDialogue.DialogueBox.fontFamily = value end,
get=function() return pdDialogue.DialogueBox.fontFamily end get = function() return pdDialogue.DialogueBox.fontFamily end
}, },
nineSlice={ nineSlice = {
set=function(value) pdDialogue.DialogueBox:setNineSlice(value) end, set = function(value) pdDialogue.DialogueBox:setNineSlice(value) end,
get=function() return pdDialogue.DialogueBox:getNineSlice() end get = function() return pdDialogue.DialogueBox:getNineSlice() end
}, },
speed={ speed = {
set=function(value) pdDialogue.DialogueBox:setSpeed(value) end, set = function(value) pdDialogue.DialogueBox:setSpeed(value) end,
get=function() return pdDialogue.DialogueBox:getSpeed() end get = function() return pdDialogue.DialogueBox:getSpeed() end
}, },
drawBackground={ drawBackground = {
set=function(func) pdDialogue.DialogueBox_Callbacks["drawBackground"] = func end, set = function(func) pdDialogue.DialogueBox_Callbacks["drawBackground"] = func end,
get=function() return pdDialogue.DialogueBox_Callbacks["drawBackground"] end get = function() return pdDialogue.DialogueBox_Callbacks["drawBackground"] end
}, },
drawText={ drawText = {
set=function(func) pdDialogue.DialogueBox_Callbacks["drawText"] = func end, set = function(func) pdDialogue.DialogueBox_Callbacks["drawText"] = func end,
get=function() return pdDialogue.DialogueBox_Callbacks["drawText"] end get = function() return pdDialogue.DialogueBox_Callbacks["drawText"] end
}, },
drawPrompt={ drawPrompt = {
set=function(func) pdDialogue.DialogueBox_Callbacks["drawPrompt"] = func end, set = function(func) pdDialogue.DialogueBox_Callbacks["drawPrompt"] = func end,
get=function() return pdDialogue.DialogueBox_Callbacks["drawPrompt"] end get = function() return pdDialogue.DialogueBox_Callbacks["drawPrompt"] end
}, },
onOpen={ onOpen = {
set=function(func) pdDialogue.DialogueBox_Callbacks["onOpen"] = func end, set = function(func) pdDialogue.DialogueBox_Callbacks["onOpen"] = func end,
get=function() return pdDialogue.DialogueBox_Callbacks["onOpen"] end get = function() return pdDialogue.DialogueBox_Callbacks["onOpen"] end
}, },
onPageComplete={ onPageComplete = {
set=function(func) pdDialogue.DialogueBox_Callbacks["onPageComplete"] = func end, set = function(func) pdDialogue.DialogueBox_Callbacks["onPageComplete"] = func end,
get=function() return pdDialogue.DialogueBox_Callbacks["onPageComplete"] end get = function() return pdDialogue.DialogueBox_Callbacks["onPageComplete"] end
}, },
onNextPage={ onDialogueComplete = {
set=function(func) pdDialogue.DialogueBox_Callbacks["onNextPage"] = func end, set = function(func) pdDialogue.DialogueBox_Callbacks["onDialogueComplete"] = func end,
get=function() return pdDialogue.DialogueBox_Callbacks["onNextPage"] end get = function() return pdDialogue.DialogueBox_Callbacks["onDialogueComplete"] end
}, },
onDialogueComplete={ onClose = {
set=function(func) pdDialogue.DialogueBox_Callbacks["onDialogueComplete"] = func end, set = function(func) pdDialogue.DialogueBox_Callbacks["onClose"] = func end,
get=function() return pdDialogue.DialogueBox_Callbacks["onDialogueComplete"] end get = function() return pdDialogue.DialogueBox_Callbacks["onClose"] end
},
onClose={
set=function(func) pdDialogue.DialogueBox_Callbacks["onClose"] = func end,
get=function() return pdDialogue.DialogueBox_Callbacks["onClose"] end
} }
} }
function pdDialogue.DialogueBox:drawBackground(x, y) function pdDialogue.DialogueBox:drawBackground(x, y)
if pdDialogue.DialogueBox_Callbacks["drawBackground"] ~= nil then if pdDialogue.DialogueBox_Callbacks["drawBackground"] ~= nil then
pdDialogue.DialogueBox_Callbacks["drawBackground"](self, x, y) pdDialogue.DialogueBox_Callbacks["drawBackground"](dialogue, x, y)
else else
pdDialogue.DialogueBox.super.drawBackground(self, x, y) pdDialogue.DialogueBox.super.drawBackground(self, x, y)
end end
end end
function pdDialogue.DialogueBox:drawText(x, y ,text)
function pdDialogue.DialogueBox:drawText(x, y, text)
if pdDialogue.DialogueBox_Callbacks["drawText"] ~= nil then if pdDialogue.DialogueBox_Callbacks["drawText"] ~= nil then
pdDialogue.DialogueBox_Callbacks["drawText"](self, x, y, text) pdDialogue.DialogueBox_Callbacks["drawText"](dialogue, x, y, text)
else else
pdDialogue.DialogueBox.super.drawText(self, x, y, text) pdDialogue.DialogueBox.super.drawText(self, x, y, text)
end end
end end
function pdDialogue.DialogueBox:drawPrompt(x, y) function pdDialogue.DialogueBox:drawPrompt(x, y)
if pdDialogue.DialogueBox_Callbacks["drawPrompt"] ~= nil then if pdDialogue.DialogueBox_Callbacks["drawPrompt"] ~= nil then
pdDialogue.DialogueBox_Callbacks["drawPrompt"](self, x, y) pdDialogue.DialogueBox_Callbacks["drawPrompt"](dialogue, x, y)
else else
pdDialogue.DialogueBox.super.drawPrompt(self, x, y) pdDialogue.DialogueBox.super.drawPrompt(self, x, y)
end end
end end
function pdDialogue.DialogueBox:onOpen() function pdDialogue.DialogueBox:onOpen()
pd.inputHandlers.push(self:getInputHandlers(), true) pd.inputHandlers.push(self:getInputHandlers(), true)
if pdDialogue.DialogueBox_Callbacks["onOpen"] ~= nil then if pdDialogue.DialogueBox_Callbacks["onOpen"] ~= nil then
pdDialogue.DialogueBox_Callbacks["onOpen"]() pdDialogue.DialogueBox_Callbacks["onOpen"]()
end end
end end
function pdDialogue.DialogueBox:onPageComplete() function pdDialogue.DialogueBox:onPageComplete()
if pdDialogue.DialogueBox_Callbacks["onPageComplete"] ~= nil then if pdDialogue.DialogueBox_Callbacks["onPageComplete"] ~= nil then
pdDialogue.DialogueBox_Callbacks["onPageComplete"]() pdDialogue.DialogueBox_Callbacks["onPageComplete"]()
end end
end end
function pdDialogue.DialogueBox:onNextPage()
if pdDialogue.DialogueBox_Callbacks["onNextPage"] ~= nil then
pdDialogue.DialogueBox_Callbacks["onNextPage"]()
end
end
function pdDialogue.DialogueBox:onDialogueComplete() function pdDialogue.DialogueBox:onDialogueComplete()
if pdDialogue.DialogueBox_Callbacks["onDialogueComplete"] ~= nil then if pdDialogue.DialogueBox_Callbacks["onDialogueComplete"] ~= nil then
pdDialogue.DialogueBox_Callbacks["onDialogueComplete"]() pdDialogue.DialogueBox_Callbacks["onDialogueComplete"]()
end end
end end
function pdDialogue.DialogueBox:onClose() function pdDialogue.DialogueBox:onClose()
-- Make a backup of the current onClose callback -- Make a backup of the current onClose callback
local current = pdDialogue.DialogueBox_Callbacks["onClose"] local current = pdDialogue.DialogueBox_Callbacks["onClose"]
@ -746,7 +738,7 @@ function pdDialogue.say(text, config)
--[[ --[[
text: string (can be multiline) to say text: string (can be multiline) to say
config: optional table, will provide temporary overrides for this one dialogue box config: optional table, will provide temporary overrides for this one dialogue box
]]-- ]] --
if config ~= nil then if config ~= nil then
pdDialogue.DialogueBox_Say_Default, pdDialogue.DialogueBox_Say_Nils = pdDialogue.setup(config) pdDialogue.DialogueBox_Say_Default, pdDialogue.DialogueBox_Say_Nils = pdDialogue.setup(config)
end end

View File

@ -569,7 +569,7 @@ function ParticlePixel:update()
for part = 1, #self.particles, 1 do for part = 1, #self.particles, 1 do
local pix = self.particles[part] local pix = self.particles[part]
playdate.graphics.drawPixel(pix.x,pix.y) playdate.graphics.drawPixel(pix.x,pix.y,pix.size)
pix.x += math.sin(math.rad(pix.dir)) * pix.speed pix.x += math.sin(math.rad(pix.dir)) * pix.speed
pix.y -= math.cos(math.rad(pix.dir)) * pix.speed pix.y -= math.cos(math.rad(pix.dir)) * pix.speed

View File

@ -40,24 +40,12 @@ Maps = {
name = "Vovchansk", name = "Vovchansk",
description = "This is a map", description = "This is a map",
locked = false, locked = false,
},
{
id = 2,
name = "Mariupol",
description = "This is a map",
locked = false,
} }
} }
Modes = {
fpv = "FPV",
bomber = "Bomber"
}
Drones = { Drones = {
{ {
id = 1, id = 1,
mode = Modes.fpv,
name = "Quad FPV", name = "Quad FPV",
description = description =
"This is a quadrocopter with a camera on it. It's a good drone for beginners. It's easy to control and has a good battery life.", "This is a quadrocopter with a camera on it. It's a good drone for beginners. It's easy to control and has a good battery life.",
@ -68,11 +56,10 @@ Drones = {
}, },
{ {
id = 2, id = 2,
mode = Modes.bomber,
name = "Drone 2", name = "Drone 2",
description = "This is a drone", description = "This is a drone",
price = 200, price = 200,
locked = false, locked = true,
preview = nil, preview = nil,
full = nil full = nil
}, },
@ -98,7 +85,6 @@ Drones = {
import "scripts/player" import "scripts/player"
import "scripts/bigBoomSprite" import "scripts/bigBoomSprite"
import "scripts/bomber/boom"
import "scripts/groundSprite" import "scripts/groundSprite"
import "scripts/balebaSprite" import "scripts/balebaSprite"
import "scripts/dangerSprite" import "scripts/dangerSprite"
@ -108,9 +94,6 @@ import "scripts/selectionSprite"
import "scripts/DroneCard" import "scripts/DroneCard"
import "scripts/pageSprite" import "scripts/pageSprite"
import "scripts/MapCard" import "scripts/MapCard"
import "scripts/bomber/movableCrosshair"
import "scripts/bomber/granade"
import "scripts/bomber/explosionMark"
import "scenes/BaseScene" import "scenes/BaseScene"
import 'scenes/Assemble' import 'scenes/Assemble'
@ -118,7 +101,6 @@ import 'scenes/DroneCardSelector'
import 'scenes/Menu' import 'scenes/Menu'
import 'scenes/Game' import 'scenes/Game'
import 'scenes/MapSelector' import 'scenes/MapSelector'
import 'scenes/bomber/BomberScene'
Difficulty = { Difficulty = {
Easy = "Easy", Easy = "Easy",
@ -144,7 +126,7 @@ DifficultySettings = {
Noble.Settings.setup({ Noble.Settings.setup({
difficulty = Difficulty.Medium, difficulty = Difficulty.Medium,
music = true, music = true,
debug = false debug = true
}) })
Noble.GameData.setup({ Noble.GameData.setup({
@ -159,4 +141,4 @@ playdate.display.setRefreshRate(50)
Noble.showFPS = false Noble.showFPS = false
Noble.new(BomberScene) Noble.new(Menu)

View File

@ -2,7 +2,7 @@ name=FPV Game
author=ut3usw author=ut3usw
description=This is a FPV Game description=This is a FPV Game
bundleID=guru.dead.fpv bundleID=guru.dead.fpv
version=0.2.0 version=0.1.2
buildNumber=10 buildNumber=3
imagePath=assets/launcher/ imagePath=assets/launcher/
launchSoundPath=assets/launcher/sound.wav launchSoundPath=assets/launcher/sound.wav

View File

@ -143,6 +143,10 @@ end
function scene:enter() function scene:enter()
scene.super.enter(self) scene.super.enter(self)
local soundTable = playdate.sound.playingSources()
for i=1, #soundTable do
soundTable[i]:stop()
end
scene.buttonTimeout = 100 scene.buttonTimeout = 100
Noble.Input.setHandler(scene.inputHandler) Noble.Input.setHandler(scene.inputHandler)

View File

@ -10,16 +10,7 @@ scene.inputHandler = {
return return
end end
scene.menuConfirmSound:play(1) scene.menuConfirmSound:play(1)
mode = Drones[scene.menuIndex].mode Noble.transition(Assemble)
local soundTable = playdate.sound.playingSources()
for i=1, #soundTable do
soundTable[i]:stop()
end
if mode == Modes.bomber then
Noble.transition(BomberScene)
else
Noble.transition(Assemble)
end
end, end,
BButtonDown = function() BButtonDown = function()
scene.menuBackSound:play(1) scene.menuBackSound:play(1)

View File

@ -55,7 +55,7 @@ function scene:update()
local x = 0 local x = 0
for i = 1, #scene.cards do for i = 1, #scene.cards do
x = 400 * (i - 1) x = 0 + (339 + 16) * (i - 1)
scene.cards[i]:moveTo(x + scene.currentX, 0) scene.cards[i]:moveTo(x + scene.currentX, 0)
end end
@ -107,7 +107,7 @@ scene.inputHandler = {
return return
end end
scene.menuSelSound:play(1) scene.menuSelSound:play(1)
scene.targetX = scene.targetX + 400 scene.targetX = scene.targetX + 355
scene.menuIndex = scene.menuIndex - 1 scene.menuIndex = scene.menuIndex - 1
end, end,
rightButtonDown = function() rightButtonDown = function()
@ -115,7 +115,7 @@ scene.inputHandler = {
return return
end end
scene.menuSelSound:play(1) scene.menuSelSound:play(1)
scene.targetX = scene.targetX - 400 scene.targetX = scene.targetX - 355
scene.menuIndex = scene.menuIndex + 1 scene.menuIndex = scene.menuIndex + 1
end, end,
upButtonDown = function() upButtonDown = function()

View File

@ -24,10 +24,6 @@ function scene:setValues()
end end
function scene:init() function scene:init()
local soundTable = playdate.sound.playingSources()
for i=1, #soundTable do
soundTable[i]:stop()
end
scene.super.init(self) scene.super.init(self)
local menuSelSound = playdate.sound.fileplayer.new("assets/audio/menu_select") local menuSelSound = playdate.sound.fileplayer.new("assets/audio/menu_select")

View File

@ -1,113 +0,0 @@
BomberScene = {}
class("BomberScene").extends(BaseScene)
local scene = BomberScene
local font = Graphics.font.new('assets/fonts/Mini Sans 2X')
function scene:init()
scene.super.init(self)
self.bg = Graphics.image.new("assets/sprites/bg2")
self.bgY = 0
self.scrollSpeed = 0.6
scene.progressBar = ProgressBar(50, 210, 50, 5)
scene.progressBar:set(0)
scene.progressBar:setVisible(false)
scene.grenadeCooldown = false
scene.grenadeCooldownTimer = nil
scene.grenadeCooldownDuration = 100
scene.progressBarMax = 100
scene.availableGrenades = 8
BomberScene.instance = self
end
function scene:drawBackground()
self.bgY = self.bgY + self.scrollSpeed
if self.bgY >= 720 then
self.bgY = 0
end
self.bg:draw(0, self.bgY - 720)
self.bg:draw(0, self.bgY)
end
scene.inputHandler = {
upButtonHold = function()
scene.crosshair:moveUp()
end,
downButtonHold = function()
scene.crosshair:moveDown()
end,
leftButtonHold = function()
scene.crosshair:moveLeft()
end,
rightButtonHold = function()
scene.crosshair:moveRight()
end,
AButtonDown = function()
if scene.availableGrenades <= 0 then
return
end
print("AButtonDown")
if not scene.grenadeCooldown then
Granade(scene.crosshair.x, scene.crosshair.y)
scene.grenadeCooldown = true
scene.progressBar:set(0)
scene.progressBar:setVisible(true)
scene.availableGrenades = scene.availableGrenades - 1
scene.grenadeCooldownTimer = playdate.timer.new(scene.grenadeCooldownDuration, function()
scene.grenadeCooldown = false
scene.progressBar:setVisible(false)
end)
scene.grenadeCooldownTimer.updateCallback = function(timer)
local percentage = (scene.grenadeCooldownDuration - timer.timeLeft) / scene.grenadeCooldownDuration * scene.progressBarMax
scene.progressBar:set(percentage)
end
end
end
}
function scene:enter()
scene.super.enter(self)
Noble.Input.setHandler(scene.inputHandler)
scene.crosshair = MovableCrosshair(100, 100)
end
function scene:start()
scene.super.start(self)
self.optionsMenu:addMenuItem("Main Menu", function() Noble.transition(Menu) end)
Noble.showFPS = true
end
function scene:update()
scene.super.update(self)
Noble.Text.draw(scene.availableGrenades .. "x", 10, 210, Noble.Text.ALIGN_LEFT, false, font)
if scene.availableGrenades <= 0 then
Noble.Text.draw("No grenades left", 200, 110, Noble.Text.ALIGN_CENTER, false, font)
scene.crosshair:setVisible(false)
end
if playdate.isCrankDocked() then
Noble.Text.draw("Crank it to reload!", 200, 110, Noble.Text.ALIGN_CENTER, false, font)
playdate.ui.crankIndicator:draw()
end
end
-- TODO: to reset grenades spin crank
-- TODO: random spawn of enemies
-- TODO: random spawn some decorations
-- TODO: add some music
-- TODO: add some sound effects
-- TODO: add clouds or smoke
-- TODO: random disactivate granades

View File

@ -1,28 +0,0 @@
SmallBoom = {}
class("SmallBoom").extends(AnimatedSprite)
local smallBoomImageTable = Graphics.imagetable.new("assets/sprites/smallboom")
function SmallBoom:init()
SmallBoom.super.init(self, smallBoomImageTable)
-- Animation properties
self:addState("play", 1, 3, { tickStep = 1, loop = 2 })
self:setDefaultState("play")
self:playAnimation()
self:setCenter(0, 0)
self:setSize(playdate.display.getSize())
self:setZIndex(ZIndex.flash)
self:moveTo(0, 0)
self:add()
end
function SmallBoom:update()
self:updateAnimation()
end
function SmallBoom:stopAnimation()
self:remove()
end

View File

@ -1,20 +0,0 @@
ExplosionMark = {}
class('ExplosionMark').extends(NobleSprite)
function ExplosionMark:init(x, y)
ExplosionMark.super.init(self)
self.id = math.random(1, 2)
self.markImage = Graphics.image.new("assets/sprites/boomSplash" .. self.id) -- TODO: make it random
self:setImage(self.markImage)
self:moveTo(x, y)
self:setZIndex(5)
self:add(x, y)
end
function ExplosionMark:update()
self:moveBy(0, BomberScene.instance.scrollSpeed)
if self.y > 240 + 32 then
self:remove()
end
end

View File

@ -1,91 +0,0 @@
Granade = {}
class('Granade').extends(NobleSprite)
local function screenShake(shakeTime, shakeMagnitude)
local shakeTimer = playdate.timer.new(shakeTime, shakeMagnitude, 0)
shakeTimer.updateCallback = function(timer)
local magnitude = math.floor(timer.value)
local shakeX = math.random(-magnitude, magnitude)
local shakeY = math.random(-magnitude, magnitude)
playdate.display.setOffset(shakeX, shakeY)
end
shakeTimer.timerEndedCallback = function()
playdate.display.setOffset(0, 0)
end
end
function Granade:init(x, y)
Granade.super.init(self)
self.initialRadius = 10
self.currentRadius = self.initialRadius
self.shrinkRate = 0.2
random = math.random(1, 4)
self.boomSound = playdate.sound.fileplayer.new("assets/audio/boom" .. random)
self.boomSound:setVolume(0.5)
self.isActive = true
-- Variables for random movement
self.randomMovementTimer = 0
self.randomXVelocity = 0
self.randomYVelocity = 0
local size = self.initialRadius * 2
self.spriteSize = size
self:setSize(size, size)
self:moveTo(x, y)
self:setCenter(0.5, 0.5)
print("Granade init")
print(self.x, self.y)
self:add(x, y)
self:markDirty()
end
function Granade:update()
if self.isActive then
if BomberScene.instance then
self:moveBy(0, BomberScene.instance.scrollSpeed - 0.2)
self.randomMovementTimer = self.randomMovementTimer + 1
if self.randomMovementTimer >= 10 then
self.randomMovementTimer = 0
self.randomXVelocity = math.random(-50, 50) / 100
self.randomYVelocity = math.random(-5, 10) / 100
end
self:moveBy(self.randomXVelocity, self.randomYVelocity)
end
self.currentRadius = self.currentRadius - self.shrinkRate
if self.currentRadius <= 0 then
print("Granade deactivated")
self.isActive = false
local particleB = ParticlePoly(self.x, self.y)
particleB:setThickness(1)
particleB:setAngular(-5, 5122)
particleB:setSize(1, 2)
particleB:setSpeed(1, 20)
particleB:setMode(Particles.modes.STAY)
particleB:setBounds(0, 0, 400, 240)
particleB:setColour(Graphics.kColorXOR)
particleB:add(20)
self.boomSound:play(1)
screenShake(1000, 5)
SmallBoom()
ExplosionMark(self.x, self.y)
self:remove()
end
end
self:markDirty()
end
function Granade:draw()
local centerX = self.spriteSize / 2
local centerY = self.spriteSize / 2
playdate.graphics.fillCircleAtPoint(centerX, centerY, self.currentRadius)
end

View File

@ -1,89 +0,0 @@
MovableCrosshair = {}
class('MovableCrosshair').extends(playdate.graphics.sprite)
function MovableCrosshair:init()
MovableCrosshair.super.init(self)
-- Parameters for crosshair
self.lineLength = 10
self.gapSize = 3
-- Parameters for movement
self.baseX = 200
self.baseY = 150
self.moveRadius = 2
self.moveSpeed = 2
self.time = 0
-- Calculate size based on crosshair dimensions
local totalSize = (self.lineLength + self.gapSize) * 2 + 10
self:setSize(totalSize, totalSize)
-- Set the drawing offset to middle of sprite
self.drawOffsetX = totalSize / 2
self.drawOffsetY = totalSize / 2
self:add(self.baseX, self.baseY)
self:setCenter(0.5, 0.5)
self:markDirty()
end
function MovableCrosshair:update()
MovableCrosshair.super.update(self)
self.time = self.time + playdate.display.getRefreshRate() / 1000
local offsetX = math.sin(self.time) * self.moveRadius
local offsetY = math.cos(self.time * 1.3) * self.moveRadius
self:moveTo(self.baseX + offsetX, self.baseY + offsetY)
self:markDirty()
end
function MovableCrosshair:draw()
local centerX = self.drawOffsetX
local centerY = self.drawOffsetY
playdate.graphics.drawLine(
centerX - self.lineLength - self.gapSize, centerY,
centerX - self.gapSize, centerY
)
playdate.graphics.drawLine(
centerX + self.gapSize, centerY,
centerX + self.lineLength + self.gapSize, centerY
)
playdate.graphics.drawLine(
centerX, centerY - self.lineLength - self.gapSize,
centerX, centerY - self.gapSize
)
playdate.graphics.drawLine(
centerX, centerY + self.gapSize,
centerX, centerY + self.lineLength + self.gapSize
)
end
function MovableCrosshair:moveUp()
if self.baseY > 5 then
self.baseY = self.baseY - 1
end
end
function MovableCrosshair:moveDown()
if self.baseY < 235 then
self.baseY = self.baseY + 1
end
end
function MovableCrosshair:moveLeft()
if self.baseX > 5 then
self.baseX = self.baseX - 1
end
end
function MovableCrosshair:moveRight()
if self.baseX < 395 then
self.baseX = self.baseX + 1
end
end

View File

@ -192,9 +192,9 @@ function Player:handleMovementAndCollisions()
self:boom() self:boom()
return return
elseif collisionTag == 154 then -- Baleba elseif collisionTag == 154 then -- Baleba
-- if self.debug then TODO: why debug always true? if self.debug then
-- return return
-- end end
self:boom(collisionObject) self:boom(collisionObject)
return return
elseif collisionTag == 2 then -- Tank elseif collisionTag == 2 then -- Tank