95 lines
2.5 KiB
Lua
95 lines
2.5 KiB
Lua
|
|
require 'common.globals'
|
|
|
|
local Display = require 'scripts.graphics.display'
|
|
|
|
local Animation = require 'scripts.graphics.frameanimation'
|
|
|
|
local Animations = {
|
|
Crit = Animation.new('gameplay/hit_animation_frames/critical_taps', {
|
|
centered = true,
|
|
}),
|
|
|
|
Near = Animation.new('gameplay/hit_animation_frames/near_taps', {
|
|
centered = true,
|
|
}),
|
|
};
|
|
|
|
local animationStates = {
|
|
---@type AnimationState[]
|
|
Hold = { },
|
|
---@type AnimationState[]
|
|
Tap = { }
|
|
};
|
|
|
|
local HitFX = { };
|
|
|
|
local LanePositions = {
|
|
1.5 / 6,
|
|
2.5 / 6,
|
|
3.5 / 6,
|
|
4.5 / 6,
|
|
1 / 3,
|
|
2 / 3
|
|
};
|
|
|
|
local function setupLaneTransform(lanePosition, critCenterX, critCenterY)
|
|
local critLine = gameplay.critLine;
|
|
local x = critCenterX + (critLine.line.x2 - critLine.line.x1) * lanePosition;
|
|
local y = critCenterY + (critLine.line.y2 - critLine.line.y1) * lanePosition;
|
|
Display.setUpTransforms(x, y, -critLine.rotation);
|
|
end
|
|
|
|
function HitFX.render(deltaTime, critCenterX, critCenterY, critRotation, cursors)
|
|
local baseHitSize = 325;
|
|
|
|
for i = 1, 6 do
|
|
local hitSize = baseHitSize;
|
|
if (i > 4) then
|
|
hitSize = hitSize * 1.5;
|
|
end
|
|
|
|
local laneWidth = (track.GetCurrentLaneXPos(2) - track.GetCurrentLaneXPos(1)) * (i <= 4 and 1 or 2);
|
|
local lanePosition = track.GetCurrentLaneXPos(i) + laneWidth / 2
|
|
if (i == 5) then
|
|
lanePosition = -track.GetCurrentLaneXPos(6) - laneWidth / 2
|
|
end
|
|
|
|
local holdState = animationStates.Hold[i];
|
|
local tapState = animationStates.Tap[i];
|
|
|
|
local isHeld = gameplay.noteHeld[i];
|
|
if (isHeld) then
|
|
if (holdState) then
|
|
if (not holdState.running) then
|
|
holdState:restart();
|
|
end
|
|
|
|
setupLaneTransform(lanePosition, critCenterX, critCenterY);
|
|
holdState:render(deltaTime);
|
|
gfx.ResetTransform();
|
|
end
|
|
else
|
|
if (holdState and holdState.running) then
|
|
holdState:restart();
|
|
end
|
|
|
|
if (tapState and tapState.running) then
|
|
setupLaneTransform(lanePosition, critCenterX, critCenterY);
|
|
tapState:render(deltaTime, {
|
|
centered = true,
|
|
width = hitSize,
|
|
height = hitSize,
|
|
});
|
|
gfx.ResetTransform();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function HitFX.TriggerAnimation(name, lane)
|
|
animationStates.Tap[lane] = Animations[name]:start();
|
|
end
|
|
|
|
return HitFX;
|