[置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动
cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动
写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不管是简单的还是困难的现在都慢慢的一步一步克服了,其实用cocos2d-x做游戏特别的简单,大家不要被是做游戏吓到了,支持我把游戏开源的原因是因为 eoe上海 的大家的支持。加油,加油,要说明一下的是,写得不好还请大家多多包含哦。相信你们跟着我得博客,一步一步做肯定会成功的。
看到有朋友跟这我做,感到很开心这样我才有写下去的信心,大家一起加油,主角写好了几天了一直没有更新,今天给大家更新送到,下次更新看到家的评论。
好了回到正题,今天开始主角的上下移动的控制
效果图片
首先来添加主角类
SWGamePlayer.h
- //
- // SWGamePlayer.h
- // Holdtail
- //
- // Created by 帅 印 on 13-12-04.
- //
- //
- #ifndef __Holdtail__SWGamePlayer__
- #define __Holdtail__SWGamePlayer__
- #include <iostream>
- #include <sstream>
- #include "cocos2d.h"
- #include "cocos-ext.h"
- using namespace cocos2d;
- using namespace std;
- using namespace extension;
- //类型转换类int.float --> String
- template<typename T>
- string Convert2String(const T & value){
- stringstream ss;
- ss << value;
- return ss.str();
- }
- //定义图片的枚举的类型
- typedef enum{
- tag_player_up,
- tag_player_down,
- tag_player_fly,
- tag_player_run,
- tag_playerHp,
- }tagPlayers;
- class SWGamePlayer:public cocos2d::Sprite{
- public:
- static SWGamePlayer *createPlayer(const char *fileName,int allCount,float sprit);
- //降低主角的血量
- void downHp(float _value);
- int hp;//血量
- int hpMax;//最高血量
- static SWGamePlayer *sharedPlayer();
- void callbackForDown();
- private:
- void playerInit(const char *fileName,int allCount,float sprit);
- //精灵的动态表现 文件名称 文件帧数 精灵速度
- void createAnimate(const char *fileName,int allCount,float sprit);
- bool isStrong;
- int strongCount;
- int strongTime;
- void strongIng(float soso);
- };
- #endif /* defined(__Holdtail__SWGamePlayer__) */
SWGamePlayer.m
- //
- // SWGamePlayer.cpp
- // Holdtail
- //
- // Created by 帅 印 on 13-8-21.
- //
- //
- #include "SWGamePlayer.h"
- #include "SWGameMap.h"
- #include "SWGameWorld.h"
- #include "SimpleAudioEngine.h"
- #include "SWMenu.h"
- using namespace cocos2d;
- using namespace CocosDenshion;
- //设置主角精灵的两种表现形式
- static Sprite *flySprite;
- static Sprite *runSprite;
- //声明静态变量
- static SWGamePlayer *SWPL;
- SWGamePlayer *SWGamePlayer::sharedPlayer(){
- if(SWPL != NULL){
- return SWPL;
- }
- return NULL;
- }
- SWGamePlayer *SWGamePlayer::createPlayer(const char* fileName,int allCount,float sprit){
- SWGamePlayer *player = new SWGamePlayer();
- if (player && player->initWithFile("nulls.png")) {
- player->autorelease();
- player->playerInit(fileName,allCount,sprit);
- return player;
- }
- CC_SAFE_DELETE(player);
- return NULL;
- }
- void SWGamePlayer::playerInit(const char *fileName,int allCount,float sprit){
- SWPL = this;
- Size size = Director::getInstance()->getWinSize();
- //主角加入枪支
- auto spgane = Sprite::create("gang01.png");
- spgane->setPosition(Point(40, -10));
- addChild(spgane);
- //创建动物的动画
- createAnimate(fileName,allCount,sprit);
- //初始化主角的位置
- this->setPosition(Point(size.width/8, size.height/2));
- //设置血量
- hp = 1000;
- hpMax = 1000;
- ControlSlider* slider = ControlSlider::create("brood.png", "broods.png", "null.png");
- slider->setPosition(Point(250, size.height-40));
- slider->setTag(tag_playerHp);
- /* 设置滑动条的范围 */
- slider->setMinimumValue(0);
- slider->setMaximumValue(hpMax);
- /* 直接设置滑动条的当前值 */
- slider->setValue(hp);
- //slider->setTouchEnabled(false);
- SWGameWorld::sharedWorld()->addChild(slider);
- //添加主角形象
- Sprite *hmsprite = Sprite::create("gameicon.png");
- hmsprite->setPosition(Point(50, size.height-40));
- SWGameWorld::sharedWorld()->addChild(hmsprite);
- //添加游戏进行进度条
- Sprite *timebg = Sprite::create("timelinebg.png");
- timebg->setPosition(Point(670, size.height-35));
- SWGameWorld::sharedWorld()->addChild(timebg);
- //添加游戏进行条动画效果
- Sprite *timeplay = Sprite::create("timelineyou.png");
- timeplay->setPosition(Point(510, size.height-40));
- SWGameWorld::sharedWorld()->addChild(timeplay);
- //让动画进行播放
- // ActionInterval* moveToGameOver = MoveBy::create(120, Point(320, 0));
- // CallFunc * funCall =CallFunc::create(timeplay, callfunc_selector(SWGamePlayer::gameGoOver));
- // FiniteTimeAction *seq =Sequence::create(moveToGameOver,funCall,NULL);
- // seq->setTag(tag_player_down);
- // timeplay->runAction(seq);
- // MenuItemImage *SPJN01ITEM = MenuItemImage::create("pausebutton.png", "pausedownbutton.png",this,menu_selector(SWGamePlayer::backMenu));
- // SPJN01ITEM->setPosition(Point(420,280));
- // Menu *menu = Menu::create(SPJN01ITEM,NULL);
- // SWGameWorld::sharedWorld()->addChild(menu);
- }
- void SWGamePlayer::createAnimate(const char *fileName,int allCount,float sprit){
- runSprite = Sprite::create("zhujuerun.png");
- runSprite->setTag(tag_player_run);
- Animation *animation = Animation::create();
- Texture2D *texture = TextureCache::getInstance()->addImage("zhujuerun.png");
- int eachWidth = runSprite->getContentSize().width/8;
- for (int i = 0; i<8; i++) {
- animation->addSpriteFrameWithTexture(texture, Rect(i*eachWidth, 0, eachWidth, this->getContentSize().height));
- }
- animation->setDelayPerUnit(0.1f);//必须设置否则不会动态播放
- animation->setRestoreOriginalFrame(true);//是否回到第一个
- animation->setLoops(-1);//重复次数
- FiniteTimeAction *animaterun = Animate::create(animation);
- runSprite->setPosition(this->getPosition());
- runSprite->runAction(animaterun);
- this->addChild(runSprite);
- flySprite = Sprite::create("zhujue.png");
- flySprite->setTag(tag_player_fly);
- Animation *animations = Animation::create();
- Texture2D *textures = TextureCache::getInstance()->addImage("zhujue.png");
- int eachWidths = flySprite->getContentSize().width/8;
- for (int i = 0; i<8; i++) {
- animations->addSpriteFrameWithTexture(textures, Rect(i*eachWidths, 0, eachWidths, this->getContentSize().height));
- }
- animations->setDelayPerUnit(0.05f);//必须设置否则不会动态播放
- animations->setRestoreOriginalFrame(true);//是否回到第一个
- animations->setLoops(-1);//重复次数
- FiniteTimeAction *animateruns = Animate::create(animations);
- flySprite->setPosition(this->getPosition());
- flySprite->runAction(animateruns);
- this->addChild(flySprite);
- runSprite->setOpacity(0);
- flySprite->setOpacity(255);
- }
- void SWGamePlayer::downHp(float _value){
- //通过这个方法来检测是否有发生碰撞
- //获取血量减掉血量
- hp = hp-_value;
- //将血量ICO进行更新
- ControlSlider *slider = (ControlSlider *)SWGameWorld::sharedWorld()->getChildByTag(tag_playerHp);
- slider->setValue(hp);
- //判断主角的血量是否已经达到了零的位置
- if(0 >= hp){
- Size size = Director::getInstance()->getWinSize();
- LayerColor *layer = LayerColor::create(Color4B(0, 0, 0, 200), size.width, size.height);
- Sprite *sp = Sprite::create("fail_bg.png");
- sp->setPosition(Point(size.width*0.5, size.height*0.5));
- layer->addChild(sp);
- }else{
- //主角无敌时的闪的效果
- isStrong = true;
- strongCount = 0;
- strongTime = 1*30;
- this->schedule(schedule_selector(SWGamePlayer::strongIng));
- }
- }
- //无敌时间处理函数
- void SWGamePlayer::strongIng(float soso){
- strongCount++;
- if(strongCount%strongTime == 0){
- this->setVisible(true);
- this->unschedule(schedule_selector(SWGamePlayer::strongIng));
- }else{
- //主角无敌时的闪的效果
- if(strongCount%3 == 0){
- this->setVisible(false);
- }else{
- this->setVisible(true);
- }
- }
- }
- void SWGamePlayer::callbackForDown(){
- //当开始让主角飞行时切换动画到行走模式
- Sprite *run = (Sprite *)this->getChildByTag(tag_player_run);
- run->setOpacity(255);
- Sprite *fly = (Sprite *)this->getChildByTag(tag_player_fly);
- fly->setOpacity(0);
- }
然后在游戏世界里面加入对主角的配置
当然对游戏的世界类也需要做小小的修改
SWGameWorld.h
- //
- // SWGameWorld.h
- // Holdtail
- //
- // Created by 帅 印 on 13-12-02.
- //
- //
- #ifndef __Holdtail__SWGameWorld__
- #define __Holdtail__SWGameWorld__
- #include <iostream>
- #include "cocos2d.h"
- #include "cocos-ext.h"
- USING_NS_CC;
- USING_NS_CC_EXT;
- //定义属性
- typedef enum {
- tag_player
- }tagWorld;
- class SWGameWorld:public cocos2d::Layer{
- public:
- static cocos2d::Scene *scene();
- static SWGameWorld *sharedWorld();
- void onTouchesBegan(const std::vector<Touch*>& touches, Event *event);
- void onTouchesMoved(const std::vector<Touch*>& touches, Event *event);
- void onTouchesEnded(const std::vector<Touch*>& touches, Event *event);
- private:
- virtual bool init();
- CREATE_FUNC(SWGameWorld);
- };
- #endif /* defined(__Holdtail__SWGameWorld__) */
SWGameWorld.cpp
- //
- // SWGameWorld.cpp
- // Holdtail
- //
- // Created by 帅 印 on 13-12-02.
- //
- //
- #include "SWGameWorld.h"
- #include "cocos2d.h"
- #include "SimpleAudioEngine.h"
- #include "SWGameMap.h"
- #include "SWGamePlayer.h"
- using namespace cocos2d;
- using namespace CocosDenshion;
- //声明静态变量
- static SWGameWorld *SWGW;
- SWGameWorld *SWGameWorld::sharedWorld(){
- if(SWGW != NULL){
- return SWGW;
- }
- return NULL;
- }
- Scene *SWGameWorld::scene(){
- Scene *scene = Scene::create();
- SWGameWorld *layer = SWGameWorld::create();
- scene->addChild(layer);
- return scene;
- }
- //创建场景
- bool SWGameWorld::init(){
- if( !Layer::init()){
- return false;
- }
- SWGW = this;
- //地图
- SWGameMap *map = SWGameMap::createMap("cloudbg.png","cloud04.png","cloud03.png","cloud02.png","cloud01.png","treesbg.png");
- addChild(map);
- //创建主角
- SWGamePlayer *player = SWGamePlayer::createPlayer("zhujuerun.png", 8, 0.05f);
- addChild(player,10,tag_player);
- setTouchEnabled(true);
- //设置为单点响应
- setTouchMode(Touch::DispatchMode::ALL_AT_ONCE);
- auto myListener = EventListenerTouchAllAtOnce::create();
- myListener->onTouchesBegan = CC_CALLBACK_2(SWGameWorld::onTouchesBegan, this);
- myListener->onTouchesMoved = CC_CALLBACK_2(SWGameWorld::onTouchesMoved, this);
- myListener->onTouchesEnded = CC_CALLBACK_2(SWGameWorld::onTouchesEnded, this);
- return true;
- }
- void SWGameWorld::onTouchesBegan(const std::vector<Touch*>& touches, Event *event){
- for (int i = 0; i<touches.size(); i++) {
- if (0 == i) {
- SWGameMap::updateLayerHeight(0);
- }
- }
- }
- void SWGameWorld::onTouchesMoved(const std::vector<Touch*>& touches, Event *event){
- }
- void SWGameWorld::onTouchesEnded(const std::vector<Touch*>& touches, Event *event){
- for (int i = 0; i<touches.size(); i++) {
- if (0 == i) {
- SWGameMap::updateLayerHeight(1);
- }
- }
- }
好了这下,主角就可以上下移动了,原理就是控制背景的移动,从而达到主角的移动效果
今天的这个阶段的项目打包下载-->飞机直达
[置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动的更多相关文章
- [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面
cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...
- [置顶] 很荣幸被选为2013年度 CSDN博客之星评选,如果觉得我的文章可以,请投我一票!
亲爱的小伙伴们,很荣幸我被选为<2013年度CSDN博客之星候选人>,希望大家多多支持,geekguy会继续努力,为大家奉献更好的文章. 投票地址:http://vote.blog.csd ...
- 一步步开发自己的博客 .NET版(1、基本显示)
前言 我们每个猿都有一个搭建自己独立博客的梦,我也不例外.以前想 现在想 以后也想.之所以一直迟迟没有着手,是因为难以跨出第一步.每次心里想着,等我以后技术好了再说,然后就没有然后了.以前用过word ...
- 一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做个插件,任何网站上的技术 ...
- 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- 一步步开发自己的博客 .NET版 剧终篇(6、响应式布局 和 自定义样式)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- 基于.NET Core开发的个人博客发布至CentOS小计
早些时候,使用 .NET Framework 开发网站,只能部署在 Windows 服务器上面,近两年 .NET Core 如火如荼,乘此机会赶紧上车,最近将自己利用 .NET Core 开发的个人博 ...
- Node.js 从零开发 web server博客项目[express重构博客项目]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- Node.js 从零开发 web server博客项目[数据存储]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
随机推荐
- Struts2 学习笔记16 struts标签 part2
接下来说一下if标签.下面是结果图. <li><s:if test="#parameters.age[0]<0">error!</s:if> ...
- Redis性能调优:保存SNAPSHOT对性能的影响
前一段时间.开发环境反馈,Redisserver訪问很慢,每一个请求要数秒时间,重新启动之后2~3天又会这样. 我查看了一下Linux的性能,没有什么问题. 通过 # redis-cli --late ...
- Python学习-使用matplotlib画动态多图
最近常常使用matplotlib进行数学函数图的绘制,可是怎样使用matplotlib绘制动态图,以及绘制动态多图.直到今天才学会. 1.參考文字 首先感谢几篇文字的作者.帮我学会了怎样绘制.大家也能 ...
- arm: 使用结构体操作寄存器
使用结构体操作寄存器: //寄存器赋值和取值的时候,要注意寄存器的长度,有的寄存器的值只有8位. //还要注意,使用volatile修饰寄存器变量.volatile 参考http://www.cnbl ...
- SDK Hello world(直接使用SDK封装)
前言 将代码拆分了一下, 如果处理更多的消息也不怕看的眼花 SDK编程就是对各种Windows消息的处理 实验工程 /// @file exam_1.cpp /// @brief 查阅本地MSDN, ...
- JVM调优总结(六)-分代垃圾回收详述2
分代垃圾回收流程示意 选择合适的垃圾收集算法 串行收集器 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器.当然,此收集器 ...
- c语言,结构体里面的函数
以linux-3.2内核代码为例,结构体里面的函数的用法: 例,在某驱动文件中,定义了一个平台设备驱动: static struct platform_driver s3c24xx_led_drive ...
- POJ 1042 Gone Fishing (贪心)(刘汝佳黑书)
Gone Fishing Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 30281 Accepted: 9124 Des ...
- Apache Thrift的简单使用
Apache Thrift的简单使用 ---------------------- 1. 简介 Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架.它有一个代码生成器来对它所 ...
- Java ArrayList add(int index, E element) example
Simple add() method is used for adding an element at the end of the list however there is another va ...