对于我正在创造的这个游戏,我想要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 */
}
}
答案 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以获得所需的力(更高的力是更大的力)。大精灵适当地需要几千个移动。