如何使用CoreMotion向左或向右移动精灵?

时间:2016-04-09 23:40:26

标签: ios swift sprite-kit skspritenode core-motion

对于我正在创造的这个游戏,我想要Sprite" Character"通过向左或向右倾斜设备向左或向右移动。

我调查了它并更改了代码,但似乎它不起作用。

当我运行时,"字符"只朝一个方向移动,仍然向上或向下移动。

我想要"字符"只向左或向右移动,而不是向上或向下移动。

对此有何帮助?

以下是GameScene.swift文件:

import SpriteKit

import CoreMotion

class GameScene: SKScene {

let motionManager = CMMotionManager()

var Ground = SKSpriteNode()

var Character = SKSpriteNode()

override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    Character = SKSpriteNode(imageNamed: "NinjaGhost")
    Character.physicsBody = SKPhysicsBody(circleOfRadius:    Character.size.height)
    Character.size = CGSize(width: 200, height: 200)
    Character.physicsBody?.allowsRotation = false
    Character.zPosition = 2
    Character.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
    self.addChild(Character)

    Ground = SKSpriteNode(imageNamed: "Dirt Background")
    Ground.size = CGSize(width: 1920, height: 1080)
    Ground.zPosition = 1
    Ground.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
    self.addChild(Ground)

    motionManager.startAccelerometerUpdates()
    motionManager.accelerometerUpdateInterval = 0.1
    motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue() ) {
        (data, error) in

self.physicsWorld.gravity = CGVectorMake(CGFloat((data?.acceleration.x)!) * 1, 0)
}
}







override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
   /* Called when a touch begins */

}

override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */



}







}

1 个答案:

答案 0 :(得分:2)

你应该遵循swift准则,你的属性不应该以大写字母开头,只有类,结构,枚举和协议应该。它使代码更难以读取堆栈溢出(代码标记为蓝色但不应该),并且通常不是很好的做法。

将代码更改为此,因为存在一些错误。

 character = SKSpriteNode(imageNamed: "NinjaGhost")
 character.size = CGSize(width: 200, height: 200) // Better to call this before positioning
 character.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2) // Give pos before physics body
 character.physicsBody = SKPhysicsBody(circleOfRadius: character.size.width / 2) // You have to divide by 2 when using circleOfRadius to get proper size in relation to the sprite
 character.physicsBody?.allowsRotation = false
 character.physicsBody?.affectedByGravity = false // Stop falling
 character.zPosition = 2
 self.addChild(character)

在您的动作队列代码中,您正在操纵场景本身,因此无法正常工作。

尝试使用物理主体移动精灵的代码。这是我首选的方法,因为与直接操作精灵位置属性相比,它可以让精灵更自然地移动,特别是在改变方向时(如果你想直接操纵精灵位置属性而不是阅读本文。{{3} })

   if let error = error { // Might as well handle the optional error as well
          print(error.localizedDescription)
          return
   }

   guard let data = motionManager.accelerometerData else { return }
   if UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft {
        character.physicsBody?.applyForce(CGVectorMake(-100 * CGFloat(data.acceleration.y), 0))
    } else {
        character.physicsBody?.applyForce(CGVectorMake(100 * CGFloat(data.acceleration.y), 0))
    }

这将使精灵在x轴上移动。我正在使用data.acceleration.y因为在这个例子中游戏是横向的,所以你必须使用Y数据在x轴上移动它。

我还在检查设备的横向方向,以便运动在两个方向都有效。

根据精灵的大小调整100以获得所需的力(更高的力是更大的力)。大精灵适当地需要几千个移动。