小菜鸟一枚,学习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,可惜捯饬了一下午也没实现。

转载于:https://www.cnblogs.com/gcczhongduan/p/3984287.html

cocos2d-x 旅程開始--(实现单击与长按)相关推荐

  1. Cocos2d-X开发中国象棋《三》開始场景的实现

    在前面两节(第一节.第二节)中介绍了中国象棋的功能和project文件.在这篇博客中将介绍中国象棋的開始场景的实现 在写代码前先理清一下实现開始场景的思路: 1.打开游戏后进入開始场景,场景上显示一个 ...

  2. CC++刚開始学习的人编程教程(9) Windows8.1安装VS2013并捆绑QT与编程助手

    我们在Windows8.1安装VS2013并捆绑QT与编程助手须要下列文件. 2. 在虚拟机中开启Windows8.1 3.然后选择VS2013的安装镜像. 4.将镜像拷贝到虚拟机. 5.我们装载这个 ...

  3. iPhone开发【一】从HelloWorld開始

    转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8013553 作者:张燕广 从经典的HelloWorld開始踏入iPhon ...

  4. 開始Unity3D的学习之旅

    前言:这个系列的文章纯属对自己学习的整理,非高手之作.但确实的记载了我作为一个没接触过3D游戏编程的大学生的心路历程.争取每周整理一次吧.之所以会開始学Unity3D,最基本的原因是由于在快放暑假的时 ...

  5. (轉貼) 友達光電第五屆【A+種子暑期實習計畫】開始辦理報名 (News)

    友達光電第五屆[A+種子暑期實習計畫]開始辦理報名 友達光電以絕佳的團隊執行力,帶領台灣光電產業進入世界級的領域! 還在就學的你/妳,想成為世界級光電產業的A+種子嗎? 把握最後的暑假加入友達的A+種 ...

  6. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言 2 下载.安装wxWidgets 3 wxWidgets应用程序初体验 4 wxWidgets学习资料及利用方法指导 5 ...

  7. 今天開始學習silverlight了

    今天開始學習silverlight了,雖然集團里面很多的計算機安裝的系統是winpro2000,但老大說先不管,那只有學了,請大家多幫忙,發此貼留記號 转载于:https://www.cnblogs. ...

  8. # 从零開始搭建Hadoop2.7.1的分布式集群

    Hadoop 2.7.1 (2015-7-6更新),Hadoop的环境配置不是特别的复杂,可是确实有非常多细节须要注意.不然会造成很多配置错误的情况.尽量保证一次配置正确防止重复改动. 网上教程有非常 ...

  9. ExtJs自学教程(1):一切从API開始

    题 记 该系列文章不側重全方位的去介绍ExtJs的使用,仅仅是側重于解决ExtJs问题的思考方法.写的人不用长篇大论,学的人则可以自立更生.l   学习的人仅仅要有一些CSS的javascript的基 ...

最新文章

  1. 【Groovy】Groovy 语言特点简介 ( 支持 Java 语法 | 支持 Java 虚拟机 | Groovy 语言是动态语言 | Groovy 扩展 JDK | 编译时元编程 )
  2. Python中list、set和tuple
  3. 服务端第三次课程:面向切面编程AOP
  4. C++继承中的对象模型
  5. 分布式数据库技术基础:分布透明性相关知识
  6. 信道效率以及信道的吞吐率
  7. axios 注册拦截器 cdn引用_PicGo+jsDelivr+GitHub搭建免费cdn加速的图床
  8. 3综述 yolo_Onestage目标检测算法综述
  9. selenium通过加载火狐Firefox配置文件FirefoxProfile,实现免登陆访问网站
  10. Hudson Jameson将在柏林硬分叉后卸任以太坊基金会社区经理
  11. C++学习总结(1)
  12. 计算机系统结构与组成原理
  13. 三部曲打造无路由器破解闪讯WiFi共享 经好几个同学验证
  14. 前端代码检测重复率工具
  15. ARM Cortex-M0系统简介
  16. 吊打天猫精灵等“本土”智能音箱,HomePod做得到吗?...
  17. 仲阳天王星 | 八载同行 启航向星
  18. android 获取IP地址
  19. flink sql读取kafka-入门级
  20. stm32h7能跑linux,STM32H7榨干了Cortex-M7的最后一滴血

热门文章

  1. CentOS6.9下ssh密钥登录配置步骤(免密码登录)和ssh-keygen 命令常用参数
  2. [大数据可视化]-saiku的源码包Bulid常见问题和jar包
  3. java初学者笔记总结day6
  4. POJ 1300 Door Man(欧拉回路的判定)
  5. HTML5游戏引擎Playcraft将于近日正式启动
  6. CERL 2.0 预告:Erlang Style Concurrency + 状态机
  7. 能测试快充真假的软件,苹果iOS 12可自行测试真假快充:山寨充电器将被洗牌
  8. 修复Net4.0在IE11下doPostBack无效的问题
  9. lpc2000 filash utility 程序烧写工具_单片机烧录程序的次数
  10. spring cloud gateway url重写