【问题标题】:How to move sprite just left or right using CoreMotion?如何使用 CoreMotion 向左或向右移动精灵?
【发布时间】:2016-07-31 03:52:24
【问题描述】:

对于我正在创建的这个游戏,我希望通过向左或向右倾斜设备来让 Sprite“角色”向左或向右移动。

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

当我运行它时,“字符”只向一个方向移动,并且仍然向上或向下移动。

我只想让“字符”只向左或向右移动,而不是向上或向下移动。

有什么帮助吗?

下面是 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 */



}







}

【问题讨论】:

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


    【解决方案1】:

    你应该遵循 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)
    

    在您的运动队列代码中,您正在操纵场景本身,因此这不起作用。

    试试这个代码,它使用物理体来移动精灵。这是我的首选方式,因为与直接操作精灵位置属性相比,它使精灵更自然的运动,尤其是在改变方向时(如果你想直接操作精灵位置属性,请阅读本文。http://www.ioscreator.com/tutorials/move-sprites-accelerometer-spritekit-swift

       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 以获得所需的力,具体取决于精灵的大小(越高力越大)。大精灵正确地需要几千个才能移动。

    【讨论】:

    • 我的角色似乎还是摔倒了,有什么办法可以阻止角色摔倒,但仍然让它向左或向右移动?为了确保,是的​​,游戏是横向的。
    • 要阻止你的角色坠落,你必须关闭它的重力,这是默认开启的。 Character.physicsBody?.affectedByGravity = false
    • 所以我确实添加了那一行代码,但是除了掉下来之外,它就保持在原地。有什么想法吗?
    • 给我几分钟。生病检查模拟器
    • 非常感谢您帮助我。如果这有帮助,我正在使用我的 iPhone 6s 来测试我的应用程序,因为 MacBook 没有任何类型的加速度计/陀螺仪。
    猜你喜欢
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多