forked from moyin/whale-town-front
scene:创建草地瓦片预制体
- 实现GrassTile组件,支持32x32网格对齐 - 添加自动纹理验证和占位符生成 - 提供网格位置设置和世界坐标转换 - 包含位置变化信号和调试功能
This commit is contained in:
122
scenes/prefabs/GrassTile.gd
Normal file
122
scenes/prefabs/GrassTile.gd
Normal file
@@ -0,0 +1,122 @@
|
||||
# ============================================================================
|
||||
# 简单草地瓦片 - 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])
|
||||
10
scenes/prefabs/grass_tile_prefab.tscn
Normal file
10
scenes/prefabs/grass_tile_prefab.tscn
Normal file
@@ -0,0 +1,10 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://bvxqm8n7qwqxe"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/prefabs/GrassTile.gd" id="1_0x8qm"]
|
||||
|
||||
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_1"]
|
||||
size = Vector2(32, 32)
|
||||
|
||||
[node name="GrassTile" type="Sprite2D"]
|
||||
texture = SubResource("PlaceholderTexture2D_1")
|
||||
script = ExtResource("1_0x8qm")
|
||||
Reference in New Issue
Block a user