簡體   English   中英

Sprite對象中的Cocos2d動畫

[英]Cocos2d Animation inside a Sprite Object

在Cocos2d-x V 3.81項目中,我試圖為擴展Sprite的對象內的sprite設置動畫,但是它似乎沒有任何作用。 在這樣的節點中甚至可能有一個動畫精靈,還是必須擴展Layer才能動畫?

var Player = cc.Sprite.extend ({
ctor: function () {

    this._super(res.Player_png);

    this.UP = false;
    this.DOWN = false;
    this.LEFT = false;
    this.RIGHT = false;
    this.ACTION = false;

    this.speed = 5;

    cc.spriteFrameCache.addSpriteFrame(res.Player_Left_plist);

    var leftFrames = [];
    for(var i = 0; i < 4; i++)
    {
        var str = "Left" + i + ".png";
        var frame = cc.spriteFrameCache.getSpriteFrame(str);
        leftFrames.push(frame);
    }

    this.leftAnim = new cc.Animation(leftFrames, 0.3);
    this.runLeft = new cc.repeatForever(new cc.Animate(this.leftAnim));

    this.state = "nothing";
    this.nothing = "nothing";

    this.scheduleUpdate();

    cc.eventManager.addListener (
        cc.EventListener.create ({
            event: cc.EventListener.KEYBOARD ,
            onKeyPressed: function(key, event)
            {
                if(key == 87) this.UP = true;
                else if(key == 65) this.LEFT = true;
                else if(key == 83) this.DOWN = true;
                else if(key == 68) this.RIGHT = true;
                else if (key == 69 || key == 32) this.ACTION = true;
            }.bind(this),
            onKeyReleased: function(key, event)
            {

                if(key == 87) this.UP = false;
                else if(key == 65) this.LEFT = false;
                else if(key == 83) this.DOWN = false;
                else if(key == 68) this.RIGHT = false;
                else if (key == 69 || key == 32) this.ACTION = false;
            }.bind(this)
        }),this);

    return true;
},

update:function(dt) {
    if(this.UP)
    {
        this.y += this.speed;
        this.runAction(this.runLeft);
    }
    else if(this.DOWN)
    {
        this.y -= this.speed;
    }
    if(this.LEFT)
    {
        this.x -= this.speed;
        this.runAction(this.runLeft);
    }
    else if(this.RIGHT)
    {
        this.x += this.speed;
    }
}
});

我認為問題是此行:

cc.spriteFrameCache.addSpriteFrame(res.Player_Left_plist);

它應該讀

cc.spriteFrameCache.addSpriteFrames(res.Player_Left_plist);

其中SpriteFrames為復數。 手動創建SpriteFrame之后,使用末尾不帶“ s”的方法將單個cc.SpriteFrame對象加載到緩存中。 最后帶有“ s”的方法是采用plist的URL一次加載整個spritesheet的方法。

http://www.cocos2d-x.org/reference/html5-js/V3.8/symbols/cc.spriteFrameCache.html

這段代碼在sprite類之外對您有用嗎? 例如在普通的精靈里?

我認為這是錯誤的,但我尚未對其進行測試:

this.leftAnim =新的cc.Animation(leftFrames,0.3); this.runLeft = new cc.repeatForever(new cc.Animate(this.leftAnim));

使用您的代碼,我會做什么:

var leftAnim = new cc.Animation();
    for(var i = 0; i < 4; i++)
    {
        var str = "Left" + i + ".png";
        var frame = cc.spriteFrameCache.getSpriteFrame(str);
        leftAnim.addSpriteFrame(frame);
    }
leftAnim.setDelayPerUnit(0.08);
this.runAction(cc.animate(leftAnim)); //or this.runAction(cc.animate(leftAnim).repeatForever());

希望能幫助到你

多元化在很大程度上是問題。

對於那些好奇的人,這里是功能代碼塊:

你是對的。 非常感謝你。 對於那些感興趣的人,這是功能代碼塊:

    cc.spriteFrameCache.addSpriteFrames(res.playerRun_plist);
    var i,f;
    var frames=[];
    for (i=1; i <= 4; i++) {
        f=cc.spriteFrameCache.getSpriteFrame("playerRun"+i+".png");
        frames.push(f);
    }
    var playerRunAnim = new cc.Animation(frames, 0.1);
    this.playerAction = new cc.RepeatForever(new cc.Animate(playerRunAnim));

    this.runAction(this.playerAction);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM