Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SKScene,当两个SKSPRITENODE在彼此的x范围内时检测?_Ios_Swift_Sprite Kit_Skspritenode_Skscene - Fatal编程技术网

Ios SKScene,当两个SKSPRITENODE在彼此的x范围内时检测?

Ios SKScene,当两个SKSPRITENODE在彼此的x范围内时检测?,ios,swift,sprite-kit,skspritenode,skscene,Ios,Swift,Sprite Kit,Skspritenode,Skscene,我是SpriteKit的新手,我不确定我想要完成的东西是否已经在内置对象(如SKPhysics和SKRegion)中不可能实现 简而言之,我需要一个事件处理程序,一旦敌人的SKSpriteNode进入某个范围内,就触发SKSpriteNode的自定义子类 我正在构建一个RTS,到目前为止,我这几天面临的最大问题是如何让两个SKSpriteNodes检测它们是否在彼此的近距离内 现在,我的解决方案似乎相当老套。在我的SKScene中的SKSpriteNode移动50或-50点之前,它将首先检查该移

我是SpriteKit的新手,我不确定我想要完成的东西是否已经在内置对象(如SKPhysics和SKRegion)中不可能实现

简而言之,我需要一个事件处理程序,一旦敌人的SKSpriteNode进入某个范围内,就触发SKSpriteNode的自定义子类

我正在构建一个RTS,到目前为止,我这几天面临的最大问题是如何让两个SKSpriteNodes检测它们是否在彼此的近距离内

现在,我的解决方案似乎相当老套。在我的SKScene中的SKSpriteNode移动
50
-50
点之前,它将首先检查该移动是否被允许

下面是我的抽象类“PathFindingUnit”的一个示例:

如果此方法返回true,则该单元的精灵将执行SKAction在X维度上移动-50。否则,什么也不会发生

这是单位精灵决定是否可以移动的方式:

func thereIsAnObstacleInTheWay(destination: CGPoint) -> Bool {
    let getNodesAtDestination = ReferenceOfGameScene!.nodesAtPoint(destination)
    for node in getNodesAtDestination {
        if node is SKBlockMovementSpriteNode {
            return true
        }
    }
    return false
}
在很大程度上,它和魔兽争霸II中的寻路功能一样强大。但每当我尝试改进这种方法时,我总是遇到:

异常:EXC\u错误访问(代码=1,地址=0xf91002028))

我在实现时就开始经常遇到这个问题:
activateenemiesnear(pointDestination)

由于单位
self
,将激活其他单位并命令它们攻击
self

因此,总而言之,在
SKSpriteNode
场景中,拥有
SKSpriteNode
的单位是否应该调用其他拥有类似
SKSpriteNode
的单位的方法,通过使用敌方单位自身的参考变量,调用敌方单位自身的移动到点方法

我试着使用SKPhysics,虽然效果不错,但由于两个SKSpriteNodes接触时发生的碰撞物理效应,SKSpriteNodes的位置会抖动

我曾想过使用SKRegion,但我在弄清楚如何调用它们并将其插入SKScene时遇到了很多麻烦,而且SKRegion上的官方苹果文档似乎非常有限:


“单位视线”的最佳区域是什么?为了让单位检测到敌人正在接近?

我倾向于使用
SKPhysicsBody
来检测一个物体是否与另一个
SKPhysicBody
标记的特定区域发生碰撞,例如用特定的
CGPath
创建的区域,因此您可以:

SKPhysicsBody.init(edgeLoopFromPath: zonePath!) // zonePath is a CGPath
但是,如果您不想使用它,还有一个小功能可以帮助您进行计算:

func getDistance(p1:CGPoint,p2:CGPoint)->CGFloat {
    let xDist = (p2.x - p1.x)
    let yDist = (p2.y - p1.y)
    return CGFloat(sqrt((xDist * xDist) + (yDist * yDist)))
}
关于最后一种方法,您可以发现以下方法也很有用:

/* Return true if `point' is contained in `rect', false otherwise. */

@available(iOS 2.0, *)
public func CGRectContainsPoint(rect: CGRect, _ point: CGPoint) -> Bool

/* Return true if `rect2' is contained in `rect1', false otherwise. `rect2'
   is contained in `rect1' if the union of `rect1' and `rect2' is equal to
   `rect1'. */

@available(iOS 2.0, *)
public func CGRectContainsRect(rect1: CGRect, _ rect2: CGRect) -> Bool

/* Return true if `rect1' intersects `rect2', false otherwise. `rect1'
   intersects `rect2' if the intersection of `rect1' and `rect2' is not the
   null rect. */

@available(iOS 2.0, *)
public func CGRectIntersectsRect(rect1: CGRect, _ rect2: CGRect) -> Bool

我倾向于使用
SKPhysicBody
来检测一个物体是否与另一个
SKPhysicBody
标记的特定区域碰撞,例如使用特定的
CGPath
创建的区域,因此您可以:

SKPhysicsBody.init(edgeLoopFromPath: zonePath!) // zonePath is a CGPath
但是,如果您不想使用它,还有一个小功能可以帮助您进行计算:

func getDistance(p1:CGPoint,p2:CGPoint)->CGFloat {
    let xDist = (p2.x - p1.x)
    let yDist = (p2.y - p1.y)
    return CGFloat(sqrt((xDist * xDist) + (yDist * yDist)))
}
关于最后一种方法,您可以发现以下方法也很有用:

/* Return true if `point' is contained in `rect', false otherwise. */

@available(iOS 2.0, *)
public func CGRectContainsPoint(rect: CGRect, _ point: CGPoint) -> Bool

/* Return true if `rect2' is contained in `rect1', false otherwise. `rect2'
   is contained in `rect1' if the union of `rect1' and `rect2' is equal to
   `rect1'. */

@available(iOS 2.0, *)
public func CGRectContainsRect(rect1: CGRect, _ rect2: CGRect) -> Bool

/* Return true if `rect1' intersects `rect2', false otherwise. `rect1'
   intersects `rect2' if the intersection of `rect1' and `rect2' is not the
   null rect. */

@available(iOS 2.0, *)
public func CGRectIntersectsRect(rect1: CGRect, _ rect2: CGRect) -> Bool

SKRegion不是您想要的,它不会发送任何事件,它用于定义一个点是否位于某个区域中,因此您可以使用它来确定精灵到地面的距离,如果您想查看两个精灵是否在范围内,则SKPhysicsBody可能会有所帮助,但可能会很昂贵。如果未正确完成默认情况下,碰撞遮罩在所有实体上都设置为0xFFFFFF,将其设置为0SKRegion不是您想要的,这不会发送任何事件,它用于定义点是否位于区域中,因此您将使用它来确定精灵到地面的距离,如果您想查看2个精灵是否在范围内,则SKPhysicsBody可以提供帮助,但是可能很贵。如果没有正确执行默认情况下,所有物体上的碰撞遮罩都设置为0xFFFFFF,将其设置为0这是RTS,我将尽可能避免SQRT,距离平方工作正常,他只需要确保敌人距离平方更近这是RTS,我将尽可能避免SQRT,距离平方工作正常,他只需要确保敌人的距离小于距离的平方