如何在SpriteKit中创建一个简单的字符控制器?

时间:2015-07-03 19:45:44

标签: ios swift sprite-kit

我正在用精灵套装制作一个游戏,为了移动我的角色,我正在施加冲动,但这是一个问题因为每隔50个左右移动他一次。我的问题是,有人可以告诉我如何制作一个简单的角色控制器,这样我的角色可以持续移动,直到用户离开屏幕为止?

我的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 */


    }
    };
}

1 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是维护变量以跟踪触摸事件的状态(左,右或无)。以下是基本步骤:

  1. touchesBegan中,将触摸状态变量设置为左侧或右侧
  2. update中,在用户触摸屏幕时连续施加冲动
  3. touchesEnded中,重置触摸状态变量
  4. 这是一个如何实现这个的例子......

    高于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
        }
    }