105 lines
2.6 KiB
GDScript
105 lines
2.6 KiB
GDScript
extends Node2D
|
|
class_name CharacterSprite
|
|
## 程序化角色精灵
|
|
## 在没有实际精灵图时使用,可以轻松替换为真实精灵
|
|
|
|
# 角色颜色
|
|
var body_color: Color = Color(0.4, 0.6, 0.8) # 身体颜色
|
|
var head_color: Color = Color(0.9, 0.8, 0.7) # 头部颜色
|
|
|
|
# 角色尺寸
|
|
const BODY_WIDTH = 32
|
|
const BODY_HEIGHT = 48
|
|
const HEAD_SIZE = 24
|
|
|
|
# 节点引用
|
|
var body: ColorRect
|
|
var head: ColorRect
|
|
var eyes: Node2D
|
|
|
|
func _ready():
|
|
_create_character()
|
|
|
|
## 创建角色视觉
|
|
func _create_character():
|
|
"""程序化创建角色外观"""
|
|
# 身体
|
|
body = ColorRect.new()
|
|
body.size = Vector2(BODY_WIDTH, BODY_HEIGHT)
|
|
body.position = Vector2(-BODY_WIDTH / 2.0, -BODY_HEIGHT)
|
|
body.color = body_color
|
|
add_child(body)
|
|
|
|
# 头部
|
|
head = ColorRect.new()
|
|
head.size = Vector2(HEAD_SIZE, HEAD_SIZE)
|
|
head.position = Vector2(-HEAD_SIZE / 2.0, -BODY_HEIGHT - HEAD_SIZE)
|
|
head.color = head_color
|
|
add_child(head)
|
|
|
|
# 眼睛
|
|
eyes = Node2D.new()
|
|
eyes.position = Vector2(0, -BODY_HEIGHT - HEAD_SIZE / 2.0)
|
|
add_child(eyes)
|
|
|
|
# 左眼
|
|
var left_eye = ColorRect.new()
|
|
left_eye.size = Vector2(4, 4)
|
|
left_eye.position = Vector2(-8, -2)
|
|
left_eye.color = Color.BLACK
|
|
eyes.add_child(left_eye)
|
|
|
|
# 右眼
|
|
var right_eye = ColorRect.new()
|
|
right_eye.size = Vector2(4, 4)
|
|
right_eye.position = Vector2(4, -2)
|
|
right_eye.color = Color.BLACK
|
|
eyes.add_child(right_eye)
|
|
|
|
## 设置角色颜色
|
|
func set_character_color(new_body_color: Color, new_head_color: Color = Color(0.9, 0.8, 0.7)):
|
|
"""
|
|
设置角色颜色
|
|
@param new_body_color: 身体颜色
|
|
@param new_head_color: 头部颜色
|
|
"""
|
|
body_color = new_body_color
|
|
head_color = new_head_color
|
|
|
|
if body:
|
|
body.color = body_color
|
|
if head:
|
|
head.color = head_color
|
|
|
|
## 播放行走动画
|
|
func play_walk_animation(direction: Vector2):
|
|
"""
|
|
播放行走动画(简单的摇摆效果)
|
|
@param direction: 移动方向
|
|
"""
|
|
if direction.length() > 0:
|
|
# 简单的左右摇摆
|
|
var tween = create_tween()
|
|
tween.set_loops()
|
|
tween.tween_property(self, "rotation", 0.1, 0.3)
|
|
tween.tween_property(self, "rotation", -0.1, 0.3)
|
|
else:
|
|
# 停止动画
|
|
rotation = 0
|
|
|
|
## 播放空闲动画
|
|
func play_idle_animation():
|
|
"""播放空闲动画(轻微上下浮动)"""
|
|
var tween = create_tween()
|
|
tween.set_loops()
|
|
tween.tween_property(self, "position:y", -2, 1.0)
|
|
tween.tween_property(self, "position:y", 0, 1.0)
|
|
|
|
## 生成随机角色颜色
|
|
static func generate_random_color() -> Color:
|
|
"""生成随机但好看的角色颜色"""
|
|
var hue = randf()
|
|
var saturation = randf_range(0.4, 0.8)
|
|
var value = randf_range(0.6, 0.9)
|
|
return Color.from_hsv(hue, saturation, value)
|