SpriteKit - 对象内部的播放器
SpriteKit - Player inside of Object
我目前在 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 位置。不是最好的解决方案,但它工作得很好。
我目前在 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 位置。不是最好的解决方案,但它工作得很好。