parent
0b126919ac
commit
4fc37b133e
23
src/ecs.lua
23
src/ecs.lua
|
@ -61,20 +61,21 @@ end
|
|||
---@param wShape W?
|
||||
---@return fun(callback: fun(componentT: T, componentU: U, componentV: V, componentW: W))
|
||||
function ecs.entitiesHavingShapes(tShape, uShape, vShape, wShape)
|
||||
return function()
|
||||
end
|
||||
return function() end
|
||||
end
|
||||
|
||||
-- Print contents of `tbl`, with indentation.
|
||||
-- `indent` sets the initial level of indentation.
|
||||
function tprint(tbl, indent)
|
||||
if not indent then indent = 0 end
|
||||
if not indent then
|
||||
indent = 0
|
||||
end
|
||||
for k, v in pairs(tbl) do
|
||||
formatting = string.rep(" ", indent) .. k .. ": "
|
||||
if type(v) == "table" then
|
||||
print(formatting)
|
||||
tprint(v, indent + 1)
|
||||
elseif type(v) == 'boolean' then
|
||||
elseif type(v) == "boolean" then
|
||||
print(formatting .. tostring(v))
|
||||
else
|
||||
print(formatting .. v)
|
||||
|
@ -87,7 +88,7 @@ function addSystem(callback, keys, shapes)
|
|||
callback = callback,
|
||||
keys = keys,
|
||||
shapes = shapes,
|
||||
entityCache = nil
|
||||
entityCache = nil,
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -109,7 +110,15 @@ function ecs.update(deltaSeconds)
|
|||
end
|
||||
local keys = system.keys
|
||||
for entity, _ in pairs(system.entityCache) do
|
||||
system.callback(deltaSeconds, entity, entity[keys[1]], entity[keys[2]], entity[keys[3]], entity[keys[4]], entity)
|
||||
system.callback(
|
||||
deltaSeconds,
|
||||
entity,
|
||||
entity[keys[1]],
|
||||
entity[keys[2]],
|
||||
entity[keys[3]],
|
||||
entity[keys[4]],
|
||||
entity
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -205,7 +214,7 @@ ecs.forEntitiesWith(Target, function (delta, e, pos, vel)
|
|||
pos.y = pos.y + (delta * vel.y)
|
||||
print("position")
|
||||
tprint(pos, 1)
|
||||
ecs.set(e, Target, 'hallo')
|
||||
ecs.set(e, Target, "hallo")
|
||||
end)
|
||||
|
||||
ecs.update(1)
|
46
src/main.lua
46
src/main.lua
|
@ -1,3 +1,4 @@
|
|||
-- stylua: ignore start
|
||||
import 'CoreLibs/animation.lua'
|
||||
import 'CoreLibs/animator.lua'
|
||||
import 'CoreLibs/easing.lua'
|
||||
|
@ -7,6 +8,7 @@ import 'CoreLibs/ui.lua'
|
|||
|
||||
import 'graphics.lua'
|
||||
import 'utils.lua'
|
||||
-- stylua: ignore end
|
||||
|
||||
--- @alias XYPair { x: number, y: number }
|
||||
|
||||
|
@ -20,7 +22,7 @@ local gfx = playdate.graphics
|
|||
|
||||
local SCREEN = {
|
||||
W = playdate.display.getWidth(),
|
||||
H = playdate.display.getHeight()
|
||||
H = playdate.display.getHeight(),
|
||||
}
|
||||
|
||||
local CENTER = xy(SCREEN.W / 2, SCREEN.H / 2)
|
||||
|
@ -29,11 +31,7 @@ local batCrackSound = playdate.sound.sampleplayer.new("sounds/bat-crack-reverb.w
|
|||
local grassBackground = gfx.image.new("images/game/grass.png") --[[@as PlaydateGraphicsImage]]
|
||||
local playerFrown = gfx.image.new("images/game/player-frown.png") --[[@as PlaydateGraphicsImage]]
|
||||
|
||||
local playerImageBlipper = blipper.new(
|
||||
100,
|
||||
"images/game/player.png",
|
||||
"images/game/player-lowhat.png"
|
||||
)
|
||||
local playerImageBlipper = blipper.new(100, "images/game/player.png", "images/game/player-lowhat.png")
|
||||
|
||||
local BALL_OFFSCREEN = 999
|
||||
|
||||
|
@ -56,14 +54,14 @@ local TAG_DISTANCE = 20
|
|||
local ball = {
|
||||
x = CENTER.x,
|
||||
y = BALL_OFFSCREEN,
|
||||
size = 6
|
||||
size = 6,
|
||||
}
|
||||
|
||||
local BAT_LENGTH = 45
|
||||
|
||||
local MODES = {
|
||||
batting = {},
|
||||
running = {}
|
||||
running = {},
|
||||
}
|
||||
|
||||
local currentMode = MODES.batting
|
||||
|
@ -87,19 +85,19 @@ local bases = {
|
|||
xy(SCREEN.W * 0.93, SCREEN.H * 0.52),
|
||||
xy(SCREEN.W * 0.47, SCREEN.H * 0.19),
|
||||
xy(SCREEN.W * 0.03, SCREEN.H * 0.52),
|
||||
xy(SCREEN.W * 0.474, SCREEN.H * 0.79)
|
||||
xy(SCREEN.W * 0.474, SCREEN.H * 0.79),
|
||||
}
|
||||
|
||||
---@type table<Base, Base>
|
||||
local nextBaseMap = {
|
||||
[bases[FIRST]] = bases[SECOND],
|
||||
[bases[SECOND]] = bases[THIRD],
|
||||
[bases[THIRD]] = bases[HOME]
|
||||
[bases[THIRD]] = bases[HOME],
|
||||
}
|
||||
|
||||
function newFielder(speed)
|
||||
return {
|
||||
speed = speed
|
||||
speed = speed,
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -113,12 +111,12 @@ local fielders = {
|
|||
catcher = newFielder(20),
|
||||
left = newFielder(40),
|
||||
center = newFielder(40),
|
||||
right = newFielder(40)
|
||||
right = newFielder(40),
|
||||
}
|
||||
|
||||
local PITCHER_POS = {
|
||||
x = SCREEN.W * 0.48,
|
||||
y = SCREEN.H * 0.40
|
||||
y = SCREEN.H * 0.40,
|
||||
}
|
||||
|
||||
--- Resets the target positions of all fielders to their defaults (at their field positions).
|
||||
|
@ -161,7 +159,7 @@ function newRunner()
|
|||
y = PLAYER_STARTING_Y,
|
||||
nextBase = nil,
|
||||
prevBase = nil,
|
||||
name = runnerNames[nameI]
|
||||
name = runnerNames[nameI],
|
||||
}
|
||||
nameI = nameI + 1
|
||||
runners[#runners + 1] = new
|
||||
|
@ -236,8 +234,7 @@ function isTouchingBall(x, y)
|
|||
return ballDistance < BALL_CATCH_HITBOX
|
||||
end
|
||||
|
||||
function updateForcedTos()
|
||||
end
|
||||
function updateForcedTos() end
|
||||
|
||||
local outs = 0
|
||||
local homeScore = 0
|
||||
|
@ -253,11 +250,9 @@ function outRunner(runnerIndex)
|
|||
end
|
||||
|
||||
function updateFielders()
|
||||
local touchingBaseCache = buildCache(
|
||||
function(runner)
|
||||
local touchingBaseCache = buildCache(function(runner)
|
||||
return isTouchingBase(runner.x, runner.y)
|
||||
end
|
||||
)
|
||||
end)
|
||||
|
||||
for _, fielder in pairs(fielders) do
|
||||
-- TODO: Target unforced runners (or their target bases) for tagging
|
||||
|
@ -431,8 +426,10 @@ function updateBatting()
|
|||
batTip.x = batBase.x + (BAT_LENGTH * math.sin(batAngle))
|
||||
batTip.y = batBase.y + (BAT_LENGTH * math.cos(batAngle))
|
||||
|
||||
if acceleratedChange >= 0 and
|
||||
pointDirectlyUnderLine(ball.x, ball.y, batBase.x, batBase.y, batTip.x, batTip.y, SCREEN.H) then
|
||||
if
|
||||
acceleratedChange >= 0
|
||||
and pointDirectlyUnderLine(ball.x, ball.y, batBase.x, batBase.y, batTip.x, batTip.y, SCREEN.H)
|
||||
then
|
||||
batCrackSound:play()
|
||||
currentMode = MODES.running
|
||||
ballAngle = batAngle + math.rad(90)
|
||||
|
@ -565,10 +562,7 @@ function playdate.update()
|
|||
|
||||
if currentMode == MODES.batting then
|
||||
gfx.setLineWidth(5)
|
||||
gfx.drawLine(
|
||||
batBase.x, batBase.y,
|
||||
batTip.x, batTip.y
|
||||
)
|
||||
gfx.drawLine(batBase.x, batBase.y, batTip.x, batTip.y)
|
||||
end
|
||||
|
||||
if playdate.isCrankDocked() then -- or (crankChange < 2 and currentMode == MODES.running) then
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
-- stylua: ignore start
|
||||
import 'CoreLibs/animation.lua'
|
||||
import 'CoreLibs/graphics.lua'
|
||||
-- stylua: ignore end
|
||||
|
||||
-- number = ((number * 2) - 1)
|
||||
-- return number * number
|
||||
|
@ -21,7 +23,7 @@ end
|
|||
function xy(x, y)
|
||||
return {
|
||||
x = x,
|
||||
y = y
|
||||
y = y,
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -128,7 +130,7 @@ function buildCache(fetcher)
|
|||
end
|
||||
cacheData[key] = fetcher(key) or NO_VALUE
|
||||
return cacheData[key]
|
||||
end
|
||||
end,
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -146,6 +148,6 @@ function blipper.new(msInterval, imagePath1, imagePath2)
|
|||
draw = function(self, disableBlipping, x, y)
|
||||
local currentImage = (disableBlipping or self.blinker.on) and self.image2 or self.image1
|
||||
currentImage:draw(x, y)
|
||||
end
|
||||
end,
|
||||
}
|
||||
end
|
Loading…
Reference in New Issue