Initial flame_lua_runtime package
This commit is contained in:
130
example/assets/games/flight/scripts/ui.lua
Normal file
130
example/assets/games/flight/scripts/ui.lua
Normal file
@@ -0,0 +1,130 @@
|
||||
---@type RuntimeUi
|
||||
local runtime_ui = runtime.import("runtime_ui")
|
||||
---@type RuntimeLayout
|
||||
local layout = runtime.import("layout")
|
||||
local theme = runtime.import("theme")
|
||||
local styles = runtime.import("styles")
|
||||
local state = runtime.import("state")
|
||||
local board = runtime.import("board")
|
||||
local rules = runtime.import("rules")
|
||||
|
||||
local ui = {}
|
||||
|
||||
local function color_name(owner)
|
||||
if owner == "red" then return "红" end
|
||||
if owner == "yellow" then return "黄" end
|
||||
if owner == "blue" then return "蓝" end
|
||||
if owner == "green" then return "绿" end
|
||||
return owner
|
||||
end
|
||||
|
||||
local function piece_size(piece)
|
||||
if piece.status == "finished" then
|
||||
return 30
|
||||
end
|
||||
return 34
|
||||
end
|
||||
|
||||
function ui.highlight_updates(ids, enabled)
|
||||
return runtime_ui.batch_update(ids, enabled and styles.plane_highlight or styles.plane_normal)
|
||||
end
|
||||
|
||||
function ui.piece_position_update(piece_id)
|
||||
local piece = state.pieces[piece_id]
|
||||
local pos = rules.piece_position(piece)
|
||||
return runtime_ui.update(piece_id, {
|
||||
x = pos.x,
|
||||
y = pos.y,
|
||||
width = piece_size(piece),
|
||||
height = piece_size(piece),
|
||||
scale = 1,
|
||||
alpha = 0.95
|
||||
})
|
||||
end
|
||||
|
||||
function ui.piece_position_updates(ids)
|
||||
local updates = {}
|
||||
for _, id in ipairs(ids) do
|
||||
table.insert(updates, ui.piece_position_update(id))
|
||||
end
|
||||
return updates
|
||||
end
|
||||
|
||||
function ui.all_piece_position_updates()
|
||||
return ui.piece_position_updates(rules.all_piece_ids())
|
||||
end
|
||||
|
||||
function ui.create_board_nodes()
|
||||
local nodes = {
|
||||
runtime_ui.panel("board_panel", 28, 82, 664, 610, styles.board),
|
||||
runtime_ui.panel("center_airport", 252, 292, 168, 136, styles.center),
|
||||
runtime_ui.text("board_title", theme.title, 268, 318, 140, 32, styles.hud_text),
|
||||
runtime_ui.text("board_tip", "掷 6 起飞 · 撞子回家 · 全部到达获胜", 206, 360, 320, 28, styles.small_text),
|
||||
runtime_ui.panel("home_red", 62, 98, 128, 92, styles.home_panel("red")),
|
||||
runtime_ui.panel("home_yellow", 498, 98, 128, 92, styles.home_panel("yellow")),
|
||||
runtime_ui.panel("home_blue", 498, 516, 128, 92, styles.home_panel("blue")),
|
||||
runtime_ui.panel("home_green", 62, 516, 128, 92, styles.home_panel("green")),
|
||||
runtime_ui.text("label_red", "红方", 96, 102, 60, 24, styles.small_text),
|
||||
runtime_ui.text("label_yellow", "黄方", 532, 102, 60, 24, styles.small_text),
|
||||
runtime_ui.text("label_blue", "蓝方", 532, 520, 60, 24, styles.small_text),
|
||||
runtime_ui.text("label_green", "绿方", 96, 520, 60, 24, styles.small_text)
|
||||
}
|
||||
|
||||
for index, cell in ipairs(board.route) do
|
||||
runtime_ui.append(nodes, runtime_ui.circle("route_" .. tostring(index), cell.x, cell.y, 24, styles.route_cell))
|
||||
end
|
||||
|
||||
for _, owner in ipairs(state.players) do
|
||||
local start = board.route[board.start[owner]]
|
||||
runtime_ui.append(nodes, runtime_ui.text("start_" .. owner, color_name(owner), start.x - 14, start.y - 14, 36, 24, {
|
||||
fontSize = 14,
|
||||
color = theme.colors[owner],
|
||||
layer = styles.layers.cell + 1
|
||||
}))
|
||||
end
|
||||
|
||||
for id, piece in pairs(state.pieces) do
|
||||
local pos = rules.piece_position(piece)
|
||||
runtime_ui.append(nodes, runtime_ui.circle(id, pos.x, pos.y, piece_size(piece), styles.plane(piece.owner)))
|
||||
end
|
||||
|
||||
return nodes
|
||||
end
|
||||
|
||||
function ui.create_ui_nodes()
|
||||
local hud_items = layout.row("top_bar", {
|
||||
runtime_ui.text("turn_text", "当前: 红方", 0, 0, 120, 32, styles.hud_text),
|
||||
runtime_ui.text("dice_text", "骰子: -", 0, 0, 100, 32, styles.hud_text),
|
||||
runtime_ui.text("status_text", rules.status_text(), 0, 0, 260, 32, styles.hud_text),
|
||||
layout.item(
|
||||
runtime_ui.button("dice_button", "掷骰子", 0, 0, 120, 48, "roll_dice", styles.dice_button),
|
||||
{ marginLeft = 18 }
|
||||
)
|
||||
}, {
|
||||
x = 24,
|
||||
height = 76,
|
||||
gap = 16,
|
||||
align = "center"
|
||||
})
|
||||
|
||||
local nodes = { runtime_ui.panel("top_bar", 0, 0, 720, 76, styles.hud) }
|
||||
return runtime_ui.append_all(nodes, hud_items)
|
||||
end
|
||||
|
||||
function ui.turn_name(owner)
|
||||
return "当前: " .. color_name(owner) .. "方"
|
||||
end
|
||||
|
||||
function ui.dice_and_status_updates()
|
||||
return {
|
||||
runtime_ui.text_update("dice_text", "骰子: " .. tostring(state.dice or "-")),
|
||||
runtime_ui.text_update("turn_text", ui.turn_name(state.current_player)),
|
||||
runtime_ui.text_update("status_text", rules.status_text())
|
||||
}
|
||||
end
|
||||
|
||||
function ui.status_update()
|
||||
return { runtime_ui.text_update("status_text", rules.status_text()) }
|
||||
end
|
||||
|
||||
return ui
|
||||
Reference in New Issue
Block a user