381 lines
12 KiB
Python
381 lines
12 KiB
Python
"""
|
||
骨骼动画系统插件使用示例
|
||
提供各种使用场景的代码示例
|
||
"""
|
||
|
||
def example_basic_usage(world):
|
||
"""
|
||
基本使用示例
|
||
"""
|
||
print("=== 骨骼动画插件基本使用示例 ===")
|
||
|
||
# 获取插件实例
|
||
skeletal_plugin = world.plugin_manager.get_plugin("skeletal_animation_system")
|
||
if not skeletal_plugin:
|
||
print("错误: 骨骼动画插件未加载")
|
||
return
|
||
|
||
animation_manager = skeletal_plugin.get_animation_manager()
|
||
|
||
# 1. 加载简单的Actor
|
||
print("1. 加载Actor...")
|
||
actor, actor_id = animation_manager.load_actor(
|
||
model_path="models/characters/robot.egg",
|
||
position=(0, 0, 0),
|
||
scale=1.0
|
||
)
|
||
|
||
if actor:
|
||
print(f" 成功加载Actor: {actor_id}")
|
||
|
||
# 2. 获取可用动画
|
||
animations = animation_manager.get_actor_animations(actor_id)
|
||
print(f"2. 可用动画: {animations}")
|
||
|
||
# 3. 播放动画
|
||
if animations:
|
||
print("3. 播放第一个动画...")
|
||
animation_manager.play_animation(
|
||
actor_id=actor_id,
|
||
anim_name=animations[0],
|
||
loop=True,
|
||
play_rate=1.0
|
||
)
|
||
|
||
# 4. 获取动画信息
|
||
if animations:
|
||
info = animation_manager.get_animation_info(actor_id, animations[0])
|
||
print(f"4. 动画信息: {info}")
|
||
|
||
print("=== 基本使用示例结束 ===\n")
|
||
|
||
|
||
def example_advanced_usage(world):
|
||
"""
|
||
高级使用示例
|
||
"""
|
||
print("=== 骨骼动画插件高级使用示例 ===")
|
||
|
||
# 获取插件实例
|
||
skeletal_plugin = world.plugin_manager.get_plugin("skeletal_animation_system")
|
||
if not skeletal_plugin:
|
||
print("错误: 骨骼动画插件未加载")
|
||
return
|
||
|
||
animation_manager = skeletal_plugin.get_animation_manager()
|
||
|
||
# 1. 加载带多个动画的Actor
|
||
print("1. 加载带多个动画的Actor...")
|
||
anim_dict = {
|
||
"walk": "models/anim/walk.egg",
|
||
"run": "models/anim/run.egg",
|
||
"jump": "models/anim/jump.egg",
|
||
"idle": "models/anim/idle.egg"
|
||
}
|
||
|
||
actor, actor_id = animation_manager.load_actor(
|
||
model_path="models/characters/hero.egg",
|
||
anim_dict=anim_dict,
|
||
position=(5, 0, 0),
|
||
scale=1.2
|
||
)
|
||
|
||
if actor:
|
||
print(f" 成功加载Actor: {actor_id}")
|
||
|
||
# 2. 播放循环动画
|
||
print("2. 播放循环idle动画...")
|
||
animation_manager.play_animation(actor_id, "idle", loop=True)
|
||
|
||
# 3. 3秒后切换到walk动画
|
||
def switch_to_walk():
|
||
print("3. 切换到walk动画...")
|
||
animation_manager.stop_animation(actor_id, "idle")
|
||
animation_manager.play_animation(actor_id, "walk", loop=True)
|
||
|
||
# 使用Panda3D的任务系统在3秒后执行
|
||
def schedule_task(task):
|
||
if task.time >= 3.0:
|
||
switch_to_walk()
|
||
return task.done
|
||
return task.cont
|
||
|
||
world.taskMgr.doMethodLater(3.0, schedule_task, "switch_animation_task")
|
||
|
||
# 4. 创建动画序列
|
||
print("4. 创建动画序列...")
|
||
sequence = animation_manager.create_animation_sequence(
|
||
actor_id,
|
||
["walk", "run", "jump"],
|
||
loop=True
|
||
)
|
||
|
||
# 5. 动画混合示例
|
||
print("5. 创建动画混合...")
|
||
blend = animation_manager.blend_animations(
|
||
actor_id,
|
||
"walk",
|
||
"run",
|
||
blend_time=2.0,
|
||
loop=True
|
||
)
|
||
|
||
print("=== 高级使用示例结束 ===\n")
|
||
|
||
|
||
def example_event_driven_usage(world):
|
||
"""
|
||
事件驱动使用示例
|
||
"""
|
||
print("=== 骨骼动画插件事件驱动使用示例 ===")
|
||
|
||
# 1. 通过事件加载Actor
|
||
print("1. 通过事件加载Actor...")
|
||
world.acceptOnce("example_load_done", lambda: print("Actor加载完成"))
|
||
world.send("skeletal.load_actor", [
|
||
"models/characters/npc.egg",
|
||
{"greet": "models/anim/greet.egg"},
|
||
"npc_actor",
|
||
(10, 0, 0),
|
||
1.0
|
||
])
|
||
|
||
# 2. 通过事件播放动画
|
||
def play_greeting():
|
||
print("2. 通过事件播放动画...")
|
||
world.send("skeletal.play_animation", ["npc_actor", "greet", False, 1.0])
|
||
|
||
# 3秒后播放动画
|
||
def schedule_greeting(task):
|
||
if task.time >= 3.0:
|
||
play_greeting()
|
||
return task.done
|
||
return task.cont
|
||
|
||
world.taskMgr.doMethodLater(3.0, schedule_greeting, "play_greeting_task")
|
||
|
||
print("=== 事件驱动使用示例结束 ===\n")
|
||
|
||
|
||
def example_multiple_actors(world):
|
||
"""
|
||
多Actor管理示例
|
||
"""
|
||
print("=== 骨骼动画插件多Actor管理示例 ===")
|
||
|
||
# 获取插件实例
|
||
skeletal_plugin = world.plugin_manager.get_plugin("skeletal_animation_system")
|
||
if not skeletal_plugin:
|
||
print("错误: 骨骼动画插件未加载")
|
||
return
|
||
|
||
animation_manager = skeletal_plugin.get_animation_manager()
|
||
|
||
# 1. 创建多个Actor
|
||
print("1. 创建多个Actor...")
|
||
actors_data = [
|
||
{
|
||
"model": "models/characters/warrior.egg",
|
||
"anims": {"walk": "models/anim/warrior_walk.egg", "attack": "models/anim/warrior_attack.egg"},
|
||
"position": (-5, -5, 0),
|
||
"scale": 1.0,
|
||
"id": "warrior"
|
||
},
|
||
{
|
||
"model": "models/characters/mage.egg",
|
||
"anims": {"walk": "models/anim/mage_walk.egg", "cast": "models/anim/mage_cast.egg"},
|
||
"position": (5, -5, 0),
|
||
"scale": 1.0,
|
||
"id": "mage"
|
||
},
|
||
{
|
||
"model": "models/characters/archer.egg",
|
||
"anims": {"walk": "models/anim/archer_walk.egg", "shoot": "models/anim/archer_shoot.egg"},
|
||
"position": (0, -10, 0),
|
||
"scale": 1.0,
|
||
"id": "archer"
|
||
}
|
||
]
|
||
|
||
created_actors = []
|
||
for actor_data in actors_data:
|
||
actor, actor_id = animation_manager.load_actor(
|
||
model_path=actor_data["model"],
|
||
anim_dict=actor_data["anims"],
|
||
actor_id=actor_data["id"],
|
||
position=actor_data["position"],
|
||
scale=actor_data["scale"]
|
||
)
|
||
|
||
if actor:
|
||
created_actors.append(actor_id)
|
||
print(f" 创建Actor: {actor_id}")
|
||
|
||
# 2. 统一控制所有Actor
|
||
print("2. 统一控制所有Actor...")
|
||
|
||
def start_all_walk():
|
||
for actor_id in created_actors:
|
||
animations = animation_manager.get_actor_animations(actor_id)
|
||
if "walk" in animations:
|
||
animation_manager.play_animation(actor_id, "walk", loop=True)
|
||
|
||
def stop_all_animations():
|
||
for actor_id in created_actors:
|
||
animation_manager.stop_all_animations(actor_id)
|
||
|
||
# 3秒后开始行走,再过3秒后停止
|
||
def control_all_actors(task):
|
||
if task.time >= 3.0 and task.time < 3.1:
|
||
start_all_walk()
|
||
print(" 所有角色开始行走")
|
||
elif task.time >= 6.0 and task.time < 6.1:
|
||
stop_all_animations()
|
||
print(" 所有角色停止动画")
|
||
return task.done
|
||
return task.cont
|
||
|
||
world.taskMgr.add(control_all_actors, "control_all_actors_task")
|
||
|
||
print("=== 多Actor管理示例结束 ===\n")
|
||
|
||
|
||
def example_animation_manipulation(world):
|
||
"""
|
||
动画操作示例
|
||
"""
|
||
print("=== 骨骼动画插件动画操作示例 ===")
|
||
|
||
# 获取插件实例
|
||
skeletal_plugin = world.plugin_manager.get_plugin("skeletal_animation_system")
|
||
if not skeletal_plugin:
|
||
print("错误: 骨骼动画插件未加载")
|
||
return
|
||
|
||
animation_manager = skeletal_plugin.get_animation_manager()
|
||
|
||
# 1. 加载Actor用于演示
|
||
print("1. 加载Actor用于演示...")
|
||
anim_dict = {
|
||
"walk": "models/anim/walk.egg",
|
||
"run": "models/anim/run.egg",
|
||
"jump": "models/anim/jump.egg"
|
||
}
|
||
|
||
actor, actor_id = animation_manager.load_actor(
|
||
model_path="models/characters/demo_character.egg",
|
||
anim_dict=anim_dict,
|
||
position=(0, 10, 0),
|
||
scale=1.0
|
||
)
|
||
|
||
if actor:
|
||
# 2. 演示播放速度控制
|
||
print("2. 演示播放速度控制...")
|
||
animation_manager.play_animation(actor_id, "walk", loop=True, play_rate=0.5)
|
||
print(" 以0.5倍速度播放walk动画")
|
||
|
||
# 3秒后调整速度
|
||
def change_speed(task):
|
||
if task.time >= 3.0 and task.time < 3.1:
|
||
animation_manager.set_animation_speed(actor_id, "walk", 2.0)
|
||
print(" 调整为2.0倍速度播放walk动画")
|
||
return task.done
|
||
return task.cont
|
||
|
||
world.taskMgr.doMethodLater(3.0, change_speed, "change_speed_task")
|
||
|
||
# 3. 演示暂停和恢复
|
||
print("3. 演示暂停和恢复...")
|
||
|
||
def pause_resume_demo(task):
|
||
if task.time >= 6.0 and task.time < 6.1:
|
||
animation_manager.pause_animation(actor_id)
|
||
print(" 暂停动画")
|
||
elif task.time >= 8.0 and task.time < 8.1:
|
||
animation_manager.resume_animation(actor_id)
|
||
print(" 恢复动画")
|
||
return task.done
|
||
return task.cont
|
||
|
||
world.taskMgr.doMethodLater(6.0, pause_resume_demo, "pause_resume_task")
|
||
|
||
# 4. 演示动画信息获取
|
||
print("4. 演示动画信息获取...")
|
||
|
||
def show_animation_info(task):
|
||
if task.time >= 10.0 and task.time < 10.1:
|
||
info = animation_manager.get_actor_info(actor_id)
|
||
print(f" Actor信息: {info}")
|
||
return task.done
|
||
return task.cont
|
||
|
||
world.taskMgr.doMethodLater(10.0, show_animation_info, "show_info_task")
|
||
|
||
print("=== 动画操作示例结束 ===\n")
|
||
|
||
|
||
def run_all_examples(world):
|
||
"""
|
||
运行所有示例
|
||
"""
|
||
print("开始运行骨骼动画插件所有示例...")
|
||
|
||
example_basic_usage(world)
|
||
example_advanced_usage(world)
|
||
example_event_driven_usage(world)
|
||
example_multiple_actors(world)
|
||
example_animation_manipulation(world)
|
||
|
||
print("所有示例运行完成!")
|
||
|
||
|
||
# 使用说明和API参考
|
||
USAGE_GUIDE = """
|
||
骨骼动画插件使用说明
|
||
==================
|
||
|
||
1. 基本概念
|
||
----------
|
||
- Actor: 带有骨骼的3D模型对象
|
||
- Animation: 应用于Actor的动画序列
|
||
- Manager: 管理所有Actor和动画的中心控制器
|
||
|
||
2. 主要功能
|
||
----------
|
||
- Actor加载和管理
|
||
- 动画播放、暂停、停止控制
|
||
- 动画速度调节
|
||
- 动画混合和序列播放
|
||
- 事件驱动的动画控制
|
||
- 多Actor统一管理
|
||
|
||
3. 核心API
|
||
----------
|
||
SkeletalAnimationManager:
|
||
- load_actor(): 加载Actor模型
|
||
- unload_actor(): 卸载Actor
|
||
- play_animation(): 播放动画
|
||
- stop_animation(): 停止动画
|
||
- set_animation_speed(): 设置动画速度
|
||
- pause_animation(): 暂停动画
|
||
- resume_animation(): 恢复动画
|
||
- blend_animations(): 混合动画
|
||
- create_animation_sequence(): 创建动画序列
|
||
|
||
4. 事件系统
|
||
----------
|
||
- skeletal.load_actor: 加载Actor
|
||
- skeletal.play_animation: 播放动画
|
||
- skeletal.stop_animation: 停止动画
|
||
- skeletal.set_animation_speed: 设置动画速度
|
||
- skeletal.pause_animation: 暂停动画
|
||
- skeletal.resume_animation: 恢复动画
|
||
|
||
5. 使用示例
|
||
----------
|
||
参见examples.py文件中的各种使用示例
|
||
"""
|
||
|
||
if __name__ == "__main__":
|
||
print(USAGE_GUIDE) |