Cocos2dx 3.2 横版过关游戏Brave学习笔记(三)
来源:互联网 发布:php与python交互 编辑:程序博客网 时间:2024/05/16 09:02
触摸响应
原版的第二篇包含了动画和触摸响应。动画部分我费了好大工夫才搞定,所以就先把那部分当作第二篇了。另外我发现原来的教程基本上不会大段贴代码,只是把道理讲清楚,代码可以自己下载了慢慢看。我觉得我也应该这样,如果上来就读大段代码,反而容易让人厌倦。
为了方便进行,代码做了些小改动,如将HelloWorld改名为Main,player,enemy1改为私有变量_player,_enemy1,将USING_NS_CC从HelloWorld的cpp文件移动到h文件等等,具体细节可以在:
https://github.com/douxt/Brave_cpp 查看
点击 commits 可以查看所有历史版本以及改动
点击<>便可以查看并下载这个版本的代码。
下一步给MainScene这个Layer添加触摸响应。
先从简单的开始,即触摸屏幕后,player角色会边播放行走动画,并移动到点击的屏幕位置。
给MainScene增加一个EventListenerTouchOneByOne* 类型的_listener_touch
给MainScene.h增加触摸响应函数:
并在 MainScene::init 里增加:
触摸响应函数实现为:
这里调用了Player类的walkTo函数,还没定义,所以在Player头文件和源文件中定义一下。
我曾经想用stopActionTag函数来停止指定的动作,不知为何竟然没成功。这里我索性将动作保存到私有变量_seq中,初始化为nullptr, 并在移动结束的回调中将其赋值为nullptr。
这样如果_seq不为空,则运动正在进行,需要把这个动作停下,否则可能出现多个MoveTo叠加的情况,这不是想要的结果。
然后通过现在位置和目标位置横坐标的比较,决定是否在X方向反转角色。接着根据动作计算所需时间。然后创建MoveTo动作,并定义了一个回调函数func,这是个lambda函数,具体资料可以在网上查到。
然后建立回调动作,将移动和回调组合为序列,然后运行这个序列,并开始播放这个角色的第一个动画walk.
现在运行一下,发现角色会向着点击的方向移动,移动到目的地后,动画会停止播放。
现在的版本为:
https://github.com/douxt/Brave_cpp/tree/51b653b01b5427d985e10483499487d450af31c2
原版的第二篇包含了动画和触摸响应。动画部分我费了好大工夫才搞定,所以就先把那部分当作第二篇了。另外我发现原来的教程基本上不会大段贴代码,只是把道理讲清楚,代码可以自己下载了慢慢看。我觉得我也应该这样,如果上来就读大段代码,反而容易让人厌倦。
为了方便进行,代码做了些小改动,如将HelloWorld改名为Main,player,enemy1改为私有变量_player,_enemy1,将USING_NS_CC从HelloWorld的cpp文件移动到h文件等等,具体细节可以在:
https://github.com/douxt/Brave_cpp 查看
点击 commits 可以查看所有历史版本以及改动
点击<>便可以查看并下载这个版本的代码。
下一步给MainScene这个Layer添加触摸响应。
先从简单的开始,即触摸屏幕后,player角色会边播放行走动画,并移动到点击的屏幕位置。
给MainScene增加一个EventListenerTouchOneByOne* 类型的_listener_touch
给MainScene.h增加触摸响应函数:
bool onTouchBegan(Touch* touch, Event* event);private:EventListenerTouchOneByOne* _listener_touch;
并在 MainScene::init 里增加:
_listener_touch = EventListenerTouchOneByOne::create();_listener_touch->onTouchBegan = CC_CALLBACK_2(MainScene::onTouchBegan,this);_eventDispatcher->addEventListenerWithSceneGraphPriority(_listener_touch, this);
触摸响应函数实现为:
bool MainScene::onTouchBegan(Touch* touch, Event* event){Vec2 pos = this->convertToNodeSpace(touch->getLocation());_player->walkTo(pos);//log("MainScene::onTouchBegan");return true;}
这里调用了Player类的walkTo函数,还没定义,所以在Player头文件和源文件中定义一下。
void Player::walkTo(Vec2 dest){//stop current moving action, if any.if(_seq)this->stopAction(_seq);auto curPos = this->getPosition();//flip when moving backwardif(curPos.x > dest.x)this->setFlippedX(true);elsethis->setFlippedX(false);//calculate the time needed to moveauto diff = dest - curPos;auto time = diff.getLength()/_speed;auto move = MoveTo::create(time, dest);//lambda functionauto func = [&](){this->stopAllActions();_seq = nullptr;};auto callback = CallFunc::create(func);_seq = Sequence::create(move, callback, nullptr);this->runAction(_seq);this->playAnimationForever(0);}
我曾经想用stopActionTag函数来停止指定的动作,不知为何竟然没成功。这里我索性将动作保存到私有变量_seq中,初始化为nullptr, 并在移动结束的回调中将其赋值为nullptr。
这样如果_seq不为空,则运动正在进行,需要把这个动作停下,否则可能出现多个MoveTo叠加的情况,这不是想要的结果。
然后通过现在位置和目标位置横坐标的比较,决定是否在X方向反转角色。接着根据动作计算所需时间。然后创建MoveTo动作,并定义了一个回调函数func,这是个lambda函数,具体资料可以在网上查到。
然后建立回调动作,将移动和回调组合为序列,然后运行这个序列,并开始播放这个角色的第一个动画walk.
现在运行一下,发现角色会向着点击的方向移动,移动到目的地后,动画会停止播放。
现在的版本为:
https://github.com/douxt/Brave_cpp/tree/51b653b01b5427d985e10483499487d450af31c2
0 0
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(三)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(一)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(二)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(四)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(五)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(六)
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(七)
- cocos2dx游戏开发学习笔记(三)
- 横版过关游戏源码
- 横版过关游戏开发-游戏流程
- cocos2dx游戏开发学习笔记(一)
- cocos2dx游戏开发学习笔记(二)
- 横版过关游戏开发1
- 横版过关游戏开发-人物控制
- 横版过关游戏开发-碰撞检测
- 横版过关游戏开发-图像处理
- 2d横版过关游戏
- 【官方教程】使用Quick-Cocos2d-x搭建一个横版过关游戏(三)
- 【友商分析】Palo Alto安全业务对象信息
- C++的深拷贝与浅拷贝
- XTU-1185 Bob's Problem
- 纺服企业九成上市赢利 存货同比增长
- 中处理崩溃异常并重启程序
- Cocos2dx 3.2 横版过关游戏Brave学习笔记(三)
- 利用overflow属性解决子元素float浮动后父级元素高度无法自适应的问题
- 硬盘文件丢失怎么才能恢复
- 猴子选大王问题&&约瑟夫环问题
- "mkimage" command not found - U-Boot images will not be built
- GDB使用手册
- 未来实木及实木复合地板流行趋势
- UVA 10917 - Walk Through the Forest(dijstra)
- CSS3学习笔记之属性选择器(上)