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))表示在图片右下角