2012年8月13日 星期一

[JavaScript]Cocos2d-x html5 試用 (三) Sprite

在介紹Sprite前,我們有必要先了解一下Sprite的建構式
    /**
     * Constructor
     * @param {String|cc.SpriteFrame|cc.SpriteBatchNode|HTMLImageElement|cc.Texture2D} fileName sprite construct parameter
     */
    ctor:function (fileName) {
        this._super();
        this._shouldBeHidden = false;
        this._offsetPosition = new cc.Point(0, 0);
        this._unflippedOffsetPositionFromCenter = new cc.Point(0, 0);

        if (fileName) {
            if (typeof(fileName) == "string") {
                var frame = cc.SpriteFrameCache.sharedSpriteFrameCache().spriteFrameByName(fileName);
                this.initWithSpriteFrame(frame);
            } else if (typeof(fileName) == "object") {
                if (fileName instanceof cc.SpriteFrame) {
                    this.initWithSpriteFrame(fileName);
                } else if (fileName instanceof cc.SpriteBatchNode) {
                    if (arguments.length > 1) {
                        var rect = arguments[1];
                        if (rect instanceof cc.Rect) {
                            this.initWithBatchNode(fileName, rect);
                        }
                    }
                } else if ((fileName instanceof HTMLImageElement) || (fileName instanceof HTMLCanvasElement)) {
                    this.initWithTexture(fileName)
                } else if (fileName instanceof cc.Texture2D) {
                    this.initWithTexture(fileName)
                }
            }
        }
    },
從以上程式碼,得知cc.Sprite 的建構條件有
String|cc.SpriteFrame|cc.SpriteBatchNode|HTMLImageElement|cc.Texture2D 
其中String,並不是代表著一個FileName,要以String方式宣告一個Sprite的條件是,必須要有[SpriteFrame],且有在[cc.SpriteFrameCache]做[Cache],String代表著[SpriteFrame]的[Key]值。
要以建構式宣告一個Sprite的話,還是必須宣告一些介質來達成,
如果我們想要直接以路徑來宣告,就必須只用其他的初始化方法。

    /**
     * Initializes a sprite with a texture and a rect in texture
     * @param {cc.Texture2D|HTMLImageElement|HTMLCanvasElement} texture
     * @param {cc.Rect} rect
     * @return {Boolean}
     * @example
     * var img =cc.TextureCache.sharedTextureCache().addImage("HelloWorld.png");
     * var mySprite = new cc.Sprite();
     * mySprite.initWithTexture(img,new cc.Rect(0,0,480,320));
     */
    initWithTexture:function (texture, rect, rotated)
    /**
     * Initializes a sprite with a texture's filename and a rect in texture
     * @param {String} filename
     * @param {cc.Rect} rect
     * @return {Boolean}
     * @example
     * var mySprite = new cc.Sprite();
     * mySprite.initWithFile("HelloWorld.png",new cc.Rect(0,0,480,320));
     */
    initWithFile:function (filename, rect)
    /**
     * Initializes a sprite with a sprite frame.
     * @param {cc.SpriteFrame} spriteFrame
     * @return {Boolean}
     * @example
     * var spriteFrame = cc.SpriteFrameCache.sharedSpriteFrameCache().spriteFrameByName("grossini_dance_01.png");
     * var sprite = new cc.Sprite();
     * sprite.initWithSpriteFrame(spriteFrame);
     */
    initWithSpriteFrame:function (spriteFrame)
    /**
     * Initializes a sprite with a sprite frame name. 

     * A cc.SpriteFrame will be fetched from the cc.SpriteFrameCache by name.  

     * If the cc.SpriteFrame doesn't exist it will raise an exception. 

     * @param {String} spriteFrameName
     * @return {Boolean}
     * @example
     * var sprite = new cc.Sprite();
     * sprite.initWithSpriteFrameName("grossini_dance_01.png");
     */
    initWithSpriteFrameName:function (spriteFrameName) 
以上截至cc.Sprite的原始碼,在註解行裡有簡單的使用方法,所以我就不做解釋。
其中 [initWithFile]這個 Function ,就是可以以檔案路徑初始化一個Sprite的方法。
接下來,我們就直接來用看看,
    var sprite = new cc.Sprite();
    sprite.initWithFile("Image/HelloSprite.png");
    sprite.setPosition(cc.ccp(size.width / 2, size.height / 2));//將[sprite]的位置至於正中間
    sprite.setAnchorPoint(cc.ccp(0.5, 0.5));//設定對齊點為中間
    this.addChild(sprite);//將[sprite]加到[Layer]上顯示
現在我們宣告了一個『cc.Sprite』,並把他加到[Layer]上。
直接把以上程式碼,加到『Main.js』的[initLayer]裡,就可以看到,除了背景圖和Hello World,還顯示了一張圖片在[Canvas]正中央。
如下圖

成功貼出一個『cc.Sprite』後,接下來能做什麼呢?
這裡簡單的介紹一下『cc.Sprite』裡,所定義的Function
1   . [setTexture] : 將目前顯示的[Texture]替換成目標。
2   . [addChild] :將目標物件設為子項,物件必須是[cc.Sprite]或繼承於[cc.Sprite]。
    /**
     * Add child to sprite (override cc.Node )
     * @param {cc.Sprite} child
     * @param {Number} zOrder  child's zOrder
     * @param {String} tag child's tag
     * @override
     */
    addChild:function (child, zOrder, tag)
3   . [removeChild] :將目標物件成子項中移除。
4   . [removeAllChildrenWithCleanup] : 將所有子項移除。
5   . [setPosition] :設定Sprite的座標位置。傳入值必須為[cc.Ponit]。
6   . [setRotation] :設定角度。
7   . [setSkewX]&[setSkewY] :設定橫向、垂直斜度。
8   . [setScaleX]&[setScaleY] :設定橫向、垂直放大倍率。(0~1為縮小,1以後為放大)。
9   . [setScale] :整體放大倍率,同上述。
10 . [setFlipX]&[setFlipY] :設定橫向、垂直反轉,[true or false]。
11 . [setAnchorPoint] :設定對齊位置,傳入值必須為[cc.Ponit]。
12 . [setVisible] :設定是否顯示,[true or false]。
13 . [setOpacity] :設定透明度,[0~255]。
14 . [setColor] :設定顏色,[cc.Color3B]。
上述皆為[setter],[getter]屬性的 Function 只要呼叫就會回傳與[setter]相對應的值,所以我只列出以下幾項做說明。
1   . [getParent]  :取得父項目。
2   . [getContentSize]  :取得[Sprite]寬度和高度。
3   . [getChildByTag]  :依標籤取得子項,子項必須在加入時定義標籤名稱。
以上是比較常用到的 Function ,比較不常用的像是[draw]和[visit]這兩個屬於底層的 Function ,應用上並不會使用到,所以就不多做解釋。

沒有留言:

張貼留言