[英]How to determine which room a player is in?
我正在開發一款 2D 平台視頻游戲。 房間分為多個區域,這些區域本質上是無形的碰撞箱。 攝像機受這些碰撞框的限制,在玩家轉換到新房間之前不會顯示隔壁房間里的東西。
如果玩家從一個房間走到另一個房間,攝像機就會平移到新房間。 平移相機會暫停物理引擎,以確保玩家不會在相機處於 animation 時破壞游戲或死亡。
我的問題在於玩家一次不屬於一個房間,因為玩家的碰撞箱是 2D 的。 當玩家在房間之間移動時,在短時間內,碰撞箱會同時覆蓋兩個房間。
這意味着,如果我在玩家進入新房間時平移相機,玩家可以部分進入新房間(同時仍留在舊房間),然后 go 回到舊房間,這不會平移相機回來,因為他們在技術上從未進入過舊房間。 他們怎么可能進去? 他們從未離開過它!
這也意味着,如果我在玩家離開房間時搖攝鏡頭,玩家可以部分進入新房間,然后離開他們從未完全進入過的新房間。 這意味着攝像機平移到它已經在的同一個房間(這播放了一個奇怪的 animation,並暫停了物理引擎)。
如何確定相機應平移到哪個房間?
我有權訪問:
func _on_room_area_2d_body_entered(body): # body enters room
if body.is_in_group("junko"): # is this the player?
player_inside = true
junko.pan_camera(self) # pan the camera
func _on_room_area_2d_body_exited(body): # body exits room
if body.is_in_group("junko"): # is this the player?
player_inside = false
僅僅因為房間很大,並不意味着他們必須跟蹤其中的內容。 相反,角色可以跟蹤它在哪些房間內。
如果要檢測區域,則需要一個區域。 所以讓你的玩家角色成為一個 area 孩子......我稱之為locator
。 然后設置locator
以檢測構成房間的區域。 這意味着locator
必須被監控,並且房間必須是monitorable
的。 並且房間的碰撞層必須與locator
的碰撞遮罩重疊。
然后你可以使用area_entered
和area_exited
(注意這些信號被稱為area_*
而不是body_*
)。
您可能會發現在_physics_process
中的detector
上調用get_overlapping_areas
更容易,然后從結果中選擇房間。
for entry in $locator.get_overlapping_areas():
prints(entry)
然后也許只有在只有一個房間並且不是相機當前所在的房間時才搖攝相機,或者一些類似的規則。
事實上,您不需要檢測器。 您可以按照“Yakov Galka”在評論中的建議進行操作,並詢問 Godot 特定點的區域。
你用intersect_point
做到這一點:
var result:Array = get_world().direct_space_state.intersect_point(
global_position,
32,
[],
2147483647,
false,
true
)
然后返回一個包含結果的Array
。 所以你可以這樣迭代:
for entry in result:
prints(entry.collider)
解釋一下參數:
global_position
。32
)。[]
)。2147483647
是所有位)false
)true
)。請注意,即使這只是檢查一個點,也不能保證您有一個結果(如果區域重疊,您可以有多個)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.