2016-11-23 9 views
0

私は、プレーヤーを移動するために画面を傾けるというオプションを使用しようとしています。だから私はRay Wenderlichと彼の宇宙侵略者チュートリアルの指示に従った。私はちょうど私のプレーヤーが画面を傾けるときに左から右に動いていない理由を把握していないようです。傾けるときに私のプレイヤーがSpriteKitで動かないのはなぜですか?

私を助けるためにそれを見てください。

import SpriteKit 
import CoreMotion 

enum BodyType: UInt32 { 
case player = 2 
case enemy = 3 
} 
let motionManager = CMMotionManager() 

class GameScene: SKScene, SKPhysicsContactDelegate { 

let points = SKLabelNode(text: "0") 

let gamePlayerSize = CGSize(width: 30, height: 16) 
let gamePlayerName = "gameplayer" 


override func didMove(to view: SKView) { 


//SET UP FRAME 
physicsBody = SKPhysicsBody(edgeLoopFrom: frame) 

//SETTING UP Player 
func setupPlayer() { 
    // 1 
    let player = makePlayer() 

    // 2 
    player.position = CGPoint(x: 240, y: 28) 
    addChild(player) 
} 

func makePlayer() -> SKNode { 
    let player = SKSpriteNode(imageNamed: "block") 
    player.name = gamePlayerName 

    // 1 
    player.physicsBody = SKPhysicsBody(rectangleOf: player.frame.size) 

    // 2 
    player.physicsBody!.isDynamic = true 

    // 3 
    player.physicsBody!.affectedByGravity = false 

    // 4 
    player.physicsBody!.mass = 0.02 


    return player 
} 

setupPlayer() 

motionManager.startAccelerometerUpdates() 

//score label 
let points = SKLabelNode(text: "0") 
points.position = CGPoint(x: 280, y: 510) 
points.fontColor = UIColor.black 
points.fontSize = 50 
addChild(points) 

// setting border around game 
let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame) 
borderBody.friction = 0 
self.physicsBody = borderBody 

//ENEMY SETTINGS START 

//repeat enemy spawning 
run(SKAction.repeatForever(
    SKAction.sequence([ 
     SKAction.run(spawnEnemy), 
     SKAction.wait(forDuration: 1.0)]))) 

} 
//Enemy settings 
func random() -> CGFloat { 
    return CGFloat(Float(arc4random())/0xFFFFFFFF) 
} 

func random(min: CGFloat, max: CGFloat) -> CGFloat { 
    return random() * (max - min) + min 
} 

//spawn enemies 
func spawnEnemy() { 
    // 2 
    let enemy = SKSpriteNode(imageNamed: "ball") 
    // 3 
    enemy.name = "enemy" 
    // 4 
    enemy.position = CGPoint(x: frame.size.width * random(min: 0, max: 1), y: frame.size.height + enemy.size.height/2) 
    // 5 
    addChild(enemy) 

    enemy.run(
     SKAction.moveBy(x: 0.0 , y: -size.height - enemy.size.height, 
         duration: TimeInterval(random(min: 1, max: 2)))) 

//ENEMY SETTINGS END 

    func processUserMotion(forUpdate currentTime: CFTimeInterval) { 
     // 1 
     if let player = childNode(withName: gamePlayerName) as? SKSpriteNode { 
      // 2 
      if let data = motionManager.accelerometerData { 
       // 3 
       if fabs(data.acceleration.x) > 0.2 { 
        // 4 How do you move the ship? 
        player.physicsBody!.applyForce(CGVector(dx: 40 * CGFloat(data.acceleration.x), dy: 0)) 
       } 
      } 
     } 
    } 


func update(_ currentTime: TimeInterval) { 
    processUserMotion(forUpdate: currentTime) 
} 
    } } 

答えて

0

偶然、あなたのメソッドをネストしましたか?あなたのコードを見ればそうだ。

モーションコードが実際に呼び出されたかどうか確認しましたか?このような

何かが私がoptionalsを使用することになり、ヒントとして

class GameScene: SKScene { 

    let motionManager = CMMotionManager() 

    override func didMove(to view: SKView) { 
     // setup player etc 
     motionManager.startAccelerometerUpdates() 
    } 

    func update(_ currentTime: TimeInterval) { 
      processUserMotion(forUpdate: currentTime) 
    } 
} 

も動作するはず(?)あなたの物理体の代わりに、力にそれらをアンラップを使用している場合(!)。ある時点でゼロになると、アンラッピングを強制終了するとクラッシュします。

例えば

player.physicsBody?.affectedByGravity = false 

が、これは

を役に立てば幸い
関連する問題