Rae Tucker
Rae Tucker

Reputation: 523

SpriteKit Swift: How to make a sprite jump in place when tapped?

So Ive been working on a game and have a little sprite that is currently running in place. I need to make him jump up whenever the user taps the screen to dodge obstacles. I also need him to return to his starting point on the ground after he jumps.

Upvotes: 1

Views: 6196

Answers (2)

Fogmeister
Fogmeister

Reputation: 77631

Using physics is overkill for a game like this. Not even the 2D Mario games use physics so I doubt you will need it.

As a very simple implementation you can use a sequence of SKActions.

// move up 20
let jumpUpAction = SKAction.moveBy(x: 0, y: 20, duration: 0.2)
// move down 20
let jumpDownAction = SKAction.moveBy(x: 0, y: -20, duration: 0.2)
// sequence of move yup then down
let jumpSequence = SKAction.sequence([jumpUpAction, jumpDownAction])

// make player run sequence
player.run(jumpSequence)

That should work. I may have mistyped something in the browser though.

You can tweak this to make the jump look more natural. Maybe add a few more steps to the jump process to change the speed of the rise/fall over time to make it look like he's accelerating. etc...

Upvotes: 5

balazs630
balazs630

Reputation: 3692

You can try something like this!

import SpriteKit

class GameScene: SKScene {
    var player: SKSpriteNode?

    override func didMove(to view: SKView) {
        player = self.childNode(withName: "player") as? SKSpriteNode
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for t in touches { self.touchDown(atPoint: t.location(in: self)) }
    }

    func touchDown(atPoint pos: CGPoint) {
        jump()
    }

    func jump() {
        player?.texture = SKTexture(imageNamed: "player_jumping")
        player?.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 500))
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        for t in touches { self.touchUp(atPoint: t.location(in: self)) }
    }

    func touchUp(atPoint pos: CGPoint) {
        player?.texture = SKTexture(imageNamed: "player_standing")
    }

}

On the player's attribute inspector window make sure you select 'Dynamic' and 'Affected By Gravity' options only, otherwise it will not fall back to the ground after the jump.. :)

I don't think physics would be overkill for a simple game as someone said in the previous answer... It's not a big deal for an iPhone or iPad hardware, they have a crazy computing power.

enter image description here

Upvotes: 12

Related Questions