我有一个由加速度计控制的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
动作停止屏幕,并在节点返回屏幕后再次启动。
谢谢!
答案 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 isIt
将isIt
返回给发件人(称为&#39;该功能的事物)
就是这样。
theNode
不是theScene
的孩子,则可能需要将theNode
的坐标空间的位置转换为theScene
的位置。