Sprite
Sprite是cocos2d-x中用來顯示圖片的主要對象,它的建立有四種方式,下面分別介紹: 直接用圖片檔案建立
//直接用單張圖片建立精靈 //第一種方式:建立完精靈再設定貼圖 //auto sprite = Sprite::create(); //sprite->setTexture("girl.png"); //第二種方式:直接用貼圖檔案名稱建立精靈 //auto sprite = Sprite::create("girl.png"); //第三種方式:指定貼圖的一部分建立精靈 //auto sprite = Sprite::create("girl.png", Rect(0, 0, 100, 100)); //第四種方式:使用PolygonInfo來建立精靈 auto sprite = Sprite::create(AutoPolygon::generatePolygon("girl.png",Rect(0,0,100,100))); log("%f %f",sprite->getContentSize().width,sprite->getContentSize().height);
直接用Sprite::create()方法來建立精靈,它也有4個重載函數,第一個是無參函數,建立完精靈後再給它賦貼圖,第二個是建立的時候直接給一個貼圖檔案,第三個是建立是賦貼圖檔案和裁剪矩形,第四個是使用PolygonInfo對象來建立。
這裡有兩個要注意的地方,第一個是建立時直接傳檔案和建立完再賦貼圖檔案這兩種方式哪種更優。從程式上來講,我們寫檔案名稱的時候很容易寫錯,如果是建立時直接傳檔案的話,檔案名稱寫錯我們會得到一個Null 物件的精靈,之後對這個精靈的任何操作都會導致程式崩潰。而建立完之後再設定貼圖檔案這種方式我們能得到一個合法的精靈,只不過設定貼圖的時候給了一個空的貼圖而已,這種方式對精靈的操作不會使程式崩潰,但我們在螢幕上什麼也看不到。以我膚淺的眼光來看,初學者應使用第一種方式,盡量讓程式崩潰,這樣我們可以根據崩潰的地方迅速找到錯誤,而不是莫名其妙的看到一個黑乎乎的螢幕,而對於實際項目開發人員來說,當然要保證程式盡量不崩潰了。
第二個注意的地方是給Sprite指定Rect裁剪地區的時候,我們給的地區有可能比圖片大,這時候Sprite的貼圖就變得比源圖片大了,多出的地方填上了空白的像素,所以我們看不出區別。我在測試的時候就因為不小心給了一個比圖片大的裁剪地區,結果看到了一張完整的圖片,還以為這個裁剪不起作用,後面仔細看才發現,精靈的位置已經不置中了,輸出精靈的尺寸,原來精靈真的變大了。另外,Rect的地區是從圖片左上方開始計算的。
使用精靈幀建立精靈
//使用精靈幀SpriteFrame建立精靈 //第一種方式:直接建立精靈幀 //auto frame = SpriteFrame::create("girl.png",Rect(0,0,150,200)); //auto sprite = Sprite::createWithSpriteFrame(frame); //第二種方式:從精靈框架緩衝區中取精靈幀 //以這種方式建立精靈要先將圖片加到精靈緩衝區中 //SpriteFrameCache::getInstance()->addSpriteFrame(frame,"girl"); SpriteFrameCache::getInstance()->addSpriteFramesWithFile("start.plist"); auto sprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("start1.png"));
這種方式的優點是我們可以將圖片事先緩衝到精靈緩衝區中,再我們操作幀動畫的時候隨時可以拿到精靈圖片。 使用精靈幀名稱建立精靈
//使用精靈幀名稱建立精靈 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("start.plist"); auto sprite = Sprite::createWithSpriteFrameName("start1.png");
這種方式其實和第二種方式很相似,只不過我們不是通過具體得到的精靈幀對象來建立精靈,而是通過精靈幀在精靈幀緩衝中的索引(名稱)來獲得精靈幀。不是於第二種方式,這種方式只能使用在精靈幀緩衝中存在的精靈幀,而第二種方式可以使用自己建立的精靈幀來建立精靈。 使用貼圖Texture建立精靈
//使用貼圖建立精靈 TextureCache::getInstance()->addImage("girl.png"); auto texture=TextureCache::getInstance()->getTextureForKey("girl.png"); auto sprite = Sprite::createWithTexture(texture,Rect(0,0,150,200),true);
這種方式也比較簡單,直接傳一個Texture2D對象進去即可。Texture2D貼圖對象的建立也有好幾種方式,這個我們在下節再講。