Files
whale-town/scripts/CharacterSprite.gd
2025-12-05 19:00:14 +08:00

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)