2015-07-03 2 views
0

Я делаю игру в комплекте спрайтов, и для того, чтобы переместить своего персонажа, я применяю импульс, но это проблема, потому что он перемещает его каждые 50 пикселей или около того. Мой вопрос: может кто-нибудь, пожалуйста, покажите мне, как создать простой контроллер символов, чтобы мой персонаж мог двигаться непрерывно, пока пользователь не перейдет от удержания экрана?Как создать простой контроллер символов в SpriteKit?

Мой GameScene.swift файл:

import SpriteKit 


class GameScene: SKScene, SKPhysicsContactDelegate { 

let character = SKSpriteNode(texture: SKTexture(imageNamed: "character")) 
var move = false 

override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 
    //world 
    self.physicsWorld.contactDelegate = self 
    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 


    //character 
    character.position = CGPointMake(self.frame.size.width * 0.6, self.frame.size.height * 0.6) 
    character.setScale(0.2) 
    character.physicsBody = SKPhysicsBody(rectangleOfSize: character.size) 
    character.physicsBody?.dynamic = true 
    character.physicsBody?.allowsRotation = false 
    self.addChild(character) 
    character.physicsBody?.affectedByGravity = true 




    //platform 1 
    var platform = SKSpriteNode(texture: SKTexture(imageNamed: "platform")) 
    platform.position = CGPointMake(self.frame.size.width * 0.6, CGRectGetMidY(self.frame)) 
    platform.physicsBody = SKPhysicsBody(rectangleOfSize: platform.size) 
    platform.physicsBody?.dynamic = false 
    platform.setScale(0.25) 
    platform.physicsBody?.friction = 1 
    platform.physicsBody?.restitution = 0 
    platform.physicsBody?.linearDamping = 0 
    self.addChild(platform) 

    //platform 2 
    var platformTexture2 = SKTexture(imageNamed: "platform") 
    var platform2 = SKSpriteNode(texture: platformTexture2) 
    platform2.position = CGPointMake(self.frame.size.width * 0.4, self.frame.size.height * 0.3) 
    platform2.physicsBody = SKPhysicsBody(rectangleOfSize: platform2.size) 
    platform2.physicsBody?.dynamic = false 
    platform2.setScale(0.25) 
    platform2.physicsBody?.friction = 1 
    platform2.physicsBody?.restitution = 0 
    platform2.physicsBody?.linearDamping = 0 
    self.addChild(platform2) 


    //platform main 
    var platformTexture3 = SKTexture(imageNamed: "platform") 
    var platform3 = SKSpriteNode(texture: platformTexture2) 
    platform3.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMinY(self.frame) + platform3.size.height/3) 
    platform3.physicsBody = SKPhysicsBody(rectangleOfSize: platform3.size) 
    platform3.physicsBody?.dynamic = false 
    platform3.setScale(1) 
    platform3.size.width = platform3.size.width * CGFloat(2.0) 
    platform3.physicsBody?.friction = 1 
    platform3.physicsBody?.restitution = 0 
    platform3.physicsBody?.linearDamping = 0 
    self.addChild(platform3) 

    } 

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    /* Called when a touch begins */ 


    for touch: AnyObject in touches { 
    let location = touch.locationInNode(self) 

     if location.x < CGRectGetMidX(self.frame){ 
      character.physicsBody?.applyImpulse(CGVector(dx: -50, dy: 0)) 
     } else if location.x > CGRectGetMidX(self.frame){ 
      character.physicsBody?.applyImpulse(CGVector(dx: 50, dy: 0)) 
         } 
    } 



    func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
     character.physicsBody?.velocity = CGVector(dx: 0, dy: 0) 
} 




func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 


    } 
    }; 
} 

ответ

0

Одним из способов достижения этой цели является поддержание переменной для отслеживания состояния сенсорных событий (слева, справа, или ни одного). Вот основные шаги:

  1. В touchesBegan, Настр.сенс.экр переменных состояний влево или вправо
  2. В update, применяет импульс непрерывно, пока пользователь прикасается к экрану
  3. В touchesEnded, сбрасываемое сенсорное состояние переменной

Вот пример того, как это реализовать ...

Над GameScene Определение класса, добавьте следующий

enum TouchState { 
    case Left 
    case Right 
    case None 
} 

В GameScene добавьте следующую переменную

var touchLocation:TouchState = .None 

В GameScene, добавить или заменить следующие методы

override func update(currentTime: CFTimeInterval) { 
    // Apply impulse to physics body while users is touching the screen 
    switch (touchState) { 
    case .Left: 
     character.physicsBody?.applyImpulse(CGVector(dx: -1, dy: 0)) 
    case .Right: 
     character.physicsBody?.applyImpulse(CGVector(dx: 1, dy: 0)) 
    case .None: 
     break 
    } 
} 

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    for touch:AnyObject in touches { 
     let location = touch.locationInNode(self) 
     if location.x < CGRectGetMidX(self.frame) { 
      touchState = .Left 
     } else if location.x > CGRectGetMidX(self.frame) { 
      touchState = .Right 
     } 
    } 
} 

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
    // Update touch status 
    touchState = .None 
} 

Вот GameScene.swift .. .

import SpriteKit 

enum TouchLocation { 
    case Left 
    case Right 
    case None 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 
    var character = SKSpriteNode(imageNamed: "character") 

    var touchLocation:TouchLocation = .None 

    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 
     scaleMode = .ResizeFill 

     //character 
     character.position = CGPointMake(view.frame.size.width * 0.5, view.frame.size.height * 0.5) 
     character.setScale(0.1) 
     character.physicsBody = SKPhysicsBody(rectangleOfSize: character.size) 
     character.physicsBody?.dynamic = true 
     character.physicsBody?.allowsRotation = false 
     self.addChild(character) 
     character.physicsBody?.affectedByGravity = true 


     //platform 1 
     var platform = SKSpriteNode(texture: SKTexture(imageNamed: "platform")) 
     platform.position = CGPointMake(view.frame.size.width * 0.6, CGRectGetMidY(view.frame)) 
     platform.physicsBody = SKPhysicsBody(rectangleOfSize: platform.size) 
     platform.physicsBody?.dynamic = false 
     platform.setScale(0.25) 
     platform.physicsBody?.friction = 1 
     platform.physicsBody?.restitution = 0 
     platform.physicsBody?.linearDamping = 0 
     self.addChild(platform) 

     //platform 2 
     var platformTexture2 = SKTexture(imageNamed: "platform") 
     var platform2 = SKSpriteNode(texture: platformTexture2) 
     platform2.position = CGPointMake(view.frame.size.width * 0.4, view.frame.size.height * 0.3) 
     platform2.physicsBody = SKPhysicsBody(rectangleOfSize: platform2.size) 
     platform2.physicsBody?.dynamic = false 
     platform2.setScale(0.25) 
     platform2.physicsBody?.friction = 1 
     platform2.physicsBody?.restitution = 0 
     platform2.physicsBody?.linearDamping = 0 
     self.addChild(platform2) 


     //platform main 
     var platformTexture3 = SKTexture(imageNamed: "platform") 
     var platform3 = SKSpriteNode(texture: platformTexture2) 
     platform3.position = CGPointMake(CGRectGetMidX(view.frame), CGRectGetMinY(view.frame) + platform3.size.height/3) 
     platform3.physicsBody = SKPhysicsBody(rectangleOfSize: platform3.size) 
     platform3.physicsBody?.dynamic = false 
     platform3.setScale(1) 
     platform3.size.width = platform3.size.width * CGFloat(2.0) 
     platform3.physicsBody?.friction = 1 
     platform3.physicsBody?.restitution = 0 
     platform3.physicsBody?.linearDamping = 0 
     self.addChild(platform3) 
    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
     switch (touchLocation) { 
     case .Left: 
      character.physicsBody?.applyImpulse(CGVector(dx: -1, dy: 0)) 
     case .Right: 
      character.physicsBody?.applyImpulse(CGVector(dx: 1, dy: 0)) 
     case .None: 
      break 
     } 
    } 

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
     for touch:AnyObject in touches { 
      let location = touch.locationInNode(self) 
      if location.x < CGRectGetMidX(self.frame) { 
       touchLocation = .Left 
      } else if location.x > CGRectGetMidX(self.frame) { 
       touchLocation = .Right 
      } 
     } 
    } 

    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
     touchLocation = .None 
    } 
} 
+0

Когда я пишу оператор switch в функции обновления, я получаю сообщение об ошибке: «Шаблон case Enum не может соответствовать значениям типа non-enum '<>'" –

+0

Вы уверены, что скопировали/ввели точный код в свой GameScene? – 0x141E

+0

Да, как вы думаете, вы можете вставить весь файл, если он у вас есть, поэтому я ничего не испортил? –

Смежные вопросы