2

On a project in Xcode 7 I have a few SKSpriteNodes that move back and forth on the screen and another one, called user, that is meant to jump from sprite to sprite, progressively up the screen. However, when user lands on one of the moving sprites the moving sprite just slides right out from under it and user falls back down. I thought that this meant that I needed to increase the friction property on the nodes so that user would "stick" to the nodes, but this just makes it bounce on the other nodes. My problem is that the nodes moving back and forth seem to "slippery," and user just doesn't stay on them.

Here's my code:

My class for user:

class UserNode: SKSpriteNode
{
    class func newNode(position position: CGPoint) -> UserNode
    {
        let position = position

        let sprite = UserNode(imageNamed: "userImage")
        sprite.position = position
        sprite.size = CGSize(width: sprite.size.width * 2, height: sprite.size.height * 2)
        sprite.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "userImage"), size: sprite.size)
        sprite.physicsBody?.affectedByGravity = true
        sprite.physicsBody?.dynamic = true
        sprite.physicsBody?.allowsRotation = false
        sprite.physicsBody?.friction = 0.2

        return sprite
    }
}

and for moving user (the methods in my gamescene)

let scale: CGFloat = 2.0
let damping: CGFloat = 0.98
var point = CGPoint?()

func moveNodeToPoint(sprite: SKSpriteNode, point: CGPoint)
{
    let dx = (point.x - sprite.position.x) * scale
    let dy = (point.y - sprite.position.y) * scale
    sprite.physicsBody?.velocity = CGVectorMake(dx, dy)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
    /* Called when a touch begins */
    for _: AnyObject in touches
    {
        if !welcomeNode.hidden
        {
            let fadeAway = SKAction.fadeOutWithDuration(0.3)

            welcomeNode.runAction(fadeAway)
            directionsNode.runAction(fadeAway)
            touchStartNode.runAction(fadeAway)

            welcomeNode.hidden = true
            directionsNode.hidden = true
            touchStartNode.hidden = true
        }

        //////////

        point = CGPointMake(self.frame.midX, user.position.y + 300)


    }
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?)
{
    point = nil
}

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

    if (point != nil)
    {
        moveNodeToPoint(user, point: point!)
    }
    else
    {
        let dx = user.physicsBody!.velocity.dx * damping
        let dy = user.physicsBody!.velocity.dy * damping

        user.physicsBody?.velocity = CGVectorMake(dx, dy)
    }



}

and for moving the platforms:

let screenSize = UIScreen.mainScreen().bounds
let width = screenSize.size.width * 2
let firstAction = SKAction.moveBy(CGVector(dx: width, dy: 0), duration: 2)
let secondAction = SKAction.moveBy(CGVector(dx: -width, dy: 0), duration: 2)

let actions = [firstAction, secondAction]
let barAction = SKAction.sequence(actions)
let mainBarAction = SKAction.repeatActionForever(barAction)

platform.runAction(mainBarAction)
isaac
  • 31
  • 5

0 Answers0