【问题标题】:How to animate a sprite based on its velocity?如何根据速度为精灵设置动画?
【发布时间】:2015-03-27 01:01:52
【问题描述】:

嘿,我有一个项目,其中玩家应该像 Mega Jump 一样向上,我想为玩家设置动画,以便当它向左或向右或向下移动时,它会根据它改变其图像。有什么想法可以实现这一目标吗?这是我创建播放器的代码。

class GameScene: SKScene, SKPhysicsContactDelegate  {

let foregroundNode = SKNode()
let player = SKNode()

override init(size: CGSize) {
    super.init(size: size)

    physicsWorld.gravity = CGVector(dx: 0.0, dy: -3.0)
    physicsWorld.contactDelegate = self

    foregroundNode = SKNode()
    addChild(foregroundNode)

    player = createPlayer()
    foregroundNode.addChild(player)
}

func createPlayer() -> SKNode {

    let playerNode = SKNode()
    playerNode.position = CGPoint(x: self.size.width / 2, y: 80.0)
    var spriteTexture = SKTexture(imageNamed: "IMAGE")
    var sprite = SKSpriteNode(texture: spriteTexture)
    playerNode.addChild(sprite)

    playerNode.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size.width / 2)
    playerNode.physicsBody?.dynamic = false
    playerNode.physicsBody?.allowsRotation = false
    playerNode.physicsBody?.restitution = 1.0
    playerNode.physicsBody?.friction = 0.0
    playerNode.physicsBody?.angularDamping = 0.0
    playerNode.physicsBody?.linearDamping = 0.0
    playerNode.physicsBody?.usesPreciseCollisionDetection = true
    playerNode.physicsBody?.categoryBitMask = CollisionCategoryBitmask.Player
    playerNode.physicsBody?.collisionBitMask = 0
    playerNode.physicsBody?.contactTestBitMask = CollisionCategoryBitmask.Star | CollisionCategoryBitmask.Platform | CollisionCategoryBitmask.Monster
    return playerNode
}

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    if player.physicsBody!.dynamic {
        return
    }
    tapToStartNode.removeFromParent()
    player.physicsBody?.dynamic = true
    player.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 30.0))

}

override func update(currentTime: NSTimeInterval) {

    var spriteTexture = SKTexture(imageNamed: "IMAGE")
    var sprite = SKSpriteNode(texture: spriteTexture)
    if (player.physicsBody?.velocity.dx < 0) && (player.physicsBody?.velocity.dy > 0) {

        sprite.texture = SKTexture(imageNamed: "IMAGE LEFT")


    } else if (player.physicsBody?.velocity.dx > 0) && (player.physicsBody?.velocity.dy > 0){

        sprite.texture = SKTexture(imageNamed: "IMAGE RIGHT")

    }

我不知道我是走在正轨还是做错了,我还在学习 sprite kit 和 swift。但是,如果有人可以帮助我实现这一目标,我将不胜感激!提前谢谢你

【问题讨论】:

  • 你应该在你的SKScene对象上设置physicsBody

标签: swift xcode6 sprite-kit


【解决方案1】:

如果您打算为图像制作动画,则不应直接使用图像制作精灵节点。相反,使用 Image 的名称初始化 SKTexture。现在,您可以使用该纹理制作您的精灵节点。从那时起,只需使用纹理,因为每个精灵节点都有一个您可以直接设置的texture 属性 - sprite.texture

【讨论】:

    【解决方案2】:

    你会在你的更新方法中这样做:

    Update()
    {
        if(player.velocity.dx < 0 && sprite.texture != self.rightTexture)
              sprite.texture = self.rightTexture;
        else if(player.velocity.dx > 0 && sprite.texture != self.leftTexture)
              sprite.texture = self.leftTexture;
        //Add checks for down or up.  Order it based on what takes priority.
    
    }
    

    此代码遍历每一帧并根据其速度更新您的纹理。在开始时加载纹理并重复使用它们以节省内存和性能。

    【讨论】:

    • 嘿@meisenman 谢谢你!我正在尝试这样做,但我仍然无法使其工作。我用一些添加的代码更新了我的问题,希望你能看到我做错了什么。
    • 播放器节点必须是动态的。将 dynamic 设置为 yes 将允许您的玩家承担重力等属性。将 dynamic 设置为 no 通常用于基于物理不应该移动的东西,而不是用于应该保持原位或仅基于移动的东西明确设置其运动行为的 SKAction。我猜这会导致您的 if(velocity > 0) 检查失败。将播放器的速度记录到更新顶部的控制台。
    • 我在 touchesBegan 方法中将玩家动态设置为 true,以防止玩家在用户点击开始游戏之前摔倒。
    • 1.我想确认您正在使用物理来移动您的角色,而不是 SKActions。 2.改变纹理调用时:sprite = [SKSpritenode spritenodeWithTexture: self.rightTexture];可能正在设置属性,但没有触发 draw() 更新。
    • 我添加了我的 touchesBegan 方法,因此您可以看到我正在使用物理来移动角色,因此如果您倾斜设备,它会向左或向右等。但是我应该在哪里设置 rightTexture 和 leftTexture 属性?我的意思是每个图像。我认为在更改纹理时不会被识别为玩家的精灵。正如我从 createPlayer() 方法调用它
    猜你喜欢
    • 2010-11-10
    • 2013-08-13
    • 2018-08-20
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2018-07-13
    相关资源
    最近更新 更多