標籤:
前言
上一篇介紹了HelloWorld程式,這次我們來介紹一個很重要的元素——精靈(Sprites)。
精靈是什嗎?
精靈(Sprites)是任何遊戲的一個核心元素。我們需要他們。在遊戲中我們經常喜歡用它來自作和播放角色。它可以移動,旋轉,縮放,執行動畫,並接受其他轉換。Cocos2dx的Sprite由Texure,frame和animation組成,由openes負責渲染。簡單過程可描述為:使用Texture2D載入圖片,可以用Texture2D產生對應的SpriteFrame(精靈幀),將SpriteFrame添加到Animation產生動畫資料,用Animation產生Animate(就是最終的動畫動作),最後用Sprite執行這個動作。有時候,精靈可以充當遊戲的背景,可以是遊戲中的主角,也可以是無惡不做的怪物。其實,它就是一張圖片,但其效能開銷低,經常被用來設定遊戲中大部分圖片資源。
建立精靈
建立精靈的幾種方式:
auto sprite = Sprite::create("HelloWorld.png"); this->addChild(sprite,0);
有時候,為了讓圖片資源更小,會根據一張圖片來建立不同的CCSprite,這樣需要首先通過CCTextureCache載入圖片到圖片紋理的緩衝,然後從緩衝擷取這張圖片的CCTexture2D對象,根據這個對象來建立CCSprite,代碼如下:
auto sprite1 = Sprite::createWithTexture(TextureCache::getInstance()->addImage("HelloWorld.png"));this->addChild(sprite1, 0);
利用幀緩衝中的一幀的名稱聲稱一個對象,適合於plist打包好的檔案
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("test.plist");auto sprite2=Sprite::createWithSpriteFrameName("HelloWorld.png"); this->addChild(sprite2, 0);
在Cocos2dx中實現精靈顯示的基本過程如下:
//建立Sceneauto scene = Scene::create();//建立層auto layer = HelloWorld::create();//把層加入情境中scene->addChild(layer);//建立一個精靈auto sprite = Sprite::create("HelloWorld.png");//把精靈加到層裡layer->addChild(sprite, 0)開始舞動吧!
在介紹action之前,先說明一個cocos2d-x 中座標系的概念:在情境中以左下角為座標原點,從左至右為x方向,從下到上為y方向,明白了這個,我們來簡單介紹一下動作族譜中的幾個常用成員吧。
- MoveTo(移動節點對象到位置x,y。x,y是絕對座標,通過修改它的位置屬性來改變它們的值)
/* 建立精靈 */Sprite* sprite=Sprite::create("test.png");/* 建立一個0.9秒後移動到x:250,y:150點的動作 */MoveTo* moveTo = MoveTo::create(0.9f, Point(250, 150));/* 執行動作 */sprite->runAction(moveTo);
- BezierTo(貝茲路徑動作)
/* 建立精靈 */Sprite* sprite = Sprite::create("sprite.png");sprite->setPosition(Point(50, 180));this->addChild(sprite, 1, TAG_SPRITE);/* 建立貝茲路徑的配置 */ccBezierConfig bezier;bezier.controlPoint_1 = Point(100, 0);//波穀偏向值bezier.controlPoint_2 = Point(200, 250);//波峰偏向值bezier.endPosition = Point(300, 0);//動作終點/* 建立CCBezierTo動作對象 */BezierTo* bezierTo = BezierTo::create(4.0f, bezier);/* 執行動作 */sprite->runAction(bezierTo);this->scheduleUpdate();
- RepeatForever(重複執行)
/* 建立一個精靈 */Sprite* sprite = Sprite::create("sprite.png");sprite->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));this->addChild(sprite);/* 建立一個CCJumpBy動作對象 */JumpBy* jumpBy = JumpBy::create(3.0f, Point(50, 1), 100, 1);/* 以jumpBy為參數,建立一個永久性的重複動作 */RepeatForever* repeatForeverAction = RepeatForever::create(jumpBy);
sprite->runAction(repeatForeverAction);
Sequence(組合動作,按先後順序執行)
/* 建立一個精靈 */Sprite* sprite = Sprite::create("sprite.png");sprite->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));this->addChild(sprite);/* 建立一個移動動作對象 */MoveBy* moveBy = MoveBy::create(2.2f, Point(40, 20));/* 建立一個彈跳動作對象,彈跳高度100,彈跳次數5 */JumpBy* jumpBy = JumpBy::create(3.0f, Point(50, 1), 100, 5);/* 建立一個旋轉動作對象 */RotateBy* rotateBy = RotateBy::create(2.5f, 220, 10);/* 建立組合動作對象,將所有動作連起來 */ Action* actions = Sequence::create(moveBy, jumpBy, rotateBy, NULL);sprite->runAction(actions);
一般來說每個動作都是成對的,都有相應的To跟By,兩者有絕對和相對之分。最後是一張動作家族的族譜圖:
windows開發cocos2d-x系列(3)— 舞動你的精靈