Cocos2d-X遊戲開發
-
精靈
角色(CCSprite) 精靈是整個遊戲開發處理的主要對象,包括主角和敵人、NPC等,甚至隨機飄過的一片雲或飛鳥從技術上講,也是精靈,因爲精靈在cocos2d-x中,就是一個可以不斷變化的圖片,這些變化包括位置變化,旋轉、放大縮小和運動等。
精靈實際上可以說就是遊戲總的主角,遊戲中我們可操作的人物、寵物等待。我們所看到的精靈本質上就是一個靜態的二維圖。在Cocos2d-x裏面精靈是用Sprite類來進行表示的,它可以用一張圖片或者一張圖片的一塊矩形部分來定義。
-
添加精靈
Resources文件夾中圖片:
//添加圖層
Sprite * nS = Sprite::create("monkey.png");
//設定位置
nS->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
//添加精靈到圖層
this->addChild(nS,1);
-
循環批量創建精靈
-
srand函數
srand和rand()配合使用產生僞隨機數序列。rand函數在產生隨機數前,需要系統提供的生成僞隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次調用rand函數生成的僞隨機數序列都是一樣的。
//播種子
srand(unsigned(time(NULL)));
-
CCRANDOM_0_1()宏
CCRANDOM_0_1()這個方法是通過C標準庫的 std::rand() / (float)RAND_MAX; 實現的,所以生成的隨機數是"僞隨機數",如果不給隨機種子,每次程序運行後成成的隨機數都和上次程序運行時生成的隨機數一樣。
srand(unsigned(time(NULL)));
for (inti = 0; i < 10; i++)
{
autopSprite = Sprite::create("Dog.png");
//產生隨機位置
pSprite->setPosition(Point(CCRANDOM_0_1() * 720, CCRANDOM_0_1() * 1280));
//添加精靈到圖層
this->addChild(pSprite);
}
結果:
-
SpriteBatchNode批量創建精靈:
SpriteBatchNode提高渲染效率
注:
SpriteBatchNode::create(const char*fileImage);利用貼圖創建,默認子節點數量29.(數量不夠時,系統會自己增加)
SpriteBatchNode* batchNode = SpriteBatchNode::create(const char*fileImage, unsigned int capacity);利用貼圖創建,並指定子節點數量
//批節點默認子節點數量29.(數量不夠時,系統會自己增加)
SpriteBatchNode* batchNode = SpriteBatchNode::create("Dog.png");
batchNode->setPosition(Point::ZERO);
//添加批節點到圖層
this->addChild(batchNode);
srand(unsigned(time(NULL)));
for (inti = 0; i < 10; i++)
{
//創建貼圖
autosp = Sprite::createWithTexture(batchNode->getTexture());
sp->setPosition(Point(CCRANDOM_0_1() * 720, CCRANDOM_0_1() * 1280));
//增加貼圖到批節點
batchNode->addChild(sp);
}
結果:
-
SpriteFrameCache精靈幀緩存
可以把多張貼圖合併成一張大貼圖:
使用工具:TexturePacker合成大圖
srand(unsigned(time(NULL)));
//精靈幀緩存
SpriteFrameCache* frameCache = SpriteFrameCache::sharedSpriteFrameCache();
//添加list文件
frameCache->addSpriteFramesWithFile("pic.plist");
autospriteTigre = Sprite::createWithSpriteFrameName("Tigre.png");
spriteTigre->setPosition(Point(CCRANDOM_0_1() * 720, CCRANDOM_0_1() * 1280));
this->addChild(spriteTigre);
autospriteDog = Sprite::createWithSpriteFrameName("Dog.png");
spriteDog->setPosition(Point(CCRANDOM_0_1() * 720, CCRANDOM_0_1() * 1280));
this->addChild(spriteDog);
結果:
-
座標系:
-
UI座標系:
OS/Andorid/WindowsSDK中的通用UI座標系默認起點座標位於左上角,X軸從屏幕最左邊開始,由左向右漸增,Y軸座標從屏幕上方開始,由上向下漸增。
又稱爲紋理座標系。
-
OpenGL座標系
默認原點座標(x=0,y=0)在屏幕左下角,X軸從屏幕最左邊開始,由左向右漸增,Y軸座標從屏幕下方開始,由下向上漸增。
又稱爲繪圖座標系。
// 添加一個精靈
autosprite = Sprite::create("Dog.png");
//設定精靈錨點
sprite->setAnchorPoint(Point(0, 0));
//設定精靈的位置
sprite->setPosition(40, 50);
//添加精靈到圖層
this->addChild(sprite, 0);
// 添加一個精靈
autosprite = Sprite::create("Dog.png");
//設定精靈錨點
sprite->setAnchorPoint(Point(0.5, 0.5));
//設定精靈的位置
sprite->setPosition(40, 50);
//添加精靈到圖層
this->addChild(sprite, 0);
// 添加一個精靈
autosprite = Sprite::create("Dog.png");
//設定精靈錨點
sprite->setAnchorPoint(Point(1, 1));
//設定精靈的位置
sprite->setPosition(40, 50);
//添加精靈到圖層
this->addChild(sprite, 0);
// 添加一個精靈
autosprite = Sprite::create("Dog.png");
//設定精靈錨點
sprite->setAnchorPoint(Point(1, 0));
//設定精靈的位置
sprite->setPosition(40, 50);
//添加精靈到圖層
this->addChild(sprite, 0);
其中:40,50座標是固定的。
-
世界座標系
世界座標系也稱爲絕對座標。
-
節點座標系
節點座標系又稱爲本地座標系,是和特定節點相關聯的座標系。每個節點都有獨立的座標系。當節點移動或改變方向時,和該節點關聯的座標系(它的子節點)也將隨之移動或改變方向。
-
錨點
錨點指定了貼圖上和所在節點原點(也就是設置位置的點)重合的點的位置,因此只有在Node類節點使用貼圖的情況下,錨點纔有意義。
錨點的默認值是(0.5,0.5),表示的並不是一個像素點,而是一個乘數因子。(0.5,0.5) 表示錨點位於貼圖長度乘0.5和寬度乘0.5的地方,即貼圖的中心。
Vec2原名Point,它既可以表示一個二維座標點,又可以表示一個二維向量。
setAnchorPoint(Point(0,0))表示在圖片左下角
setAnchorPoint(Point(1,1))表示在圖片右上角
setAnchorPoint(Point(0.5,0,5))表示在圖片的中心點
setAnchorPoint(Point(0,1))表示在圖片的左上角
setAnchorPoint(Point(1,0))表示在圖片右下角