小菜鸟一枚,学习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 旅程開始--(实现单击与长按)的更多相关文章

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

    转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来. ...

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

    刚刚開始学. 目的地是两个.一个微博,一个贴吧 存入的话,临时还没想那么多.先存到本地目录吧 分词和推荐后面在整合 mysql mongodb hadoop redius 后面在用 我最终知道为什么大 ...

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

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

  4. 開始折腾cocos2d-x,使用批处理来创建项目

    開始抽出时间学习cocos2d-x了.尽管C和C++还都不咋地.只是在开发中学习记忆也许会更深吧. so决定从今天開始正式学习的用自己的空暇时间折腾它了.正好这个五一没什么事.昨天搭建了一下开发环境. ...

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

    非常多人都听说了OpenCms,知道了它的强大,索性的下载安装了,最终见到了久违OpenCms,看到了它简洁的界面,欣喜过后却不免一脸茫然,这个东西怎么用,我怎么用它来建站,从哪開始,无从下手,找资料 ...

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

    刚刚開始学cocos2-x,不过依照教程把已经安了一般Android的开发环境的eclipse又一次升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 參考博客 http://blog.cs ...

  7. wxWidgets刚開始学习的人导引(4)——wxWidgets学习资料及利用方法指导

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

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

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

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

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

随机推荐

  1. jdbc连接遭遇RAC设备

    今天进行junit的Case回归测试,功能测试人员告知数据库ip进行了变更,于是 将jdbc连接的url进行了相应的变更如下 jdbcConnection = java.sql.DriverManag ...

  2. chromium对网页获取favicon

    每一个网页都有一个favicon,在历史记录的保存中须要用到.在content文件夹下,这个没有实现. 以下说一下我的实现过程: web_contents_impl.cc文件里有方法:WebConte ...

  3. 简明python教程 --C++程序员的视角(六):输入输出IO

    程序与用户交互 你会从用户那里得到输入,然后打印一些结果.我们可以分别使用raw_input,input和print语句来完成这些功能.raw_input会返回字符串,而input会返回字面值,相当于 ...

  4. 常用的OpenCV函数速查

    常用的OpenCV函数速查 1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4 ...

  5. 初识Tomcat

    Tomcat的安装非常简单,解压即可! Tomcat要正常运行,需要配置一个环境变量JAVA_HOME,指向jdk的主目录.

  6. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

    注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 ...

  7. 稀疏数据压缩查询方法:Rank & Select 操作

    1.稀疏数据的例子 对于网络图对应的节点关联矩阵.数据生成的哈希表等,这些存储起来是稀疏的,这样我们就会想到需要压缩空间.但是在压缩存储空间的同时,还要支持高效的查询操作. Rank & Se ...

  8. Proxy 代理模式 动态代理 cglib MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. 在Fedora8上安装使用ActiveMQ5.8

    [ActiveMQ安装] ActiveMQ在win平台的安装简单,在Linux Fedora上安装也不难,解压就可以了.以下是我总结的步骤: 第一步,从以下地址下载apache-activemq-5. ...

  10. ListView实现数据列表显示

    要将数据库中的数据列表显示在屏幕上,我们要使用ListView这个控件,当用户从数据库中取出数据时,要将数据绑定到显示控件上,如何绑定呢,我们需要创建适配器进行绑定,创建适配器有两种方式: 第一种是用 ...