坦克大战实现

先将常用的函数与头文件,宏定义等写到一个公共类中

        #ifndef __Common_H__#define __Common_H__#include "cocos2d.h"#include "SimpleAudioEngine.h"#include "cocos-ext.h"USING_NS_CC;USING_NS_CC_EXT;#define winSize CCDirector::sharedDirector()->getWinSize()#define  TANK_SPEED 2#define BULLET_SPEED 4#define TANK_CREATE_INTERVAL 3#define TANK_SHOOT_INTERVAL 1#define TIME_OVER 300#define TANK_BOMB "TANK_BOMB"class Common{public:enum DIRECTION{UP,RIGHT,DOWN,LEFT,INVALID_DIR};enum TileType{NONE,BLOCK,STEEL,HOME};enum {ZO_LAYER_0=100,ZO_BULLET,ZO_TANK,ZO_LAYER_1,ZO_ITEM,ZO_LAYER_SETUP};static TileType getTileType(int gid){if (gid==5||gid==6||gid==11||gid==12){return STEEL;}if (gid==13||gid==14||gid==19||gid==20){return BLOCK;}if (gid==17||gid==18||gid==23||gid==24){return HOME;}return NONE;}static CCScene* scene(CCLayer *layer){CCScene *s=CCScene::create();s->addChild(layer);return s;}static const char* format(int v,const char *prefix="",const char *suffix=""){static char buf[1024];sprintf(buf,"%s%d%s",prefix,v,suffix);return buf;}static void moveNodeX(CCNode *n,int dx){n->setPositionX(n->getPositionX()+dx);}static void moveNodeY(CCNode *n,int dy){n->setPositionY(n->getPositionY()+dy);}static void moveNode(CCNode*n,CCPoint pt){moveNodeX(n,pt.x);moveNodeY(n,pt.y);}static const CCPoint Map2PointLB(CCTMXTiledMap *_map,CCPoint ptTile){ptTile.y=_map->getMapSize().height-1-ptTile.y;return ccp(ptTile.x*_map->getTileSize().width,ptTile.y*_map->getTileSize().height);}static CCPoint Point2Tile(CCTMXTiledMap *_map,CCPoint ptMap){int dx=_map->getTileSize().width;int dy=_map->getTileSize().height;//CCPoint ptMap=_map->convertToNodeSpace(ptGL);int x=ptMap.x/dx;int y=ptMap.y/dy;y=_map->getMapSize().height-1-y;return ccp(x,y);}};#endif

开始界面与选择界面非常简单,可以略过,游戏主界面包含的方法如下

    #ifndef __LayerGame_H__#define __LayerGame_H__#include "Common.h"#include "TankFriend.h"#include "MenuCtrl.h"#include "AI.h"#include "LayerSetup.h"class Item;class LayerGame:public CCLayer{public://CREATE_FUNC(LayerGame);void onExit();static LayerGame*create(unsigned int index){LayerGame *pRt=new LayerGame();if (pRt&&pRt->init(index)){pRt->autorelease();return pRt;}else{delete pRt;pRt=NULL;return pRt;}}bool init(unsigned int index);void update(float);CCTMXTiledMap *_map;TankFriend *_tankFriend;void DirCtrlPress(CCObject*);void Shoot(CCObject*);void Setup(CCObject*);void TimeOut(float);void setGodMode(int interval){_godMode=true;CCDelayTime*delay=CCDelayTime::create(interval);CCCallFunc *callFunc=CCCallFunc::create(this,callfunc_selector(LayerGame::unSetGodMode));this->runAction(CCSequence::createWithTwoActions(delay,callFunc));}void unSetGodMode(){_godMode=false;}void addItem();void eatItem(Item*);void eatItemBomb();void eatItemSteel();void setPause(){CCDirector::sharedDirector()->pause();}enum FAILURE_REASON{TIME_OUT,HOME_DESTORY,TANK_DIE};static void gameOver(FAILURE_REASON reason);CCArray *_bullets;CCArray *_items;AI *_ai;int _victoryCount;int _curCount;int _index;int _life;bool _godMode;};#endif

添加友军坦克

    class TankFriend:public CCSprite{public:CREATE_FUNC(TankFriend);bool init();CCTMXTiledMap *getMap();void setTileSize(int tileSize);int _tileSize;void Move(Common::DIRECTION dir);void doMove();void Turn(Common::DIRECTION dir);bool canMove(Common::DIRECTION dir);Bullet *Shoot();Common::DIRECTION _dir;int _damage;};

添加控制按钮,控制坦克的前进,后退与发射

其中前进,后退是按着一直走,发射子弹是按一下,发射一下

    bool MenuCtrl::init(){CCMenu::init();schedule(schedule_selector(MenuCtrl::CheckActive));return true;}void MenuCtrl::CheckActive(float){if (this->m_pSelectedItem&&m_eState==kCCMenuStateTrackingTouch){m_pSelectedItem->activate();}}

以上重写了menu方法,使得可以按着按钮一直运动

添加子弹层

    class Bullet:public CCSprite{public:CREATE_FUNC(Bullet);bool init();void setPicture(const char *filename);static void CheckBullets(CCTMXTiledMap *_map,CCArray *_bullets);int _damage;};

敌军坦克由电脑随机生成

敌军坦克类继承友军坦克

bool TankEnemy::init()
{CCSprite::initWithFile("tank/armor/armor2U.png");_tileSize=0;_dir=Common::UP;this->setZOrder(Common::ZO_TANK);Turn(Common::DOWN);return true;
}

随机产生敌军坦克方法

    #ifndef __AI_H__#define __AI_H__#include "Common.h"class AI:public CCNode{public:CREATE_FUNC(AI);bool init();void onExit();CCTMXTiledMap *getMap(){return (CCTMXTiledMap*)getParent();}//generate enemy tankvoid createTank(float);bool _createFlag;CCArray *_tanks;CCArray *_bullets;//move enemy tankvoid moveTank(float);//make enemy tank shoot bulletvoid Shoot(float);//collision detectionvoid update(float);bool _pause;void pause();void resume();};#endif

添加 多种道具,当打死一坦克时就会有一定概率产生一个道具

    class Item:public CCSprite{public:enum ItemType{IT_ACTIVE, IT_BOMB, IT_MINTANK, IT_STAR, IT_STEEL, IT_TIMER, IT_COUNT};CREATE_FUNC(Item);bool init();void setPosition();ItemType _type;};

添加控制按钮,产生模态对话框,控制音量与音效

    #ifndef __LayerSetup_H__#define __LayerSetup_H__#include "Common.h"
    class MyCCControlSlider : public CCControlSlider{public:static MyCCControlSlider* create(const char* bgFile, const char* progressFile, const char* thumbFile){// Prepare background for sliderCCSprite *backgroundSprite = CCSprite::create(bgFile);// Prepare progress for sliderCCSprite *progressSprite = CCSprite::create(progressFile);// Prepare thumb (menuItem) for sliderCCSprite *thumbSprite = CCSprite::create(thumbFile);MyCCControlSlider *pRet = new MyCCControlSlider();pRet->initWithSprites(backgroundSprite, progressSprite, thumbSprite);pRet->autorelease();return pRet;}bool ccTouchBegan(CCTouch*t, CCEvent*e){return CCControlSlider::ccTouchBegan(t, e);}void ccTouchEnded(CCTouch*t, CCEvent*e){CCControlSlider::ccTouchEnded(t, e);}void ccTouchMoved(CCTouch*t, CCEvent*e){CCControlSlider::ccTouchMoved(t, e);}void ccTouchCancelled(CCTouch*t, CCEvent*e){CCControlSlider::ccTouchCancelled(t, e);}};class LayerSetup:public CCLayer{public:CREATE_FUNC(LayerSetup);bool init();void ChangeBGVolume(CCObject*, CCControlEvent);void ChangeEffectVolume(CCObject*, CCControlEvent);void Close(CCObject*);bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);CCMenu *_menu;bool _bMenuItemClicked;MyCCControlSlider* _volumeBG;bool _bVolumeBGClicked;MyCCControlSlider* _volumeEffect;bool _bVolumeEffectClicked;};#endif // !--

由于CCControlSlider中有些成员变量是保护的,需要将CCControlSlider重写,才可以进行。

注意:当在实现暂停道具的时候,由于要暂停与重启,重启时报错

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention

原先用//scheduleOnce(schedule_selector(AI::resume), 1);来调用resume函数,老是报错,帧循环发生错误,后来改成
CCDelayTime* delay=CCDelayTime::create(5.0f);
CCCallFunc* callFunc = CCCallFunc::create(this, callfunc_selector(AI::resume));
this->runAction(CCSequence::create(delay,callFunc,NULL));

就成功了,原因暂且不明。

运行结果

坦克大战

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

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

相关文章

汽车传感器:自动驾驶“第一步”,新兴领域中国有望突围

来源:(中金公司:黄乐平 )摘要:从L3级量产车奥迪A8,到L4级量产巴士百度阿波龙,L3级自动驾驶已逐渐开始落地量产。位处产业链上游的汽车传感器行业最先感受到春意,各种技术路线争鸣&am…

怎么改变asp.net中.sln文件的默认生成路径

转自:http://zhidao.baidu.com/question/149657564.html 你新建解决方案就可以改 转载于:https://www.cnblogs.com/hellolong/articles/2801731.html

腾讯阿里是否开始走向没落,用新互联网大脑模型分析

前言:虽然腾讯面临头条、抖音、陌陌、钉钉等新兴社交平台挑战,阿里面临海尔COSMOPlat,三一重工树根互联、美国GE Predix、德国西门子Mindsphere等工业互联网平台的挑战,但其核心优势依然存在,积累势能继续提高&#xf…

这5个超级经典SQL都不会,回去等通知吧

🍅 简介:CSDN博客专家🏆、信息技术智库公号作者✌ 简历模板、PPT模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 一、每门课程问题 用一条 SQL 语句…

12.4scrum report

转载于:https://www.cnblogs.com/76er/archive/2012/12/04/2802336.html

从《2018年全球创新指数报告》看中国创新力!

作者:杨柯巍 张原编辑:煜 佳来源:中国电子信息产业发展研究院摘要:2018 年7 月10 日,世界知识产权组织(WIPO)、美国康奈尔大学和欧洲工商管理学院(INSEAD)共同发布《2018…

【每日SQL打卡】DAY 1丨部门工资最高的员工【难度中等】

活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升。 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远。 活动流程: 1…

如何从操作系统安装文件提取驱动文件/ How to extract driver files from setup files (win 7)...

在部署 OS 过程中遇到一个问题,需要找到操作系统对于的驱动文件。由于OS都是直接从微软服务器上面copy下来的,所以,要找到对应的 Device Drivers很困难。好不容易找到一个Drivers的文件夹,发现各种驱动啊,估计也只有当…

【每日SQL打卡】​​​​​​​​​​​DAY 2 丨组合两个表【难度简单】

活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升。 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远。 🍅题目汇总(…

业界 |「多巴胺」来袭!谷歌推出新型强化学习框架Dopamine

作者:Pablo Samuel Castro、Marc G. Bellemare 来源:Google AI Blog,机器之心摘要:在过去几年里,强化学习研究取得了多方面的显著进展。在过去几年里,强化学习研究取得了多方面的显著进展。这些进展使得智能体能够以超…

Android客户端与服务器之间传递json数据

在服务器与客户端之间通信,json数据是一种常用格式,本文主要在服务器端构建数据,在客户端接收显示,并且在listview上显示出来 服务器端的构建 简单的javabean与返回结果函数与插入函数略过 public void doGet(HttpServletReque…

高通全系列手机处理器深度解析 (升级选手机必备)附参数对比表

关于高通处理器和ARM之间的关系 正式介绍高通处理器之前,笔者认为还是先来大致了解下高通和ARM公司之间的关系。在之前的文章中我们也介绍过ARM公司以及相应的ARM架构,实际上,包括高通在内所有终端手机芯片厂商的手机处理器产品的底层都是基…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 2丨连续出现的数字【难度中等】

活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升。 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远。 🍅题目汇总(…

《2018中国大数据发展指数报告》发布:广东、上海、贵州、北京、重庆领先

来源:网络传播杂志摘要:2018年8月24日, 中国电子信息产业发展研究院在首届“中国国际智能产业博览会”上发布了《中国大数据发展指数报告(2018年)》。此报告为我国找准大数据行业发展重点、优化行业发展环境、调整行业管理体制机制等提供了有…

利用gitbash上传项目到github

GitHub主要是用作基于Git的分布式版本管理系统的库,可以保存和管理自己的代码,而且主要用作代码的合作开发。不过对于我来说,Git控制系统还比较难以掌握,或者开发小系统还不太用得着,因此我把GitHub当作分享和展示代码…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 3丨删除重复的电子邮箱【难度简单】

活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升。 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远。 🍅题目汇总(…

36氪研究 | 智慧零售行业研究报告

来源:36Kr智慧零售带来的变化,对你我的生活有多大的影响?上世纪末,当你想吃一桌大鱼大肉改善一下近期的伙食,下馆子是一个不错的选择,但由于这样会超出你的消费预期,买回家自己烹饪便成为了你唯…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 3丨行程和用户【难度困难】

活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升。 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远。 🍅题目汇总(…

数据结构之线性表

一、线性表的顺序存储实现,利用数组实现线性表 typedef struct{int Data[MAXSIZE];int Last; }List;List *MakeEmpty() {List *PtrL;PtrL(List*)malloc(sizeof(List));PtrL->Last-1;return PtrL; } int FindKth( int K, List* PtrL ) //根据位序K,返…

读写Excel2003文档

1.程序说明1.1编程语言:Java1.2 第三方库:Apache POIApache POI 官网:http://poi.apache.org/下载页面:http://poi.apache.org/download.html版本3.8下载地址:http://www.apache.org/dyn/closer.cgi/poi/release/bin/p…