前言:
上一篇我们说了 cocos2d-x 如何创建第一个hello World工程以及游戏窗口运行机制与生命周期讲解
所以大家应该是对cocos2d-x有所了解
本篇来说一下我们的主角 sprite 精灵
创建一个角色可以控制一下简单的移动
效果图:
精灵Sprite
精灵是屏幕上移动的对象,它能被控制。你喜欢玩的游戏中主角可能就是一个精灵,我知道你在想是不是每个图形对象都是一个精灵,不是的,为什么? 如果你能控制它,它才是一个精灵,如果无法控制,那就只是一个节点(Node)。
准确的说,精灵(Sprite) 是一个能通过改变自身的属性:角度,位置,缩放,颜色等,变成可控制动画的 2D 图像。
精灵的创建
可以使用一张图片来创建精灵,PNG, JPEG, TIFF, WebP, 这几个格式都可以。
当然也有一些其它的方式可以创建精灵,如使用 图集 创建,通过 精灵缓存 创建,我们会一个一个的讨论。本节介绍通过图片创建精灵。
auto sprite = CCSprite::create("APimg[306].png");
上面直接使用了 APimg[306].png 图像来创建精灵。精灵会使用整张图像,图像是多少的分辨率,创建出来的精灵就是多少的分辨率。比如图像是 200 x 200,Sprite 也是 200 x 200。
这就是我们的主角 118*116像素的图片
但是如果你想创建一个尺寸只有原始图像一部分的精灵,那你可以在创建的时候指定一个矩形,指定矩形需要四个值,初始 x 坐标,初始 y 坐标,矩形宽,矩形高
auto mySprite = Sprite::create("APimg[306].png", Rect(0,0,40,40));
精灵的控制
基本的控制有移动 旋转 缩放 倾斜等
如果涉及旋转缩放和倾斜又涉及到锚点 也就是旋转的中心点
我们本节只有简单的上下左右的位置移动没有包含其他的
设置精灵的位置
sprite->setPosition(ve2(x,y));
创建菜单
菜单项
auto up = CCMenuItemFont::create("up",CC_CALLBACK_1(HelloWorld::menuClickCallBack,this));
第二个参数是传入了个回调函数 ,就是让点击菜单项时触发的函数
函数的声明
void menuClickCallBack(Ref* sender);
创建4个菜单项 代表上下左右
菜单
auto menu = CCMenu::create(up, down, left, right,NULL);
menu->alignItemsVertically();
创建菜单包含上面4个菜单项,设置菜单项自动垂直对齐
我们给每个节点都设置一个tag 便于后面寻找 也就想当于每个人的身份证
//设置菜单tag
up->setTag(1);
down->setTag(2);
left->setTag(3);
right->setTag(4);
菜单项点击的回调函数
这个参数sender是发送者也就是我们点击的谁
然后我们根据他的tag 来判断是点击的那个菜单项
sprite 就是我们的机器人主角 我们也给设置了tag 是0
下面switch 根据点击的菜单项设置主角的位置
完整的code:
我们的代码是写到 init()中
在 下面
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
scheduleUpdate();
auto sprite = CCSprite::create("APimg[306].png");
sprite->setPosition(center);
sprite->setTag(0);
addChild(sprite);
//创建菜单
auto up = CCMenuItemFont::create("up",CC_CALLBACK_1(HelloWorld::menuClickCallBack,this));
auto down = CCMenuItemFont::create("down", CC_CALLBACK_1(HelloWorld::menuClickCallBack, this));
auto left = CCMenuItemFont::create("left", CC_CALLBACK_1(HelloWorld::menuClickCallBack, this));
auto right = CCMenuItemFont::create("right", CC_CALLBACK_1(HelloWorld::menuClickCallBack, this));
auto menu = CCMenu::create(up, down, left, right,NULL);
menu->setPosition(100, 330);
addChild(menu);
menu->alignItemsVertically();
//设置菜单tag
up->setTag(1);
down->setTag(2);
left->setTag(3);
right->setTag(4);
void HelloWorld::menuClickCallBack(Ref * sender)
{
CCLOG("click menuitem");
Node* node = dynamic_cast<Node*>(sender);
int tag = node->getTag();
Node* sprite = this->getChildByTag(0);
if (NULL != node && NULL != sprite)
{
switch (tag)
{
case 1:
sprite->setPositionY(sprite->getPositionY() + 10.0f);
break;
case 2:
sprite->setPositionY(sprite->getPositionY() - 10.0f);
break;
case 3:
sprite->setPositionX(sprite->getPositionX() - 10.0f);
break;
case 4:
sprite->setPositionX(sprite->getPositionX() + 10.0f);
break;
default:
break;
}
}
}