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,可惜捯饬了一下午也没实现。

时间: 2024-12-15 18:55:36

cocos2d-x 旅程開始--(实现单击与长按)的相关文章

cocos2d-x 旅程開始--(实现瓦片地图中的碰撞检測)

转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来.还要继续学习啊! 上次的进度: 实现了坦克的移动,昨天把程序优化了一下,能整合在一起的就整合在一个函数里了.并且对碰到屏幕边缘的情况进行了检測.之前的代码都是部分代码,今天试试把代码整个贴上去. 这两天的进度: 打这么多汉字,自个都看不进去.直接上代码: /////////////////////实

python 爬虫1 開始,先拿新浪微博開始

刚刚開始学. 目的地是两个.一个微博,一个贴吧 存入的话,临时还没想那么多.先存到本地目录吧 分词和推荐后面在整合 mysql mongodb hadoop redius 后面在用 我最终知道为什么大家都推荐用python写爬虫了...我擦.一些开源的包实在写的太好了 我開始I还百思不得其解的为什么要用python这种语言.我真的用起来非常"蛋疼" 并且.我用这门语言真的像我当初用c语言一样的用的.纯粹的用面向过程的思想写. 一点一点墨迹.. .尽管我知道他有面向对象的特性.. . 可

OpenCms创建站点过程图解——献给OpenCms的刚開始学习的人们

非常多人都听说了OpenCms,知道了它的强大,索性的下载安装了,最终见到了久违OpenCms,看到了它简洁的界面,欣喜过后却不免一脸茫然,这个东西怎么用,我怎么用它来建站,从哪開始,无从下手,找资料,少之双少,几经周折后,迫于时间等诸多因素,非常多人无奈地选择了放弃…… 希望这篇文章能够对OpenCms的追随者们有所帮助,但这也仅仅是OpenCms的皮毛,把它的强大功能为已所用还须要我们付出很多其它的努力…… 一.切换到“/sites/”下,创建网站目录“testWeb” 输入目录的标题,这个

从零開始开发Android版2048 (二)获取手势信息

今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了GestureDetector.这个类能够帮助我们获取一些常见的用户对屏幕的操作.比如单击.双击.按压.拖动等.详细的使用说明.大家能够查API也能够去百度,或者看我之前有一篇使用GestureDetector实现的小样例(http://blog.csdn.net/xiapinnong/article/det

iPhone开发【一】从HelloWorld開始

转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8013553 作者:张燕广 从经典的HelloWorld開始踏入iPhone开发的大门吧! keyword:HelloWorld iPhone IOS 1.打开xcode,选择"Create a New Xcode project" 2.xcode中的project分为两大类,一是IOS,二是Mac OS X,前者是进行iPhone/iPad开发,后者是进行Ma

送给刚刚開始学cocos2d-x引擎 移植Android的同学

刚刚開始学cocos2-x,不过依照教程把已经安了一般Android的开发环境的eclipse又一次升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 參考博客 http://blog.csdn.net/b1boy/article/details/14645277 说说大概的过程: 下载ndk插件,ndk包,cdt插件.最開始我依照书上的下载了cocos2d-x 2.0.1,希望跟书上统一起来,这样以后学习的时候能够參考书上的也不会遇到太多问题.下好了之后就遇到了问题,我的电脑上仅仅有

【雷电】源代码分析(一)-- 进入游戏開始界面

转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/24941949 源代码下载:http://download.csdn.net/detail/oyangyufu/7289283 进入游戏開始界面效果图: 源代码分析: StartMenu场景--进入游戏開始界面 初始化场景,包含初始Android按键,加入背景图片.加入logo图片.创建游戏菜单開始/设置/关于并加入其响应事件. 初始化飞船漂移动画,背景音乐 程序分析: bool St

【Cocos游戏实战】功夫小子第三课之过渡场景和開始菜单的实现

本节课的视频教程地址是:第三课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,手机端首次也能够领取五天的会员时间哦(即使是购买年会员眼下也不过年费260),成为极客学院学习会员能够无限制的下载和观看全部的学院站点的视频,谢谢您的支持! 经过前面两节课的学习.我们已经知道我们要做的是一个什么样的游戏项目.而且对游戏的基本特点和当中的重难点有了一个主要的认识,而且完毕了项目环境的基本搭建.以及项目基础类等工作. 从这节

cocos2d-x学习日志(18) --程序是怎样開始执行与结束?

问题的由来 怎么样使用 Cocos2d-x 高速开发游戏.方法非常easy,你能够看看其自带的例程,或者从网上搜索教程,执行起第一个HelloWorld,然后在 HelloWorld 里面写相关逻辑代码.加入我们的层.精灵等 ~ 我们并不一定须要知道 Cocos2d-x 是怎样执行或者在各种平台之上执行,也不用知道 Cocos2d-x 的游戏是怎样执行起来的.它又是怎样渲染界面的 ~~~ 两个入口 程序入口的概念是相对的,AppDelegate 作为跨平台程序入口,在这之上做了还有一层的封装,封