# ============================================================================ # 简单草地瓦片 - 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])