我目前在一家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添加了新的level序列,而该节点中的level对象不会响应这种检查方式。
我认为这是因为SKReferenceNode内部的节点使用SKReferenceNode的坐标系,而播放器使用的是主坐标系。
无论如何,我不确定这是不是最好的解决方案。什么是更好的方法呢?或者我怎样才能至少解决SKReferenceNode问题?
编辑:我改变了代码的结构,现在我只在玩家点击屏幕的时候检查碰撞。这仍然保留了有关坐标系和SKReferenceNode的问题。我仔细看了看,现在我确信,这就是问题所在。
如何获取SKReferenceNode内部节点在主场景坐标系中的位置?
发布于 2018-02-04 06:40:16
基本上,我保留了最初的解决方案,因为我只在用户更改角色状态时检查玩家是否在块中。这使得代码非常高效,因为它也只检查节点,这些节点在这一时刻接触到了玩家。
我还修复了剩余的问题,即我通过SKReferenceNode添加的节点使用了与播放器不同的另一个坐标系。现在我只获取SKReferenceNode的X位置,并将其添加到碰撞节点的X位置。这不是最好的解决方案,但它工作得很好。
https://stackoverflow.com/questions/48469745
复制相似问题