在【cocos2d-x初学笔记05:添加角色Sprite】这一篇中我们实现了往场景的指定位置添加一个精灵角色作为主角,而这个主角是固定不动的,但是我们却希望它能随着我们对屏幕的触摸移动到指定的位置,这就涉及到角色的移动。
由于上一篇已经实现了对屏幕触摸事件的处理,所以本篇我们就不过多的讲解怎么实现添加一个角色和响应屏幕触摸事件。
(注意:我使用的cocos2d-x版本是2.0.4,系统是win7)下载地址
我们新建一个项目,命名为ActionTest,并导入我们需要的图片资源。我们使用TestCpp项目里面的资源,在D:\cocos2d-2.0-x-2.0.4\samples\TestCpp\Resources\Images(你的目录有可能不一样)找到grossini.png复制到我们自己的项目中的Resources文件夹,然后在VS中右击项目选择添加->现有项,添加刚刚复制的图片到我们的项目ActionTest即可。
然后一步步开始,首先在HelloWorld.h文件中使用cocos2d的命名空间,即加入”using namespace cocos2d;“这句话。
接下来在HelloWorld布景类中声明触屏结束的调用函数,修改后的HelloWorld布景类代码如下
class HelloWorld : public cocos2d::CCLayer
{
protected:
CCSprite* sprite;
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommand to return the exactly class pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
//声明触屏结束调用函数
virtual void ccTouchesEnded (CCSet *pTouches, CCEvent *pEvent);
// implement the "static node()" method manually
CREATE_FUNC(HelloWorld);
};
转到HelloWorld.cpp文件,我们修改init()函数如下
bool HelloWorld::init()
{
bool bRet = false;
do
{
//
// super init first
//
CC_BREAK_IF(! CCLayer::init());
//
// add your codes below...
//
// 1. Add a menu item with "X" image, which is clicked to quit the program.
// Create a "close" menu item with close icon, it's an auto release object.
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
// Place the menu item bottom-right conner.
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
// Create a menu with the "close" menu item, it's an auto release object.
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);
// Add the menu to HelloWorld layer as a child layer.
this->addChild(pMenu, 1);
//设置屏幕可以触摸
this->setTouchEnabled(true);
//取得屏幕大小
CCSize size=CCDirector::sharedDirector()->getWinSize();
//创建精灵作为主角,参数代表:图片的路径
sprite=CCSprite::create("grossini.png");
//设置位置
sprite->setPosition(ccp(size.width/2,size.height/2));
//添加到布景
this->addChild(sprite);
bRet = true;
} while (0);
return bRet;
}
最后实现屏幕触摸结束时调用的函数ccTouchesEnded(),将如下代码加入到HelloWorld.cpp文件中
void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
//我们用迭代器获得多点触摸的第一个触点
CCSetIterator it=pTouches->begin();
CCTouch* touch=(CCTouch*)(* it);
//得到第一个触点的位置
//(2.0之后不再需要对取得的位置进行坐标系的转换,即从屏幕坐标系转换GL坐标系)
CCPoint location=touch->getLocation();
//设置执行动作需要移动到的位置,参数代表:动作用时,最终位置
CCActionInterval* actionTo = CCMoveTo::create(2, ccp(location.x,location.y));
//执行动作
sprite->runAction(actionTo);
}
运行,我们点击右上角,效果如下,由于我截了三张截图做了GIF动态图,所以角色运动并不是流畅的。但实际上是缓慢地直线移动到指定位置的。
TestCpp实例项目中的Action例子有很多,包括直线运动,跳跃,旋转等,在这里我们就不一一列举了,道理方法都差不多,希望大家自己去写一写。
小提示:我们来说一下CCMoveTo和CCMoveBy的区别。本篇中我们用到的是CCMoveTo方法,实现角色运动到我们指定点的位置。CCMoveby的用法和CCMoveTo差不多,
CCActionInterval* actionBy = CCMoveBy::create(2, ccp(80,80));
sprite->runAction(actionBy);
第一个参数同样是执行动作所用时间,而第二个参数我们可以看做是一个向量,角色每次执行这个动作,位置按设置的向量变化一次,即X轴和Y轴分别向正方向移动80个像素。
最后祝愿每一个奋斗在路上的人早日实现梦想!