簡體   English   中英

如何使用CoreMotion向左或向右移動精靈?

[英]How to move sprite just left or right using CoreMotion?

對於我正在創建的這款游戲,我希望通過向左或向右傾斜設備來使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 */



}







}

您應該遵循快速的准則,屬性不應以大寫字母開頭,而應僅使用類,結構,枚舉和協議。 它使代碼在堆棧溢出時更難閱讀(代碼標記為藍色,但不應標記為藍色),並且一般而言,這不是一個好習慣。

將您的代碼更改為此,因為有一些錯誤。

 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)

在運動隊列代碼中,您正在操縱場景本身,因此將無法使用。

嘗試使用使用物理物體移動精靈的代碼。 這是做的我的首選方式,因為它給人的精靈更自然的運動,尤其是改變方向時,比起直接操縱精靈position屬性(如果你想比直接操縱精靈position屬性閱讀這篇文章。 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以獲取所需的力,具體取決於子圖形的大小(力越大,力越大)。 大的精靈需要移動幾千個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM