使运行动作的SKSpriteNode与屏幕边缘

时间:2015-12-13 15:43:18

标签: swift sprite-kit skspritenode skphysicsbody skaction

我有一个由加速度计控制的SKSpriteNode,可以左右移动:

var destX = myNode.position.x

override func update(currentTime: CFTimeInterval) {
    if let data = motionManager.accelerometerData {

        let currentX = self.myNode.position.x

        if data.acceleration.x < 0 {
            self.destX = currentX + CGFloat(data.acceleration.x * 2000)
        } else if data.acceleration.x > 0 {
            self.destX = currentX + CGFloat(data.acceleration.x * 2000)
        }
        else if data.acceleration.x == 0 {
            self.destX = currentX
        }
    }
}

然后,在更新方法中,我创建了一个SKAction来将SpriteNode移动到destX

if alive {

        let action = SKAction.moveToX(destX, duration: 1)
        self.myNode.runAction(action)

    }

右 - 左运动正常。我现在需要做的是让节点不能离开屏幕。我尝试在屏幕边缘放置一个物理体:

self.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRectMake(0, 0, self.size.width, self.size.height))
self.physicsBody?.categoryBitMask = PhysicsCategory.ScreenEdge

myNode.physicsBody?.collisionBitMask = PhysicsCategory.ScreenEdge

我让物理机构本身运行正常,但是精灵节点和屏幕边缘之间碰撞不起作用的原因是节点正在运行一个动作,并且动作类似于“覆盖”物理。有没有办法让节点停在屏幕边缘,同时仍然保持加速度计数据的加速度?我知道目前,destX的数字非常高或很低,但这会导致精灵节点快速左右移动。

基本上,我需要一种方法来a)允许在节点上运行SKAction时发生冲突,或者b)当精灵节点离开时使moveToX动作停止屏幕,并在节点返回屏幕后再次启动。

谢谢!

1 个答案:

答案 0 :(得分:1)

也许这可以提供帮助:
(抱歉,目标C,我不是一个快速的程序员,但仍会尝试解释如何用你自己的语言做到这一点)

-(BOOL)isNode:(*SKnode)theNode outOfScene:(*SKScene)theScene
{
BOOL isIt = NO;
if (theNode.position.x > theScene.frame.size.width + (theNode.frame.size.width / 2)){isIt = YES;}
if (theNode.position.x < -(theNode.frame.size.width / 2)){isIt = YES;}
if (theNode.position.y > theScene.frame.size.height + (theNode.frame.size.height / 2)){isIt = YES;}
if (theNode.position.y < -(theNode.frame.size.height / 2)){isIt = YES;}
return isIt;
}

以下是它的工作方式
-(BOOL)isNode:(*SKnode)theNode outOfScene:(*SKScene)theScene新功能,输入变量是:theNode一个节点,以及theScene场景,以查看它是否在其范围内。

BOOL isIt = NO;创建一个新的布尔变量,其默认值为NO

if (theNode.position.x > theScene.frame.size.width){isIt = YES;}
if (theNode.position.x < 0){isIt = YES;}
if (theNode.position.y > theScene.frame.size.height){isIt = YES;}
if (theNode.position.y < 0){isIt = YES;}

检查theNode是否不在theScene的可见范围内。
如果它不在theScene的范围内,则设置为是。 s。这假定theNode的方向是(0,0) - 如果你不知道这意味着什么,你应该忽略它。


return isItisIt返回给发件人(称为&#39;该功能的事物)


就是这样。

注意:此代码尚未经过测试,如果有问题请留言。


修改:如果theNode不是theScene的孩子,则可能需要将theNode的坐标空间的位置转换为theScene的位置。