我目前正在使用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内部节点在主场景坐标系中的位置?
最佳答案
基本上,我保留了最初的解决方案,因为我只在用户更改角色状态时检查玩家是否在方块内。这使得代码非常有效,因为它也仅检查此时正在接触播放器的节点。
我还解决了我剩下的问题,那就是我通过SKReferenceNode添加的节点使用了播放器以外的其他坐标系。
现在,我只是将SKReferenceNode的X位置添加到碰撞节点的X位置。这不是最好的解决方案,但效果很好。
关于ios - SpriteKit-对象内部的播放器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48469745/