簡體   English   中英

如何確定玩家在哪個房間?

[英]How to determine which room a player is in?

我正在開發一款 2D 平台視頻游戲。 房間分為多個區域,這些區域本質上是無形的碰撞箱。 攝像機受這些碰撞框的限制,在玩家轉換到新房間之前不會顯示隔壁房間里的東西。

如果玩家從一個房間走到另一個房間,攝像機就會平移到新房間。 平移相機會暫停物理引擎,以確保玩家不會在相機處於 animation 時破壞游戲或死亡。

我的問題在於玩家一次不屬於一個房間,因為玩家的碰撞箱是 2D 的。 當玩家在房間之間移動時,在短時間內,碰撞箱會同時覆蓋兩個房間。

這意味着,如果我在玩家進入新房間時平移相機,玩家可以部分進入新房間(同時仍留在舊房間),然后 go 回到舊房間,這不會平移相機回來,因為他們在技術上從未進入過舊房間。 他們怎么可能進去? 他們從未離開過它!

這也意味着,如果我在玩家離開房間時搖攝鏡頭,玩家可以部分進入新房間,然后離開他們從未完全進入過的新房間。 這意味着攝像機平移到它已經在的同一個房間(這播放了一個奇怪的 animation,並暫停了物理引擎)。

如何確定相機應平移到哪個房間?

我有權訪問:

  1. 當玩家進入一個房間時,進入哪個房間。
  2. 玩家何時退出房間,以及退出哪個房間。
  3. 所有房間,以及所有房間的變量。
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_enteredarea_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM