我目前在一家2D无止境跑步公司工作。在游戏中,您可以更改角色的状态,然后遍历对象。但是,如果玩家在一个对象内部,则在离开该对象之前,他不应该能够切换回另一个状态。
目前,我正在检查此状态,如下所示:
if((thePlayer.physicsBody?.allContactedBodies())! != [])
{
for object in (thePlayer.physicsBody?.allContactedBodies())!
{
guard let node = object.node
else
{
return
}
// Player IN a Block?
if node.frame.minX < thePlayer.frame.maxX - 1 &&
node.frame.maxX > thePlayer.frame.minX + 1 &&
node.frame.maxY > thePlayer.frame.minY + 1 &&
node.frame.minY < thePlayer.frame.maxY - 1
{
//Player is IN a Block
isInBlock = true
}
}
}
我对这种解决方案并不满意,因为我通过SKReferenceNode添加了新的级别序列,而该节点中的级别对象不会响应这种检查方式。
我假设这是因为SKReferenceNode内的节点使用SKReferenceNode的坐标系,而播放器使用主坐标系。
无论如何,我不确定这是否是最好的解决方案。
有什么更好的方法可以做到这一点?
或者我至少该如何解决SKReferenceNode问题?
编辑:
我更改了代码的结构,所以现在只要播放器轻触屏幕,我就只检查冲突。
这仍然留下了关于坐标系和SKReferenceNode的问题。
我仔细看了一下,现在我确信,这就是问题所在。
如何获取SKReferenceNode内的节点在主场景坐标系中的位置?