[英]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.