cocos2d-x 旅程開始--(实现单击与长按)
小菜鸟一枚,学习cocos2d-x已经有一段时间了,感觉进度非常慢那,CSDN也再次拾了起来。近期自己还在学习做小游戏,跟着前辈做了《忍者打怪物》的小游戏,又学习了瓦片游戏《吃西瓜》,打算自个做个坦克大战,刚刚起步,希望自己尽力的完毕那。开个帖子记录一下。
前段时间的进度:
下载了各种素材文件,用TileMap制作地图,这里出现了错误,眼下发现“砖块”和“铁块”必须放在不同的图层以下才干执行
否则就会出错,tmx格式的地图不能全然显示出来,要么仅仅显示砖头要么仅仅显示铁块。
然后写代码:去掉HelloWord其中init()函数中不必要的部分,自己開始写。
先导入地图
tank_war = CCTMXTiledMap::create("tank_war.tmx"); //增加地图
this->addChild(tank_war);
创建主角而且放到合适的位置
playerBornGroup = tank_war->objectGroupNamed("born"); //在地图中找到主角的图层
CCDictionary* playerPosition = playerBornGroup->objectNamed("player_1"); //依据名称找到本图层的player_1位置
int x = playerPosition->valueForKey("x")->intValue();
int y = playerPosition->valueForKey("y")->intValue(); //得到object的坐标
player_1 = CCSprite::create("p1tank1.png"); //创建player精灵
player_1->setPosition(ccp(x, y));
this->addChild(player_1);
然后实现player_1的移动,本来使用的是CCMenuItemImage,发现仅仅能实现点击一次才干移动一次,不点击就不动了,不能实现按住button不停移动的状态,折腾了两天也搞不定,放弃之。
舍弃代码:
// CCMenuItemImage* moveLeft = CCMenuItemImage::create("arrow-leftx.png", "arrow-left.png", this, menu_selector(HelloWorld::howToMoveL));
// moveLeft->setPosition(ccp(30,80));
// moveLeft->boundingBox();
//
// CCMenuItemImage* moveRight = CCMenuItemImage::create("arrow-rightx.png", "arrow-right.png", this, menu_selector(HelloWorld::howToMoveR));
// moveRight->setPosition(ccp(120, 80));
//
// CCMenu* menu = CCMenu::create();
// menu->setPosition(origin);
// menu->addChild(moveLeft);menu->addChild(moveRight);
// this->addChild(menu);
// void HelloWorld::howToMoveR(CCObject* pMove)
// {
// player_1->setRotation(90); //cocos2d-x直接给了一个旋转精灵的函数,都用不到其它的图片了
// CCPoint origPo = player_1->getPosition();
// CCPoint newPo = origPo + ccp(10, 0);
// newPo.x = newPo.x < WIN_WIDTH - 30 ? newPo.x : WIN_WIDTH - 30;
// player_1->setPosition(newPo);
// return;
// }
今天的进度:
于是使用新的方法,不再用menu,将button中的normalImage与selectImage拿出来用Sprite实现,在CCTouchBegan、CCTouchMoved、CCTouchEnded中实现单击与长按,用schedule和update()函数实现player_1不停运动:
init()函数:
turnLeftx = CCSprite::create("arrow-leftx.png");
turnLeftx->setPosition(ccp(30, 80));
this->addChild(turnLeftx);
boolleft = false; reallyMoved = false;
CCTouchBegan()函数:
bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
if (turnLeftx->boundingBox().containsPoint(pTouch->getLocation())) //点击处坐标在左转button区域中(这里末尾加分号的话,会导致点哪里都左移的情况)
{
turnLeft->setVisible(true); //背景button显现
turnLeftx->setVisible(false); //上层左转button消失
boolleft = true; //在update中推断运动方向
this->schedule(schedule_selector(HelloWorld::update),0.1f); //使用schedule每隔0.1秒运行一次update
}
if (reallyMoved == false) //假设运行了update,reallyMoved会设为true
{ //假设没运行,就实现点击一下就移动一次
player_1->setRotation(-90); //player_1图片左转90度
CCPoint origPo = player_1->getPosition(); //获得player_1原始的坐标
CCPoint newPo = origPo - ccp(10, 0); //设定新的坐标,左移10个像素
newPo.x = newPo.x > 30 ? newPo.x : 30; //假设跑到屏幕边缘就动了,player_1为30*30
player_1->setPosition(newPo);
}
return true;
}
CCTouchEnded()函数:
void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) //点击结束时还原一些參数
{
this->unschedule(schedule_selector(HelloWorld::update)); //结束update
turnLeft->setVisible(false);
turnLeftx->setVisible(true);
boolleft = false;
return;
}
update()函数:
void HelloWorld::update(float alpha)
{
reallyMoved = true; //推断是否是长时间按住button(0.1秒)
if (boolleft==true)
{
player_1->setRotation(-90);
CCPoint origPo = player_1->getPosition();
CCPoint newPo = origPo - ccp(10, 0);
newPo.x = newPo.x > 30 ? newPo.x : 30;
player_1->setPosition(newPo);
}
}
OK!最后要加上(用来实现点击):
void HelloWorld::onEnter()
{
CCLayer::onEnter();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
}
void HelloWorld::onExit()
{
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCLayer::onExit();
}
实现单击,长按的方法有非常多,好像还能够用button,可惜捯饬了一下午也没实现。
cocos2d-x 旅程開始--(实现单击与长按)的更多相关文章
- cocos2d-x 旅程開始--(实现瓦片地图中的碰撞检測)
转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来. ...
- python 爬虫1 開始,先拿新浪微博開始
刚刚開始学. 目的地是两个.一个微博,一个贴吧 存入的话,临时还没想那么多.先存到本地目录吧 分词和推荐后面在整合 mysql mongodb hadoop redius 后面在用 我最终知道为什么大 ...
- Cocos2d-X开发中国象棋《三》開始场景的实现
在前面两节(第一节.第二节)中介绍了中国象棋的功能和project文件.在这篇博客中将介绍中国象棋的開始场景的实现 在写代码前先理清一下实现開始场景的思路: 1.打开游戏后进入開始场景,场景上显示一个 ...
- 開始折腾cocos2d-x,使用批处理来创建项目
開始抽出时间学习cocos2d-x了.尽管C和C++还都不咋地.只是在开发中学习记忆也许会更深吧. so决定从今天開始正式学习的用自己的空暇时间折腾它了.正好这个五一没什么事.昨天搭建了一下开发环境. ...
- OpenCms创建站点过程图解——献给OpenCms的刚開始学习的人们
非常多人都听说了OpenCms,知道了它的强大,索性的下载安装了,最终见到了久违OpenCms,看到了它简洁的界面,欣喜过后却不免一脸茫然,这个东西怎么用,我怎么用它来建站,从哪開始,无从下手,找资料 ...
- 送给刚刚開始学cocos2d-x引擎 移植Android的同学
刚刚開始学cocos2-x,不过依照教程把已经安了一般Android的开发环境的eclipse又一次升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 參考博客 http://blog.cs ...
- wxWidgets刚開始学习的人导引(4)——wxWidgets学习资料及利用方法指导
wxWidgets刚開始学习的人导引全文件夹 PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...
- iPhone开发【一】从HelloWorld開始
转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8013553 作者:张燕广 从经典的HelloWorld開始踏入iPhon ...
- CC++刚開始学习的人编程教程(9) Windows8.1安装VS2013并捆绑QT与编程助手
我们在Windows8.1安装VS2013并捆绑QT与编程助手须要下列文件. 2. 在虚拟机中开启Windows8.1 3.然后选择VS2013的安装镜像. 4.将镜像拷贝到虚拟机. 5.我们装载这个 ...
随机推荐
- Maven实战(四)——基于Maven的持续集成实践
Martin的<持续集成> 相信非常多读者和我一样.最早接触到持续集成的概念是来自Martin的著名文章<持续集成>.该文最早公布于2000年9月,之后在2006年进行了一次修 ...
- mysql错误:this authentication plugin is not supported
this authentication plugin is not supported 应用程序连接mysql docker一直报错:this authentication plugin is not ...
- 计算均值mean的MapReduce程序Computing mean with MapReduce
In this post we'll see how to compute the mean of the max temperatures of every month for the city o ...
- 卡方检验(Chi-square test/Chi-Square Goodness-of-Fit Test)
什么是卡方检验 卡方检验是一种用途很广的计数资料的假设检验方法.它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析.其根本思想就是在于比较理论频数和实际频数 ...
- 【BZOJ】【3240】【NOI2013】矩阵游戏
十进制快速幂+矩阵乘法+常数优化 听说这题还可以强行算出来递推式……然后乘乘除除算出来…… 然而蒟蒻选择了一个比较暴力的做法= = 我们发现这个递推的过程是线性的,所以可以用矩阵乘法来表示,$x=a* ...
- Linq编程小趣味爱因斯坦谜题
最近看到一个比较老的题目,题目----在一条街上,有5座房子,喷了5种颜色,每个房里住着不同国籍的人,每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物,问题---谁养鱼? 以前没事还做过这个题,现在 ...
- 【手势识别】简介 GestureDetector ScaleGestureDetector
2017-3-6 单点触摸手势识别器GestureDetector 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等.一般情况下,我们可以通过View或Activ ...
- WordPress 无法使用the_content()方法输出内容
在使用WordPress里在一个页面里我使用the_content()方法来输出当前页面的内容,但却显示为空,而标题,url等都没有问题 在网络上好像遇到这种情况的人很少只找到了一个说是可能是func ...
- Visual Studio环境变量使用实例:使用环境变量来组织project
前言 在前一篇文章Visual Studio中的环境变量(以Visual Studio 2013为例)中介绍了VS中的环境变量,本文将以实际样例说明怎样合理使用这些环境变量来组织VC++project ...
- COM不同的线程模型对列集和同步的不同要求。