【发布时间】:2022-07-29 08:28:53
【问题描述】:
我正在开发一款游戏,其中一个关卡被分隔成多个房间,而摄像头被限制在当前房间内,这意味着摄像头不会“渗入”相邻的房间。房间是一个场景 RoomBase,由 Positions RoomLimitTopLeft 和 RoomLimitBottomRight(定义相机的限制)和一个检测玩家何时进入房间的 Area2D 组成。由于每个房间的大小和出口都会很谨慎,我创建了一个脚本,将 Area2D 的 CollisionShape 拉伸到房间的大小。
RoomBase.gd
const ROOM_TRANS_LIMIT = 16
onready var limit_tl = $RoomLimitTopLeft # Position
onready var limit_br = $RoomLimitBottomRight # Position
onready var room_transition = $RoomTransition # Area2D
onready var room_transition_coll = $RoomTransition/CollisionShape2D
func setRoomTransition():
var width = limit_br.position.x - limit_tl.position.x - 2*ROOM_TRANS_LIMIT
var height = limit_br.position.y - limit_tl.position.y - 2*ROOM_TRANS_LIMIT
self.room_transition.position = Vector2(limit_br.position.x/2, limit_br.position.y/2)
self.room_transition_coll.shape.set_extents(Vector2(width/2, height/2))
此代码将 Area2D 的位置置于其房间的中心,并将其碰撞延伸到几乎覆盖整个房间,这仅适用于一个房间。但是,如果一个关卡由多个房间组成,最新的房间实例会覆盖之前的碰撞形状。例如,如果房间 1 是水平的,房间 2 是垂直的,那么房间 1 将共享 2 的垂直碰撞形状。
是否可以在不影响任何其他场景的情况下更改单个场景实例的碰撞?
【问题讨论】:
-
顺便说一下,你可以输入你的变量。例如
onready var room_transition:Area2d = $RoomTransition。见Static typing in GDScript。