libraries_setup #3
BIN
game/asset/audio/sfx/book_flip.1.ogg
Normal file
BIN
game/asset/audio/sfx/book_flip.10.ogg
Normal file
BIN
game/asset/audio/sfx/book_flip.2.ogg
Normal file
BIN
game/asset/audio/sfx/book_flip.3.ogg
Normal file
BIN
game/asset/audio/sfx/book_flip.4.ogg
Normal file
BIN
game/asset/audio/sfx/book_flip.5.ogg
Normal file
BIN
game/asset/audio/sfx/book_flip.6.ogg
Normal file
BIN
game/asset/audio/sfx/book_flip.7.ogg
Normal file
BIN
game/asset/audio/sfx/book_flip.8.ogg
Normal file
BIN
game/asset/audio/sfx/book_flip.9.ogg
Normal file
BIN
game/asset/image/book/StoryMode.png
Normal file
|
After Width: | Height: | Size: 280 B |
BIN
game/asset/image/book/StoryModeBook.png
Normal file
|
After Width: | Height: | Size: 496 B |
BIN
game/asset/image/book/StoryModeBook11.png
Normal file
|
After Width: | Height: | Size: 557 B |
BIN
game/asset/image/book/StoryModeBook16.png
Normal file
|
After Width: | Height: | Size: 643 B |
BIN
game/asset/image/book/StoryModeBook2.png
Normal file
|
After Width: | Height: | Size: 575 B |
BIN
game/asset/image/book/StoryModeBook3.png
Normal file
|
After Width: | Height: | Size: 639 B |
BIN
game/asset/image/book/StoryModeBook4.png
Normal file
|
After Width: | Height: | Size: 643 B |
BIN
game/asset/image/book/StoryModeBook5.png
Normal file
|
After Width: | Height: | Size: 739 B |
BIN
game/asset/image/book/StoryModeBook6.png
Normal file
|
After Width: | Height: | Size: 719 B |
BIN
game/asset/image/book/StoryModeBook7.png
Normal file
|
After Width: | Height: | Size: 653 B |
BIN
game/asset/image/book/StoryModeBook8.png
Normal file
|
After Width: | Height: | Size: 609 B |
BIN
game/asset/image/book/StoryModeBook9.png
Normal file
|
After Width: | Height: | Size: 557 B |
49
game/src/world/common/component/animation.lua
Normal file
@ -0,0 +1,49 @@
|
||||
local image = require("wrapper.lappy.new.image").obj
|
||||
|
||||
local components = {}
|
||||
|
||||
components.dict = {
|
||||
image_frame = "image_frame",
|
||||
trigger_frame = "trigger_frame",
|
||||
frame_i = "frame_i",
|
||||
run_time = "run_time",
|
||||
anim_direction = "anim_direction",
|
||||
next_trigger_frame = "next_trigger_frame",
|
||||
fps = "fps"
|
||||
}
|
||||
|
||||
function components.image_frame (c, paths)
|
||||
c.data = {
|
||||
images = {},
|
||||
path = paths or {}
|
||||
}
|
||||
for k, v in ipairs(paths) do
|
||||
table.insert(c.data.images, image:load_to(v, v))
|
||||
end
|
||||
end
|
||||
|
||||
function components.trigger_frame (c, array)
|
||||
c.data = array or {}
|
||||
end
|
||||
|
||||
function components.frame_i (c, index)
|
||||
c.data = index or 1
|
||||
end
|
||||
|
||||
function components.run_time (c, float)
|
||||
c.data = float or 0
|
||||
end
|
||||
|
||||
function components.anim_direction (c, one)
|
||||
c.data = one or 1
|
||||
end
|
||||
|
||||
function components.next_trigger_frame (c, index)
|
||||
c.data = index or 1
|
||||
end
|
||||
|
||||
function components.fps (c, frame_per_second)
|
||||
c.data = frame_per_second or 12
|
||||
end
|
||||
|
||||
return components
|
||||
24
game/src/world/common/component/audio.lua
Normal file
@ -0,0 +1,24 @@
|
||||
local source = require("wrapper.lappy.new.source").obj
|
||||
|
||||
local components = {}
|
||||
|
||||
components.dict = {
|
||||
bgm = "bgm",
|
||||
sfx = "sfx",
|
||||
}
|
||||
|
||||
function components.bgm (c, path)
|
||||
c.data = {
|
||||
source = source:load_to(path, path, "stream"),
|
||||
path = path
|
||||
}
|
||||
end
|
||||
|
||||
function components.sfx (c, path)
|
||||
c.data = {
|
||||
source = source:load_to(path, path, "static"),
|
||||
path = path
|
||||
}
|
||||
end
|
||||
|
||||
return components
|
||||
97
game/src/world/common/system/flip.lua
Normal file
@ -0,0 +1,97 @@
|
||||
local floor = math.floor
|
||||
|
||||
local system_constructor = require("wrapper.Concord.system")
|
||||
local audio = require("src.world.common.component.audio")
|
||||
local animation = require("src.world.common.component.animation")
|
||||
|
||||
local system = {}
|
||||
|
||||
system.__index = system
|
||||
|
||||
system.pool = {
|
||||
pool = {
|
||||
audio.dict.sfx,
|
||||
animation.dict.anim_direction,
|
||||
animation.dict.fps,
|
||||
animation.dict.frame_i,
|
||||
animation.dict.image_frame,
|
||||
animation.dict.next_trigger_frame,
|
||||
animation.dict.run_time,
|
||||
animation.dict.trigger_frame,
|
||||
}
|
||||
}
|
||||
|
||||
system.components = {
|
||||
[audio.dict.sfx] = audio.sfx,
|
||||
[animation.dict.anim_direction] = animation.anim_direction,
|
||||
[animation.dict.fps] = animation.fps,
|
||||
[animation.dict.frame_i] = animation.frame_i,
|
||||
[animation.dict.image_frame] = animation.image_frame,
|
||||
[animation.dict.next_trigger_frame] = animation.next_trigger_frame,
|
||||
[animation.dict.run_time] = animation.run_time,
|
||||
[animation.dict.trigger_frame] = animation.trigger_frame,
|
||||
}
|
||||
|
||||
function system.new()
|
||||
local new_system = system_constructor.new("flip", system.pool)
|
||||
if (new_system) then
|
||||
for k, v in pairs(system) do
|
||||
new_system[k] = v
|
||||
end
|
||||
return new_system
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
--- system frame
|
||||
local function update_time(time, delta, indicator)
|
||||
return time + (delta * indicator)
|
||||
end
|
||||
|
||||
local function get_loop(index, _max)
|
||||
local md = index % _max
|
||||
if (md == 0) then
|
||||
return _max
|
||||
else
|
||||
return index % _max
|
||||
end
|
||||
end
|
||||
|
||||
local function update_fps_time(time, fps)
|
||||
-- floor time to 1. check x fps per second
|
||||
return floor(time / (1 / fps))
|
||||
end
|
||||
|
||||
-- system trigger frame
|
||||
local function is_trigger(trigger_frames, trigger_id, frame_id)
|
||||
return (trigger_frames[trigger_id] == frame_id)
|
||||
end
|
||||
|
||||
function system:update(dt)
|
||||
for _, e in ipairs(self.pool) do
|
||||
e[animation.dict.run_time].data = update_time(
|
||||
e[animation.dict.run_time].data, dt, e[animation.dict.anim_direction].data
|
||||
)
|
||||
local new_index = update_fps_time(
|
||||
e[animation.dict.run_time].data, e[animation.dict.fps].data
|
||||
)
|
||||
e[animation.dict.frame_i].data = get_loop(
|
||||
new_index,
|
||||
#e[animation.dict.image_frame].data.images
|
||||
)
|
||||
|
||||
if (is_trigger(
|
||||
e[animation.dict.trigger_frame].data,
|
||||
e[animation.dict.next_trigger_frame].data,
|
||||
e[animation.dict.frame_i].data
|
||||
)) then
|
||||
e[animation.dict.next_trigger_frame].data = get_loop(
|
||||
e[animation.dict.next_trigger_frame].data + 1, #e[animation.dict.trigger_frame].data
|
||||
)
|
||||
e[audio.dict.sfx].data.source:play()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return system
|
||||
39
game/src/world/common/template/book.lua
Normal file
@ -0,0 +1,39 @@
|
||||
local flip = require("src.world.common.system.flip")
|
||||
|
||||
local template = {}
|
||||
|
||||
template.default_data = {
|
||||
sfx = "asset/audio/sfx/book_flip.1.ogg",
|
||||
anim_direction = 1,
|
||||
fps = 12,
|
||||
frame_i = 1,
|
||||
image_frame = {
|
||||
"asset/image/book/StoryMode.png",
|
||||
"asset/image/book/StoryModeBook.png",
|
||||
"asset/image/book/StoryModeBook2.png",
|
||||
"asset/image/book/StoryModeBook3.png",
|
||||
"asset/image/book/StoryModeBook4.png",
|
||||
"asset/image/book/StoryModeBook5.png",
|
||||
"asset/image/book/StoryModeBook6.png",
|
||||
"asset/image/book/StoryModeBook7.png",
|
||||
"asset/image/book/StoryModeBook8.png",
|
||||
"asset/image/book/StoryModeBook9.png",
|
||||
"asset/image/book/StoryModeBook11.png",
|
||||
"asset/image/book/StoryModeBook16.png",
|
||||
},
|
||||
next_trigger_frame = 1,
|
||||
run_time = 0,
|
||||
trigger_frame = {1},
|
||||
}
|
||||
function template.assemble(e, data)
|
||||
e:give(flip.pool.pool[1], data.sfx)
|
||||
e:give(flip.pool.pool[2], data.anim_direction)
|
||||
e:give(flip.pool.pool[3], data.fps)
|
||||
e:give(flip.pool.pool[4], data.frame_i)
|
||||
e:give(flip.pool.pool[5], data.image_frame)
|
||||
e:give(flip.pool.pool[6], data.next_trigger_frame)
|
||||
e:give(flip.pool.pool[7], data.run_time)
|
||||
e:give(flip.pool.pool[8], data.trigger_frame)
|
||||
end
|
||||
|
||||
return template
|
||||
@ -1,10 +1,14 @@
|
||||
local reap = require("lib.reap")
|
||||
|
||||
local BASE = reap.base_path(...)
|
||||
local image = require("wrapper.lappy.new.image").obj
|
||||
|
||||
local world = require("wrapper.Concord.world")
|
||||
|
||||
local debug_entity = require("src.world.common.template.debug_entity")
|
||||
local book = require("src.world.common.template.book")
|
||||
|
||||
local animation = require("src.world.common.component.animation")
|
||||
|
||||
local wrapper = world:extend()
|
||||
|
||||
@ -22,8 +26,26 @@ function wrapper:load(_args)
|
||||
position = {0, 0},
|
||||
label = "race world"
|
||||
}
|
||||
},
|
||||
{
|
||||
assemblage = book.assemble,
|
||||
data = book.default_data
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
function wrapper:draw()
|
||||
wrapper.super.draw(self)
|
||||
|
||||
for k, v in pairs(self.entities) do
|
||||
if v[animation.dict.frame_i] ~= nil then
|
||||
local frame_i = v[animation.dict.frame_i].data
|
||||
local img = v[animation.dict.image_frame].data.images
|
||||
if (img ~= nil) then
|
||||
love.graphics.draw(img[frame_i])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return wrapper
|
||||
|
||||
@ -22,6 +22,7 @@ function wrapper:new(path, name)
|
||||
wrapper.super.new(self, path, name)
|
||||
self.is_loaded = false
|
||||
self.world = World()
|
||||
self.entities = {}
|
||||
end
|
||||
|
||||
local function load_systems(world, system_paths)
|
||||
@ -46,17 +47,18 @@ local function load_systems(world, system_paths)
|
||||
end
|
||||
end
|
||||
|
||||
local function load_entities(world, data)
|
||||
local function load_entities(self, world, data)
|
||||
for _, d in pairs(data) do
|
||||
local entity = entity_builder.new()
|
||||
entity:assemble(d.assemblage, d.data)
|
||||
world:addEntity(entity)
|
||||
table.insert(self.entities, entity)
|
||||
end
|
||||
end
|
||||
|
||||
function wrapper:load(system_paths, entities_data)
|
||||
load_systems(self.world, system_paths)
|
||||
load_entities(self.world, entities_data)
|
||||
load_entities(self, self.world, entities_data)
|
||||
self.is_loaded = true
|
||||
self.world:emit("load")
|
||||
end
|
||||
|
||||