2016-04-09 3 views
1

Pour ce jeu que je suis en train de créer, je veux que le "Personnage" des Sprites se déplace vers la gauche ou vers la droite en inclinant l'appareil vers la gauche ou vers la droite. Je l'ai examiné et changé le code, mais il semble que cela ne fonctionne pas. Lorsque je l'exécute, le "Caractère" ne se déplace que dans une direction et continue de monter ou de descendre. Je voudrais simplement que le "Caractère" se déplace uniquement vers la gauche ou la droite, pas vers le haut ou vers le bas.Comment déplacer un sprite juste à gauche ou à droite à l'aide de CoreMotion?

Vous avez de l'aide?

Voici un aperçu du fichier 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 */ 



} 







} 

Répondre

2

Vous devez suivre les directives rapides, vos propriétés ne doivent pas commencer par des lettres majuscules, seules les classes, les structures, les énumérations et les protocoles devraient. Il rend le code plus difficile à lire lors du débordement de la pile (le code est marqué en bleu mais ne devrait pas l'être) et, en général, ce n'est pas une bonne pratique.

Modifiez votre code car il y a eu quelques erreurs.

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) 

Dans votre code de file d'attente de mouvement, vous manipulez la scène elle-même, cela ne fonctionnera donc pas.

Essayez plutôt ce code qui utilise le corps physique pour déplacer l'image-objet. C'est ma façon préférée de le faire parce qu'il donne au sprite plus de mouvement naturel, surtout en changeant de direction, par rapport à manipuler directement la propriété de position des sprites (Si vous voulez manipuler directement la propriété sprite position, lisez cet article.)

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)) 
    } 

Ceci fera bouger l'image-objet sur l'axe des x. J'utilise data.acceleration.y parce que dans cet exemple le jeu est en paysage, donc vous devez utiliser les données Y pour le déplacer sur l'axe des x.

Je vérifie également dans quel sens le dispositif est orienté en mode paysage pour que le mouvement fonctionne dans les deux orientations.

Ajustez le 100 ici pour obtenir la force désirée en fonction de la taille de l'image-objet (plus la force est élevée). Les grands sprites ont besoin de quelques milliers pour bouger.

+0

il semble toujours que mon personnage tombe en panne, y a-t-il un moyen d'arrêter la chute du personnage tout en le faisant bouger à gauche ou à droite? Et pour être sûr, oui le jeu est en paysage. – AS2345

+0

pour empêcher votre personnage de tomber, vous devez désactiver la gravité, qui est activée par défaut. Character.physicsBody? .affectedByGravity = false – crashoverride777

+0

J'ai donc ajouté cette ligne de code, mais à part de tomber, elle reste juste en place. Des pensées? – AS2345