forked from datawhale/whale-town-front
122 lines
3.5 KiB
GDScript
122 lines
3.5 KiB
GDScript
# ============================================================================
|
||
# 简单草地瓦片 - GrassTile.gd
|
||
#
|
||
# 一个简单的32x32草地瓦片,自动对齐网格
|
||
# 使用方法:
|
||
# 1. 在场景中实例化 grass_tile_prefab.tscn
|
||
# 2. 设置 texture 属性
|
||
# 3. 调用 set_grid_position() 设置网格位置
|
||
# ============================================================================
|
||
|
||
class_name GrassTile
|
||
extends Sprite2D
|
||
|
||
# ============================================================================
|
||
# 导出属性
|
||
# ============================================================================
|
||
@export var grid_position: Vector2i = Vector2i.ZERO : set = set_grid_position
|
||
@export var auto_snap: bool = true # 是否自动对齐网格
|
||
|
||
# ============================================================================
|
||
# 信号
|
||
# ============================================================================
|
||
signal position_changed(new_grid_pos: Vector2i)
|
||
|
||
func _ready():
|
||
# 如果没有纹理,创建一个默认的占位符
|
||
if not texture:
|
||
_create_placeholder_texture()
|
||
|
||
# 验证纹理尺寸
|
||
_validate_texture()
|
||
|
||
# 自动对齐到网格
|
||
if auto_snap:
|
||
snap_to_grid()
|
||
|
||
# ============================================================================
|
||
# 公共方法
|
||
# ============================================================================
|
||
|
||
# 设置网格位置并自动对齐
|
||
func set_grid_position(new_pos: Vector2i):
|
||
if grid_position != new_pos:
|
||
grid_position = new_pos
|
||
if auto_snap:
|
||
snap_to_grid()
|
||
position_changed.emit(grid_position)
|
||
|
||
# 对齐到网格中心
|
||
func snap_to_grid():
|
||
position = Vector2(
|
||
grid_position.x * 32.0 + 16.0,
|
||
grid_position.y * 32.0 + 16.0
|
||
)
|
||
|
||
# 从世界坐标设置位置(会自动转换为网格坐标)
|
||
func set_world_position(world_pos: Vector2):
|
||
var new_grid_pos = Vector2i(
|
||
int(world_pos.x / 32.0),
|
||
int(world_pos.y / 32.0)
|
||
)
|
||
set_grid_position(new_grid_pos)
|
||
|
||
# 获取世界坐标
|
||
func get_world_position() -> Vector2:
|
||
return position
|
||
|
||
# ============================================================================
|
||
# 私有方法
|
||
# ============================================================================
|
||
|
||
# 创建占位符纹理
|
||
func _create_placeholder_texture():
|
||
var image = Image.create(32, 32, false, Image.FORMAT_RGBA8)
|
||
|
||
# 创建简单的草地图案
|
||
var grass_color = Color(0.3, 0.8, 0.3, 1.0) # 亮绿色
|
||
var dark_color = Color(0.2, 0.6, 0.2, 1.0) # 深绿色
|
||
|
||
# 填充基础颜色
|
||
image.fill(grass_color)
|
||
|
||
# 添加简单的格子图案
|
||
for x in range(32):
|
||
for y in range(32):
|
||
if (x + y) % 8 < 4:
|
||
image.set_pixel(x, y, dark_color)
|
||
|
||
# 创建纹理
|
||
var placeholder_texture = ImageTexture.new()
|
||
placeholder_texture.set_image(image)
|
||
texture = placeholder_texture
|
||
|
||
# 验证纹理尺寸
|
||
func _validate_texture():
|
||
if texture:
|
||
var size = Vector2i(texture.get_width(), texture.get_height())
|
||
if size.x % 32 != 0 or size.y % 32 != 0:
|
||
push_warning("GrassTile: 纹理尺寸不是32的倍数: " + str(size))
|
||
return false
|
||
return true
|
||
return false
|
||
|
||
# ============================================================================
|
||
# 调试方法
|
||
# ============================================================================
|
||
|
||
# 获取瓦片信息
|
||
func get_tile_info() -> Dictionary:
|
||
return {
|
||
"grid_position": grid_position,
|
||
"world_position": position,
|
||
"texture_size": texture.get_size() if texture else Vector2.ZERO,
|
||
"auto_snap": auto_snap
|
||
}
|
||
|
||
# 打印瓦片信息
|
||
func print_info():
|
||
var info = get_tile_info()
|
||
print("=== 草地瓦片信息 ===")
|
||
for key in info:
|
||
print(key, ": ", info[key]) |