如何让我的角色侧身移动? Xcode 6 Sprite Kit

时间:2015-06-26 00:03:39

标签: ios xcode sprite-kit

我正在使用苹果的快速编程语言制作一个简单的侧滚动游戏,我想让我的角色在触摸屏幕的左半部分时向左移动,在触摸另一半时向右移动。我使用此代码完成了此操作:

    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        if location.x < CGRectGetMidX(self.frame){
        character.position.x -= 30
        } else if location.x > CGRectGetMidX(self.frame){
            character.position.x += 30
        } else {
           println("jump")
        }
    }

但他在移动30 px后立即停止移动。我的问题是,有人可以解释如何让他继续移动,直到用户举起手指?

这是我的GameScene.swift文件:

import SpriteKit


class GameScene: SKScene, SKPhysicsContactDelegate {

let character = SKSpriteNode(texture: SKTexture(imageNamed: "character"))


override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    //world
    self.physicsWorld.gravity = CGVectorMake(0.0, -5.0)

    //background
    var background = SKSpriteNode(imageNamed: "background")
    background.size.height = self.frame.size.height
    background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
    self.addChild(background)


    //character
    character.position = CGPointMake(self.frame.size.width * 0.6, self.frame.size.height * 0.6)
    character.setScale(0.015)
    character.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(character.size.width / 2))
    var charPos = character.position
    character.physicsBody?.dynamic = true
    self.addChild(character)



    //platform 1
    var platformTexture = SKTexture(imageNamed: "platform")
    var platform = SKSpriteNode(texture: platformTexture)
    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)
    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)
    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)
    self.addChild(platform3)


}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    /* Called when a touch begins */





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

1 个答案:

答案 0 :(得分:1)

你必须在每次更新时不断对力量施加力量:调用以便不停地移动它。您还可以应用脉冲以移动角色或使其跳跃。这是一个基于您的代码的示例,为您提供如何使用物理(或通过手动更改字符的速度矢量)移动字符的基本概念。查看评论以找出重要的内容。

import SpriteKit


class GameScene: SKScene, SKPhysicsContactDelegate {

    let character = SKSpriteNode(texture: SKTexture(imageNamed: "pauseButton"))

    //Boolean variable to store information about move signal (updated in touchesBegan and touchesEnded method)
    var move = false

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        //world
        self.physicsWorld.gravity = CGVectorMake(0.0, -5.0)
        self.physicsWorld.contactDelegate = self; //don't forget to set contact delegate if you want to use contact detection and methods like didBeginContact and didEndContact
        //background
       //just a physical border so that character can't escape from us :)
        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.415)
        character.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(character.size.width / 2))
        var charPos = character.position
        character.physicsBody?.dynamic = true
        self.addChild(character)



    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

        /* Called when a touch begins */

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

            //Hold finger at upper area to move character constantly to the right.
            if location.y > 400{
               //moving allowed, force is applied in update method. read the docs about applyImpulse and applyForce methods and the differences between those two. 
                move = true

            }else{

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

                //tap somewhere above this to make character jump
                if(location.y > 250) {
                    character.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 50))
                }

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

                 //tap somewhere above this to make character jump
                if(location.y > 250) {
                    character.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 50))
                }
            }
        }

        }


    }

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {


        move = false

        //character.physicsBody?.velocity = CGVector(dx: 0, dy: 0) //you can make character to stop by manually setting its velocity vector to (0,0)

    }


    override func update(currentTime: CFTimeInterval) {

        if(move){character.physicsBody?.applyForce(CGVector(dx: 30, dy: 0))}
     //if(move){character.position = CGPoint(x: character.position.x+1, y:character.position.y)}  //not recommended if you need physics simulation (eg. collisions) 
    }
}

请注意,您可以在每次更新调用中更改节点的位置,以达到您想要的效果,如下所示:

if(move){character.position = CGPoint(x: character.position.x+1, y:character.position.y)}

但是这样你就可以将节点从物理模拟中拉出来,你会遇到意想不到的结果。搜索关于这个主题的SO,有一些关于这一切的好帖子。

希望这有点帮助。