重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
godot-genre-party by thedivergentai/gd-agentic-skills
npx skills add https://github.com/thedivergentai/gd-agentic-skills --skill godot-genre-party平衡易用性、多样性和社交乐趣的派对游戏专家蓝图。
Input.get_connected_joypads() 动态查询。Input.is_action_pressed() 来分配新加入的玩家;严格在 _unhandled_input() 中解析原始的 InputEventJoypadButton 以获取设备元数据。joy_connection_changed 信号以暂停并优雅处理玩家退出。Input.get_vector() 以获得精确度和死区处理。广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
FOCUS_NONE;严格设置为 FOCUS_ALL 并明确指定焦点邻居以实现无障碍导航。CanvasLayer UI;严格使用每个视口的 CanvasLayer 子节点。SubViewport 子节点的大小;严格使用 GridContainer 或 BoxContainer 进行自动分屏布局。Camera2D;严格使用动态群组相机,能够缩放/平移以将所有玩家保持在画面内。mouse_filter 设置为 PASS 的情况下重叠 SubViewportContainer 节点;否则,顶层的视口会阻挡输入。device_id 映射到 player_id 的专业本地多人游戏解决方案。| 阶段 | 技能 | 目的 |
|---|---|---|
| 1. 输入 | input-mapping | 动态处理 2-4 个本地控制器 |
| 2. 场景 | godot-scene-management | 干净地加载/卸载小游戏 |
| 3. 数据 | godot-resource-data-patterns | 通过 Resource 文件定义小游戏 |
| 4. UI | godot-ui-containers | 记分牌、指令屏幕 |
| 5. 逻辑 | godot-turn-system | 管理"棋盘游戏"阶段 |
使用 Resource 来定义小游戏是什么。
# minigame_data.gd
class_name MinigameData extends Resource
@export var title: String
@export var scene_path: String
@export var instructions: String
@export var is_1v3: bool = false
@export var thumbnail: Texture2D
在小游戏之间持久存在的单例。
# party_manager.gd
extends Node
var players: Array[PlayerData] = [] # 追踪分数、input_device_id、颜色
var current_round: int = 1
var max_rounds: int = 10
func start_minigame(minigame: MinigameData) -> void:
# 1. 显示指令场景
await show_instructions(minigame)
# 2. 过渡到实际游戏
get_tree().change_scene_to_file(minigame.scene_path)
# 3. 将玩家数据传递给新场景
# (小游戏场景必须在 _ready 中查找 PartyManager)
每个小游戏都继承自此,以确保兼容性。
# minigame_base.gd
class_name Minigame extends Node
signal game_ended(results: Dictionary)
func _ready() -> void:
setup_players(PartyManager.players)
start_countdown()
func end_game() -> void:
# 计算获胜者
game_ended.emit(results)
PartyManager.handle_minigame_end(results)
处理动态设备分配。
# player_controller.gd
@export var player_id: int = 0 # 0, 1, 2, 3
func _physics_process(delta: float) -> void:
var device = PartyManager.players[player_id].device_id
# 使用特定的设备 ID 进行输入
var direction = Input.get_vector("p%s_left" % player_id, ...)
# 更好的方法:在运行时显式地重新映射 InputMap 动作
平衡"单人方"与"多人方"。
Input.get_connected_joypads() 在大厅屏幕上自动检测控制器。InputMap 系统可以在运行时使用 InputMap.action_add_event() 进行修改。动态创建 "p1_jump"、"p2_jump" 是一种常见模式。Thread 加载。每周安装量
54
仓库
GitHub 星标数
68
首次出现
2026年2月10日
安全审计
安装于
opencode53
codex52
gemini-cli52
kimi-cli51
github-copilot51
amp51
Expert blueprint for party games balancing accessibility, variety, and social fun.
Input.get_connected_joypads().Input.is_action_pressed() for assigning new player joins; strictly parse raw InputEventJoypadButton in _unhandled_input() for device metadata.joy_connection_changed signal to pause and handle dropouts gracefully.Input.get_vector() for precision and deadzones.FOCUS_NONE for gamepad menus; strictly set to FOCUS_ALL with explicit focus neighbors for accessible navigation.CanvasLayer UI for individual split-screen players; strictly use per-viewport CanvasLayer children.SubViewport children; strictly use GridContainer or BoxContainer for automatic split-screen layout.Camera2D for shared-room games; strictly use a dynamic group camera that zooms/pans to fit all players in frame.SubViewportContainer nodes without setting mouse_filter to ; otherwise, top viewports will block input.device_id to player_id.| Phase | Skills | Purpose |
|---|---|---|
| 1. Input | input-mapping | Handling 2-4 local controllers dynamically |
| 2. Scene | godot-scene-management | Loading/Unloading minigames cleanly |
| 3. Data | godot-resource-data-patterns | Defining minigames via Resource files |
| 4. UI | godot-ui-containers | Scoreboards, instructions screens |
| 5. Logic | godot-turn-system |
Using Resources to define what a minigame is.
# minigame_data.gd
class_name MinigameData extends Resource
@export var title: String
@export var scene_path: String
@export var instructions: String
@export var is_1v3: bool = false
@export var thumbnail: Texture2D
Singleton that persists between minigames.
# party_manager.gd
extends Node
var players: Array[PlayerData] = [] # Tracks score, input_device_id, color
var current_round: int = 1
var max_rounds: int = 10
func start_minigame(minigame: MinigameData) -> void:
# 1. Show instructions scene
await show_instructions(minigame)
# 2. Transition to actual game
get_tree().change_scene_to_file(minigame.scene_path)
# 3. Pass player data to the new scene
# (The minigame scene must look up PartyManager in _ready)
Every minigame inherits from this to ensure compatibility.
# minigame_base.gd
class_name Minigame extends Node
signal game_ended(results: Dictionary)
func _ready() -> void:
setup_players(PartyManager.players)
start_countdown()
func end_game() -> void:
# Calculate winner
game_ended.emit(results)
PartyManager.handle_minigame_end(results)
Handling dynamic device assignment.
# player_controller.gd
@export var player_id: int = 0 # 0, 1, 2, 3
func _physics_process(delta: float) -> void:
var device = PartyManager.players[player_id].device_id
# Use the specific device ID for input
var direction = Input.get_vector("p%s_left" % player_id, ...)
# Better approach: Remap InputMap actions at runtime explicitly
Balancing the "One" vs the "Many".
Input.get_connected_joypads() to auto-detect controllers on the Lobby screen.InputMap system can be modified at runtime using InputMap.action_add_event(). Creating "p1_jump", "p2_jump" dynamically is a common pattern.Thread loading.Weekly Installs
54
Repository
GitHub Stars
68
First Seen
Feb 10, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode53
codex52
gemini-cli52
kimi-cli51
github-copilot51
amp51
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
125,600 周安装
PASS| Managing the "Board Game" phase |