2025-04-27/TileMapLayer

將Area2d添加到主場景,

先公開Area2D為公開變量,然后在主場景的檢查器里賦予Area2D場景,

var slime_node = slime_scene.instantiate()

slime_node.position = Vector2(260, randf_range(50, 115))

get_tree().current_scene.add_child(slime_node)

對其初始化,賦予位置及添加到場景里。


場景切換,按鈕觸發(fā)后函數(shù)

var scene = load("res://其他場景名需要帶后綴")

get_tree().change_scene_to_packed(scene)

加載新場景到scene變量,然后改變場景。




新游戲===========================================

新建一個node2D場景為主場景

新建一個CharacterBody2D為角色,命名Player,在節(jié)點下添加一個Sprite2D

將Player拖到主場景節(jié)點下,在文件系統(tǒng)拖動player.tscn 到主場景文字處。

在player.gd里

extends CharacterBody2D

var speed = 80


func move():

var moveDirection = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")

velocity = moveDirection * speed? # 直接賦值給類屬性 velocity


func _physics_process(delta: float) -> void:

move() # 調(diào)用輸入映射

move_and_slide() # 移動角色位置

如果要用ASDW移動需要到項目設(shè)置里的鍵位映射設(shè)置。


給Camera2D 綁定個腳本

使其視角范圍在tileMapLayer的方塊內(nèi)


Camera2D的檢查器里設(shè)置

在Camera2D里的代碼:

extends Camera2D

@export var layer: TileMapLayer? ?#公開TileMapLayer

func _ready() -> void:? ?#初始化代碼

????var mapRect = layer.get_used_rect()? # 返回地圖包圍的矩形,

????var cell_pos = Vector2i(2, 3)

? ??print("該位置瓦片源ID:", ????layer.get_cell_source_id(cell_pos))

? ??print("瓦片坐標(biāo):",layer.get_cell_atlas_coords(cell_pos))

????var tileSize = ????layer.get_cell_atlas_coords(cell_pos)

????var worldSIzeInPixels = mapRect.size * tileSize

????limit_right = worldSIzeInPixels.x + 7

????limit_bottom = worldSIzeInPixels.y + 10


教程里的代碼太亂了,自己整理了一下,有些琢磨半天發(fā)現(xiàn)沒用上。

更正后的代碼:

#var cell_pos = Vector2i(0, 0) #print("網(wǎng)格在圖塊里的源ID:", #layer.get_cell_source_id(cell_pos)) #print("網(wǎng)格的圖塊坐標(biāo):", #layer.get_cell_atlas_coords(cell_pos))

上邊這個用不上,但以后可能需要用掉所以不刪除,僅注釋掉


# 返回Rect2i類型,其類型有position,end,size屬性

# 獲取layer已使用區(qū)域的網(wǎng)格坐標(biāo)范圍(Rect2i)

var mapRect = layer.get_used_rect()

# 獲取單個網(wǎng)格像素大小

var tileSize = layer.tile_set.tile_size

# 網(wǎng)格坐標(biāo) * 單個網(wǎng)格像素 = layer的像素坐標(biāo)

var worldPositionInPixels = mapRect.position * tileSize

# 網(wǎng)格數(shù) * 單個網(wǎng)格像素 = layer的總像素大小

var worldSIzeInPixels = mapRect.size * tileSize

limit_left = worldPositionInPixels.x

limit_top = worldPositionInPixels.y

# 世界的總x + 坐標(biāo)x = 世界絕對x

limit_right = worldSIzeInPixels.x + worldPositionInPixels.x

# 世界的總y + 坐標(biāo)y = 世界絕對y

limit_bottom = worldSIzeInPixels.y + worldPositionInPixels.y

print("layer_x : ", worldPositionInPixels.x, " layer_y : ", worldPositionInPixels)

print("layer_w + layer_x = ", limit_right, "\nlayer_h + layer_y = ", limit_bottom)



Rect屬性


區(qū)別
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容