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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android判断view在屏幕可见,如何检查TextView是否在Android可见屏幕内

我想知道我的textview是否在可见的屏幕区域内.但似乎没有什么对我有用.我以前检查过的代码是Rect rect new Rect();//textview intialized in onCreate as text1text1.getHitRect(rect);text1.measure(0, 0);//layout is the parent layout (linear) in which i am adding the…

【Modern OpenGL】摄像机系统 Camera

说明&#xff1a;跟着learnopengl的内容学习&#xff0c;不是纯翻译&#xff0c;只是自己整理记录。 强烈推荐原文&#xff0c;无论是内容还是排版。 原文链接 本文地址&#xff1a;http://blog.csdn.net/aganlengzi/article/details/50448469 摄像机 Camera 在前面的教程中…

jQuery操作cookie

First of all&#xff0c;引用jq的一个插件jquery.cookie.js 1<span style"font-size:14px">$.cookie(’the_cookie’, ‘the_value’); //新建cookie2 $.cookie(’the_cookie’, null); //删除一个cookie</span><span style"font-size:14px&quo…

linux ntp时间同步

一、搭建时间同步服务器1、编译安装ntp serverrpm -qa | grep ntp若没有找到&#xff0c;则说明没有安装ntp包&#xff0c;从光盘上找到ntp包&#xff0c;使用rpm -Uvh ntp***.rpm进行安装2、修改ntp.conf配置文件vi /etc/ntp.conf①、第一种配置&#xff1a;允许任何IP的客户机…

android jni release,Android NDK 设置编译模式debug和release

原文&#xff1a;http://stackoverflow.com/questions/14564918/android-ndk-release-buildUnless you have created the Application.mk or defined your application as debuggable inside the AndroidManifest.xml you dont have to do anything because by default the app…

android setimageresource取list的,Java ImageView.setImageTintList方法代码示例

import android.widget.ImageView; //导入方法依赖的package包/类public static void show(Context context, CharSequence charSequence, int type) {View layout;if (toast null) {toast Toast.makeText(context, "", Toast.LENGTH_SHORT);initToast(toast);layo…

MFC之CAsyncSocket详解

CAsyncSocket类是从Object类派生而来。CAsyncSocket对象称为异步套接字对象 使用CAsyncSocket进行网络编程&#xff0c;可以充分利用Windows操作系统提供的消息驱动机制&#xff0c;通过应用程序框架来传递消息&#xff0c;方便地处理各种网络事件。另一方面&#xff0c;作为M…

codevs1040 统计单词个数

题目描述 Description给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入&#xff0c;且保证每行一定为20个)。要求将此字母串分成k份(1<k<40)&#xff0c;且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当…

UE MATH

1. 求两点的单位向量

root 密码丢失后的重新设置

/usr/local/mysql/bin/mysqld_safe --skip-grant-tables & mysql> use mysql; mysql> update user set passwordPASSWORD("root") where userroot;service mysqld stop; service mysqld start;/usr/local/mysql/bin/mysql -u root -p 转载于:https://w…

yum安装git

此方法对于RHEL、Fedora、CentOS有效&#xff1a; 1.yum install git 2.yum istall git-svn git-email git-gui gitk 转载于:https://www.cnblogs.com/moqiang02/p/4061129.html

材质

1. 随摄像机变化的镜面放射效果 2. 给物体表面增加抛光度 3. 菲涅耳透镜效果

Metasploit Framework命令汇总

一、msfconsole ? 帮助菜单back 从当前环境返回banner 显示一个MSF bannercd 切换目录color 颜色转换connect 连接一个主机exit 退出MSFhelp 帮助菜单info 显示一个或多个模块的信息irb 进入irb脚本模式jobs 显示和管理作业kill 杀死一个作业load 加载一个插件loadpath 在一个…

html keyup事件,jquery keyup事件为什么不执行?

先指出你的一个错误点$(#skillKey).on(click, tr, function () {$(this).css(color,red);$(this).keyup(function(){alert(123)});});你这样绑定事件&#xff0c;结果是点击一次tr绑定一次&#xff0c;点了多少次就绑定了多少次&#xff0c;这个例子还是不明显&#xff0c;你在…

cable

1. 建立一个actor&#xff0c;添加一个cable, 然后添加两个mesh作为cable的两个端点 2. 在编辑器中只能设置cable终点attach的mesh和mesh的socket, 因此需要在actor的构成函数里手动的设置 cable起点attach的mesh和socket

windows下memcache的安装总结

一、memcache软件的安装&#xff1a; 1、下载memcache的windows版本&#xff0c;把memcached.exe放在F:盘符&#xff0c;&#xff08;memcached.exe文件位置不可变动&#xff09;。 2、进入cmd命令终端&#xff0c;进入到F:盘符。 3、memcached.exe -d install 命令进行memcach…

html 调用c#dll中的控件,C#调用ActiveX控件的方法

C#调用ActiveX控件时通常要进行两步操作&#xff1a;第一步&#xff1a;注册控件&#xff0c;例如ABE.DLL&#xff0c;将ABE.DLL拷贝至系统文件夹SYSTEM32下&#xff0c;然后在开始中执行CMD命令&#xff0c;regsvr32 ABE.DLL&#xff0c;会提示注册成功&#xff1b;第二步&…

Android-将切换tabs的指示器合并到ActionBar上

最近比较忙&#xff0c;好久没更新过博客。国庆第一天没回家&#xff0c;闲下来可以把之前就想贴上来的东西写一下。 使用过Smooth和Fuubo这两个优秀的第三方微博客户端的同学应该见过他们的主页UI&#xff0c;如下图&#xff1a; 他们把切换tabs的指示器放在了ActionBar上&…