- Mask functionality
- Rehandled Animations (now consistent)
This commit is contained in:
lustlion 2021-10-29 04:15:53 +02:00
parent 189579d619
commit 8607399d16
11 changed files with 144 additions and 174 deletions

View File

@ -7,6 +7,7 @@ require "data/scripts/in_out"
json = require "data/scripts/json" json = require "data/scripts/json"
-- classes -- classes
require "data/scripts/entity" require "data/scripts/entity"
require "data/scripts/animation"
require "data/scripts/collision" require "data/scripts/collision"
require "data/scripts/level" require "data/scripts/level"
-- data -- data

View File

@ -1,54 +1,39 @@
function Animation:Draw() Animation = {}
if self.sprite ~= nil then
local relative_position_x = self.pos.x - Camera.pos.x function Animation:New(anim_data)
local relative_position_y = self.pos.y - Camera.pos.y local o = {}
local origin_compensation_x = - ( (self.sprite_offset.x) * math.cos(self.sprite_rotation) - (self.sprite_offset.y) * math.sin(self.sprite_rotation)) o.path = anim_data.path
local origin_compensation_y = - ( (self.sprite_offset.x) * math.sin(self.sprite_rotation) + (self.sprite_offset.y) * math.cos(self.sprite_rotation)) o.frames = anim_data.frames
local dimensions_x = self.sprite_scale.x * self.sprite_flip.x o.speed = anim_data.speed
local dimensions_y = self.sprite_scale.y * self.sprite_flip.y o.imgs = anim_data.imgs
love.graphics.draw( o.subframe = 0
self.sprite, o.frame = 1
relative_position_x + origin_compensation_x * dimensions_x,
relative_position_y + origin_compensation_y * dimensions_y, setmetatable(o, self)
self.sprite_rotation, self.__index = self
self.sprite_scale.x * self.sprite_flip.x, return o
self.sprite_scale.y * self.sprite_flip.y end
)
if debug_collision then function Animation:ChangeTo(anim_data)
love.graphics.setColor(1, 0, 0) if anim_data.path == self.path
love.graphics.circle( "line", relative_position_x, relative_position_y, 2 ) then
love.graphics.setColor(0, 1 ,0) return self
love.graphics.circle( "line", else
relative_position_x + origin_compensation_x * dimensions_x, return Animation:New(anim_data)
relative_position_y + origin_compensation_y * dimensions_y,
2
)
end
love.graphics.setColor(1, 1 ,1)
end end
end end
function Animation:New(anim,frames,speed) -- to manually handle what frame
local anim_data = { function Animation:DrawFrame(frame, x, y, rotate, sx, sy)
frame = 1, if frame > self.frames then
subframe = 1, frame = self.frames
path = anim.path, end
frames = anim.frames,
speed = anim.speed,
imgs = anim.imgs
}
self.animations[#self.animations+1] = anim_data
return self.animations[#self.animations]
end
function DrawAnimationFrame(animation, frame, x, y, rotate, sx, sy)
local x = x or 0 local x = x or 0
local y = y or 0 local y = y or 0
local sx = sx or 1 local sx = sx or 1
local sy = sy or 1 local sy = sy or 1
love.graphics.draw( love.graphics.draw(
animation.imgs[frame], self.imgs[frame],
x - Camera.pos.x, x - Camera.pos.x,
y - Camera.pos.y, y - Camera.pos.y,
rotate, rotate,
@ -57,71 +42,34 @@ function DrawAnimationFrame(animation, frame, x, y, rotate, sx, sy)
) )
end end
function DrawAnimation(animation, x, y, rotate, sx, sy) -- to linearly animate
function Animation:Animate()
-- try to animate
self.subframe = self.subframe + current_dt
if self.subframe > self.speed then
self.frame = self.frame + 1
self.subframe = self.subframe - self.speed
end
-- cycle
if self.frame >= self.frames+1 then
self.frame = self.frame - self.frames
end
end
-- to draw the current frame
function Animation:Draw(x, y, rotate, sx, sy)
local x = x or 0 local x = x or 0
local y = y or 0 local y = y or 0
local sx = sx or 1 local sx = sx or 1
local sy = sy or 1 local sy = sy or 1
if game_paused ~= true then love.graphics.draw(
-- try to animate self.imgs[self.frame],
animation.subframe = animation.subframe + current_dt x,
y,
if animation.subframe >= animation.speed then rotate,
animation.frame = animation.frame + 1 sx,
animation.subframe = animation.subframe - animation.speed sy
end )
-- cycle
if animation.frame >= animation.frames+1 then
animation.frame = animation.frame - animation.frames
end
end
love.graphics.draw(
animation.imgs[animation.frame],
x - Camera.pos.x,
y - Camera.pos.y,
rotate,
sx,
sy
)
end end
function Entity:Animate()
if game_paused ~= true and self.anim.path ~= nil then
-- try to animate
self.anim.subframe = self.anim.subframe + current_dt
if self.anim.subframe >= self.anim.speed then
self.anim.frame = self.anim.frame + 1
self.anim.subframe = self.anim.subframe - self.anim.speed
end
-- cycle
if self.anim.frame >= self.anim.frames+1 then
self.anim.frame = self.anim.frame - self.anim.frames
end
-- change
self.sprite = self.anim.imgs[self.anim.frame]
end
end
function Entity:LoadAnimation(anim,frames,speed)
if self.anim.path ~= anim and self.anim.path ~= anim.path then
if frames ~= nil and speed ~= nil then
self.anim.path = anim or nil
self.anim.frames = frames or 4
self.anim.speed = speed or frames
else
self.anim.path = anim.path
self.anim.frames = anim.frames
self.anim.speed = anim.speed
end
self.anim.imgs = anim.imgs
end
end
require "data/scripts/entities/kupo"
require "data/scripts/entities/arrow"
require "data/scripts/entities/player"

View File

@ -1,11 +1,11 @@
function DebugUI() function DebugUI()
for _, light in pairs(Lights) do for _, light in pairs(Lights) do
love.graphics.print(light.pos.x,light.pos.x,light.pos.y) love.graphics.print(light.pos.x,light.pos.x,light.pos.y)
love.graphics.print(light.pos.y,light.pos.x,light.pos.y+20) love.graphics.print(light.pos.y,light.pos.x,light.pos.y+20)
love.graphics.print(light.pos.x,light.pos.x,light.pos.y+40) love.graphics.print(light.pos.x,light.pos.x,light.pos.y+40)
end end
love.graphics.print("time: "..fps_total..", fps: "..fps_draw..", frametime: "..math.floor(current_dt* 1000).."ms", 10*textScale, 0*textScale, 0, textScale) love.graphics.print("time: "..fps_total..", fps: "..fps_draw..", frametime: "..math.floor(current_dt* 1000).."ms", 10*textScale, 0*textScale, 0, textScale)
love.graphics.setColor(1,1,1) love.graphics.setColor(1,1,1)
@ -14,8 +14,7 @@ love.graphics.print("time: "..fps_total..", fps: "..fps_draw..", frametime: "..m
love.graphics.print("position: {"..main_Player.pos.x..", "..main_Player.pos.y.."}",10*textScale,60*textScale, 0, textScale) love.graphics.print("position: {"..main_Player.pos.x..", "..main_Player.pos.y.."}",10*textScale,60*textScale, 0, textScale)
love.graphics.print("velocity: {"..main_Player.vel.x..", "..main_Player.vel.y.."}",10*textScale,80*textScale, 0, textScale) love.graphics.print("velocity: {"..main_Player.vel.x..", "..main_Player.vel.y.."}",10*textScale,80*textScale, 0, textScale)
love.graphics.print("scale: {"..main_Player.sprite_scale.x..", "..main_Player.sprite_scale.y.."}",10*textScale,100*textScale, 0, textScale) love.graphics.print("scale: {"..main_Player.sprite_scale.x..", "..main_Player.sprite_scale.y.."}",10*textScale,100*textScale, 0, textScale)
love.graphics.print("anim: "..tostring(main_Player.anim.path)..", anim.speed: "..main_Player.anim.speed,10*textScale,120*textScale, 0, textScale) love.graphics.print("states: \"isOnGround\": "..tostring(main_Player.isOnGround),10*textScale,120*textScale, 0, textScale)
love.graphics.print("states: \"isOnGround\": "..tostring(main_Player.isOnGround),10*textScale,140*textScale, 0, textScale)
love.graphics.print("[Camera]",10*textScale,160*textScale, 0, textScale) love.graphics.print("[Camera]",10*textScale,160*textScale, 0, textScale)
love.graphics.print("position: {"..Camera.pos.x..", "..Camera.pos.y.."}",10*textScale,180*textScale, 0, textScale) love.graphics.print("position: {"..Camera.pos.x..", "..Camera.pos.y.."}",10*textScale,180*textScale, 0, textScale)

View File

@ -13,7 +13,10 @@ Arrow = Entity:New(x,y)
o.sprite_offset = {x = 13, y = 1} o.sprite_offset = {x = 13, y = 1}
o.stuck = false o.stuck = false
o.illuminated = true o.illuminated = true
-- animations
o.body = Animation:New(animation.kupo.arrow)
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
table.insert(LoadedEntities,o) table.insert(LoadedEntities,o)
@ -25,7 +28,13 @@ function Arrow:Smart()
end end
function Arrow:HandleAnimation() function Arrow:HandleAnimation()
self:LoadAnimation(animation.kupo.arrow) self.body:Draw(
self.pos.x - Camera.pos.x - ( (self.sprite_offset.x) * math.cos(self.sprite_rotation) - (self.sprite_offset.y) * math.sin(self.sprite_rotation)) * self.sprite_scale.x * self.sprite_flip.x,
self.pos.y - Camera.pos.y - ( (self.sprite_offset.x) * math.sin(self.sprite_rotation) + (self.sprite_offset.y) * math.cos(self.sprite_rotation)) * self.sprite_scale.y * self.sprite_flip.y,
self.sprite_rotation,
self.sprite_scale.x * self.sprite_flip.x,
self.sprite_scale.y * self.sprite_flip.y
)
end end
function Arrow:DoPhysics() function Arrow:DoPhysics()

View File

@ -8,8 +8,12 @@ Kupo = Entity:New(x,y)
o.range = 200 o.range = 200
o.target = {x = x, y = y} o.target = {x = x, y = y}
o.sprite_offset = {x = 8, y = 5} o.sprite_offset = {x = 8, y = 5}
-- kupo bow
o.bow = self:NewAnimation(animation.kupo.bow) -- animations
o.body = Animation:New(animation.kupo.body)
o.bow = Animation:New(animation.kupo.bow)
-- bow
o.bow_flip = 1 o.bow_flip = 1
o.bow_rotation = 0 o.bow_rotation = 0
o.bow_frame = 1 o.bow_frame = 1
@ -19,7 +23,7 @@ Kupo = Entity:New(x,y)
o.bow_frames = 6 o.bow_frames = 6
o.bow_extraframes = 18 o.bow_extraframes = 18
o.bow_aim_frames = 8 o.bow_aim_frames = 8
o.hostile = false o.hostile = true
o.lightRange = o.range/10 o.lightRange = o.range/10
o.light = CreateLight(o.pos.x,o.pos.y,o.lightRange) o.light = CreateLight(o.pos.x,o.pos.y,o.lightRange)
@ -131,29 +135,24 @@ end
function Kupo:HandleAnimation() function Kupo:HandleAnimation()
-- flip sprite to look in the direction is moving -- flip sprite to look in the direction is moving
if self.vel.x ~= 0 then self.sprite_flip.x = math.sign(self.vel.x) end if self.vel.x ~= 0 then self.sprite_flip.x = math.sign(self.vel.x) end
self:LoadAnimation(animation.kupo.body)
self.body:Animate()
self.body:Draw(
self.pos.x - Camera.pos.x - ( (self.sprite_offset.x) * math.cos(self.sprite_rotation) - (self.sprite_offset.y) * math.sin(self.sprite_rotation)) * self.sprite_scale.x * self.sprite_flip.x,
self.pos.y - Camera.pos.y - ( (self.sprite_offset.x) * math.sin(self.sprite_rotation) + (self.sprite_offset.y) * math.cos(self.sprite_rotation)) * self.sprite_scale.y * self.sprite_flip.y,
self.sprite_rotation,
self.sprite_scale.x * self.sprite_flip.x,
self.sprite_scale.y * self.sprite_flip.y
)
if self.draw_bow == true then if self.draw_bow == true then
DrawAnimationFrame( self.bow:DrawFrame(
self.bow,
math.min(self.bow_frame,self.bow_frames), math.min(self.bow_frame,self.bow_frames),
self.pos.x + ( 8 * math.sin(self.bow_rotation)), self.pos.x + ( 8 * math.sin(self.bow_rotation)),
self.pos.y + (2 - 6 * math.cos(self.bow_rotation)), self.pos.y + (2 - 6 * math.cos(self.bow_rotation)),
self.bow_rotation self.bow_rotation
) )
end end
if debug_collision then
love.graphics.setColor(1,0,0)
love.graphics.line(
self.pos.x - Camera.pos.x,
self.pos.y - Camera.pos.y,
self.target.x - Camera.pos.x,
self.target.y - Camera.pos.y
)
love.graphics.circle( "line", self.pos.x - Camera.pos.x, self.pos.y - Camera.pos.y, self.range )
love.graphics.setColor(1,1,1)
love.graphics.print(self.bow_rotation, self.pos.x, self.pos.y+30)
love.graphics.print(self.angle, self.pos.x, self.pos.y+50)
end
end end
function Kupo:DoPhysics() function Kupo:DoPhysics()

View File

@ -13,7 +13,7 @@
} }
-- constants -- constants
o.acc = 45 o.acc = 45
o.friction = 20 o.friction = 20
o.gravity = 9.81 o.gravity = 9.81
o.climbHeight = 4 o.climbHeight = 4
@ -31,11 +31,12 @@
o.canJump = true o.canJump = true
o.canFall = true o.canFall = true
o.canFriction = true o.canFriction = true
o.mask_type = animation.moth_mask
-- sprite -- sprite
o.sprite_offset = {x = 8, y = 16} o.sprite_offset = {x = 8, y = 16}
o.target_offset = {x = 0, y = 12} o.target_offset = {x = 0, y = 12}
o.body = Animation:New(animation.nancy.idle)
o.mask = Animation:New(animation.moth_mask.idle)
-- lights -- lights
@ -85,27 +86,53 @@ function Player:Smart()
end end
function Player:HandleAnimation() function Player:HandleAnimation()
-- flip sprite to look in the direction is moving -- flip sprite to look in the direction is moving
if self.vel.x ~= 0 then self.sprite_flip.x = math.sign(self.vel.x) end if self.vel.x ~= 0 then self.sprite_flip.x = math.sign(self.vel.x) end
-- animation manager -- animation manager
if self.isOnLadder then if self.isOnLadder then
self:LoadAnimation(animation.nancy.jump) self.body = self.body:ChangeTo(animation.nancy.jump)
self.mask = self.mask:ChangeTo(self.mask_type.jump)
elseif self.isOnGround == 0 and self.isJumping and self.vel.y > 1.25 then elseif self.isOnGround == 0 and self.isJumping and self.vel.y > 1.25 then
self:LoadAnimation(animation.nancy.fall) self.body = self.body:ChangeTo(animation.nancy.fall)
self.mask = self.mask:ChangeTo(self.mask_type.fall)
elseif self.isOnGround == 0 and self.vel.y < 0 then elseif self.isOnGround == 0 and self.vel.y < 0 then
self:LoadAnimation(animation.nancy.jump) self.body = self.body:ChangeTo(animation.nancy.jump)
self.mask = self.mask:ChangeTo(self.mask_type.jump)
elseif self.vel.x ~= 0 then elseif self.vel.x ~= 0 then
self:LoadAnimation(animation.nancy.run) self.body = self.body:ChangeTo(animation.nancy.run)
self.mask = self.mask:ChangeTo(self.mask_type.run)
else else
self:LoadAnimation(animation.nancy.idle) self.body = self.body:ChangeTo(animation.nancy.idle)
self.mask = self.mask:ChangeTo(self.mask_type.idle)
end end
-- special case: idle animation gets slower by time -- special case: idle animation gets slower by time
if self.anim_path == animation.nancy.idle.path then if self.body.anim_path == animation.nancy.idle.path then
if self.anim_speed < 0.5 then self.anim_speed = self.anim_speed + 0.001 end if self.body.anim_speed < 0.5 then self.body.anim_speed = self.body.anim_speed + 0.001 end
end end
self.body:Animate()
self.body:Draw(
self.pos.x - Camera.pos.x - ( (self.sprite_offset.x) * math.cos(self.sprite_rotation) - (self.sprite_offset.y) * math.sin(self.sprite_rotation)) * self.sprite_scale.x * self.sprite_flip.x,
self.pos.y - Camera.pos.y - ( (self.sprite_offset.x) * math.sin(self.sprite_rotation) + (self.sprite_offset.y) * math.cos(self.sprite_rotation)) * self.sprite_scale.y * self.sprite_flip.y,
self.sprite_rotation,
self.sprite_scale.x * self.sprite_flip.x,
self.sprite_scale.y * self.sprite_flip.y
)
self.mask:Draw(
self.pos.x - Camera.pos.x - ( (self.sprite_offset.x) * math.cos(self.sprite_rotation) - (self.sprite_offset.y) * math.sin(self.sprite_rotation)) * self.sprite_scale.x * self.sprite_flip.x,
self.pos.y - Camera.pos.y - ( (self.sprite_offset.x) * math.sin(self.sprite_rotation) + (self.sprite_offset.y) * math.cos(self.sprite_rotation)) * self.sprite_scale.y * self.sprite_flip.y,
self.sprite_rotation,
self.sprite_scale.x * self.sprite_flip.x,
self.sprite_scale.y * self.sprite_flip.y
)
--[[
love.graphics.print(self.body.frame .. "/".. self.body.frames.." - "..self.body.subframe.."/"..self.body.speed.." ("..current_dt..")")
love.graphics.print(animation.nancy.idle.path,0,20)
love.graphics.print(self.body.path,0,30)
]]
end end
function Player:DoPhysics() function Player:DoPhysics()

View File

@ -6,11 +6,7 @@ function Entity:New(x,y)
o.pos = {x = x, y = y} o.pos = {x = x, y = y}
o.vel = {x = 0, y = 0} o.vel = {x = 0, y = 0}
o.class = "Entity" o.class = "Entity"
o.anim = {}
o.anim.subframe = 0
o.anim.frame = 1
o.anim.imgs = {}
o.animations = {}
o.sprite_offset = {x = 0, y = 0} o.sprite_offset = {x = 0, y = 0}
o.sprite_scale = {x = 1, y = 1} o.sprite_scale = {x = 1, y = 1}
o.sprite_rotation = math.rad(0) o.sprite_rotation = math.rad(0)
@ -25,7 +21,7 @@ function Entity:Move(target, speed) -- target = {tx int, ty int} / speed = int
end end
function Entity:Draw() --[[function Entity:Draw()
if self.sprite ~= nil then if self.sprite ~= nil then
local relative_position_x = self.pos.x - Camera.pos.x local relative_position_x = self.pos.x - Camera.pos.x
local relative_position_y = self.pos.y - Camera.pos.y local relative_position_y = self.pos.y - Camera.pos.y
@ -148,6 +144,7 @@ function Entity:LoadAnimation(anim,frames,speed)
self.anim.imgs = anim.imgs self.anim.imgs = anim.imgs
end end
end end
]]--
require "data/scripts/entities/kupo" require "data/scripts/entities/kupo"
require "data/scripts/entities/arrow" require "data/scripts/entities/arrow"

View File

@ -17,7 +17,7 @@ animation = {
speed = 1 speed = 1
} }
}, },
nancy_moth_mask = { moth_mask = {
idle = { idle = {
path = "assets/characters/nancy/moth_mask/idle", path = "assets/characters/nancy/moth_mask/idle",
frames = 4, frames = 4,

View File

@ -52,9 +52,6 @@ function DoLights()
)]] )]]
end end
for _, enty in pairs(LoadedEntities) do for _, enty in pairs(LoadedEntities) do
if enty.illuminated == true then
enty:Draw()
end
end end
love.graphics.setColor(0,0,0,0.5) love.graphics.setColor(0,0,0,0.5)
for _, light in pairs(Lights) do for _, light in pairs(Lights) do

View File

@ -35,7 +35,6 @@ function love.load()
table.insert(LoadedEntities,Kupo:New(700,150)) table.insert(LoadedEntities,Kupo:New(700,150))
table.insert(LoadedEntities,Kupo:New(800,150)) table.insert(LoadedEntities,Kupo:New(800,150))
main_Player.sprite = love.graphics.newImage("assets/characters/nancy/idle1.png") main_Player.sprite = love.graphics.newImage("assets/characters/nancy/idle1.png")
main_Player:LoadAnimation(animation.nancy.idle)
end end
function love.update(dt) function love.update(dt)
@ -123,8 +122,6 @@ function love.draw()
LevelDisplayBackground() LevelDisplayBackground()
for _, enty in pairs(LoadedEntities) do for _, enty in pairs(LoadedEntities) do
enty:HandleAnimation() enty:HandleAnimation()
enty:Animate()
enty:Draw()
end end
LevelDisplayForeground() LevelDisplayForeground()
@ -140,7 +137,7 @@ function love.draw()
love.graphics.setColor(1,1,1,1) love.graphics.setColor(1,1,1,1)
love.graphics.setCanvas() love.graphics.setCanvas()
love.graphics.scale(1,1) love.graphics.scale(1,1)
DrawDarkness() --DrawDarkness()
-- HUD -- HUD
-- Scale control -- Scale control
textScale = 0.5 textScale = 0.5

View File

@ -1,15 +1,11 @@
MAKE LIGHTING SYSTEM (x) MAKE LIGHTING SYSTEM
Updates: (X) REHANDLE ANIMATIONS
LOVE HAS CANVASES!!! (X) 3 COLOR PALETTE (GOLD)
(X) MASKS FUNCTIONALITY
MAKE ARROW CANVAS SO THAT ARROWS WHEN STUCK CAN BE STORED AS IMAGE AND ARE NOT LAGGY!!! ( ) MAKE ARROW CANVAS SO THAT ARROWS WHEN STUCK CAN BE STORED AS IMAGE AND ARE NOT LAGGY!!!
( ) DO GODS
DRAW GIANT ANIMALS AS POWER SOURCE ( ) DO DAMAGE TO PLAYER
( ) DO FAIRY
DO FAIRY ( ) DO FLIES
( ) DO UI
DO FLIES ( ) MAKE PHYSICS CONSISTENT
DO DAMAGE TO PLAYER
DO UI