实现超级玛丽上下左右运动

用Cocos2dx实现超级玛丽,首先用帧循环定时器判断方向,再在类中实现运行以及判断是否能运动。

方向控制

void LayerGame::moveMario(float dt)
{
#ifdef WIN32short key;key = GetKeyState('F');if (key < 0) _marioDir = Common::RIGHT;key = GetKeyState('D');if (key < 0) _marioDir = Common::LEFT;key = GetKeyState('J');if (key < 0)_mario->jump();#endifif (_marioDir==Common::LEFT){//CCLog("left\n");_marioDir=Common::NONE;_mario->moveLeft(dt);}else if(_marioDir==Common::RIGHT){//CCLog("right\n");_marioDir=Common::NONE;_mario->moveRight(dt);}else{//CCLog("stop\n");_menuShow->setTexture(_textureDirNone);_mario->stop();}_mario->moveUp(dt);_mario->moveDown(dt);
}

判断是否能向上,向左,向右,向下运动,利用碰撞检测

bool Mario::canMoveLeft(float dt)
{//judge if mario is out of the mapCCRect rcMario=this->boundingBox();CCPoint ptMario=ccp(rcMario.getMinX(),rcMario.getMinY());CCTMXTiledMap *map=getMap();CCPoint ptMarioInWorld=map->convertToWorldSpace(ptMario);if (ptMarioInWorld.x-dt*_speed<0)   {return false;}//judge if partition by a wallCCPoint pt[3];pt[0] = ccp(rcMario.getMinX() - dt*_speed, rcMario.getMidY());pt[1] = ccp(rcMario.getMinX() - dt*_speed, rcMario.getMinY());pt[2] = ccp(rcMario.getMinX() - dt*_speed, rcMario.getMaxY());//transform position,change pt into tile and get gid to decide whether be stoped by wallfor(int i=0;i<3;i++){if (pt[i].y >= map->getContentSize().height)continue;CCPoint ptTile=Common::Point2Tile(map,pt[i]);//wall water pipe and floorstatic const char* layerName[3] = { "block", "pipe", "land" };for(int j=0;j<3;j++){CCTMXLayer *layer=map->layerNamed(layerName[j]);int gid=layer->tileGIDAt(ptTile);if (gid!=0){return false;}}}return true;
}
bool Mario::canMoveRight(float dt)
{CCRect rcMario = boundingBox();CCTMXTiledMap* map = getMap();CCPoint pt[3];pt[0] = ccp(rcMario.getMaxX() + dt*_speed, rcMario.getMidY());pt[1] = ccp(rcMario.getMaxX() + dt*_speed, rcMario.getMinY());pt[2] = ccp(rcMario.getMaxX() + dt*_speed, rcMario.getMaxY());// 坐标转换,将pt转化成地图格子坐标,然后获取gid,判断gid是不是被阻挡for (int i = 0; i < 3; ++i){if (pt[i].y >= map->getContentSize().height)continue;CCPoint ptTile = Common::Point2Tile(map, pt[i]);// 水管、砖头,地板static const char* layerName[3] = { "block", "pipe", "land" };for (int j = 0; j < 3; ++j){CCTMXLayer* layer = map->layerNamed(layerName[j]);int gid = layer->tileGIDAt(ptTile);if (gid != 0){return false;}}}return true;
}
bool Mario::canMoveDown(float dt)
{CCRect rcMario = boundingBox();CCTMXTiledMap* map = getMap();CCPoint pt[3];//dt*_speedDownpt[0] = ccp(rcMario.getMidX(), rcMario.getMinY() - dt*_speedDown);pt[1] = ccp(rcMario.getMinX(), rcMario.getMinY() - dt*_speedDown);pt[2] = ccp(rcMario.getMaxX(), rcMario.getMinY() - dt*_speedDown);if (pt[0].y >= map->getContentSize().height)return true;// 坐标转换,将pt转化成地图格子坐标,然后获取gid,判断gid是不是被阻挡for (int i = 0; i < 3; ++i){CCPoint ptTile = Common::Point2Tile(map, pt[i]);// 水管、砖头,地板static const char* layerName[3] = { "block", "pipe", "land" };for (int j = 0; j < 3; ++j){CCTMXLayer* layer = map->layerNamed(layerName[j]);int gid = layer->tileGIDAt(ptTile);if (gid != 0){// 微调CCPoint ptLB = Common::Tile2PointLB(map, ptTile+ccp(0, -1));this->setPositionY(ptLB.y);return false;}}}return true;
}
bool Mario::canMoveUp(float dt)
{CCRect rcMario = boundingBox();CCTMXTiledMap* map = getMap();CCPoint pt[3];pt[0] = ccp(rcMario.getMidX(), rcMario.getMaxY() + dt*_speedUp);pt[1] = ccp(rcMario.getMinX(), rcMario.getMaxY() + dt*_speedUp);pt[2] = ccp(rcMario.getMaxX(), rcMario.getMaxY() + dt*_speedUp);if (pt[0].y >= map->getContentSize().height)return true;// 坐标转换,将pt转化成地图格子坐标,然后获取gid,判断gid是不是被阻挡for (int i = 0; i < 3; ++i){CCPoint ptTile = Common::Point2Tile(map, pt[i]);// 水管、砖头,地板static const char* layerName[3] = { "block", "pipe", "land" };for (int j = 0; j < 3; ++j){CCTMXLayer* layer = map->layerNamed(layerName[j]);int gid = layer->tileGIDAt(ptTile);if (gid != 0){// 微调CCPoint ptLB = Common::Tile2PointLB(map, ptTile);this->setPositionY(ptLB.y);return false;}}}return true;
}

运行实现

void Mario::moveLeft(float dt)
{if (_dirRun!=Common::LEFT){_dirRun=Common::LEFT;_dirFace=Common::LEFT;updateStatus();}if (!canMoveLeft(dt))return;Common::moveNode(this,ccp(-dt*_speed,0));//scroll mapCCNode *map=this->getParent();CCPoint ptWorld=map->convertToWorldSpace(this->getPosition());if (ptWorld.x<winSize.width/2&&map->getPositionX()<0){Common::moveNode(map,ccp(dt*_speed,0));}
}void Mario::moveRight(float dt)
{if (_dirRun!=Common::RIGHT){_dirRun=Common::RIGHT;_dirFace=Common::RIGHT;updateStatus();}if (!canMoveRight(dt))return;Common::moveNode(this,ccp(dt*_speed,0));//scroll mapCCNode *map=this->getParent();CCPoint ptWorld=map->convertToWorldSpace(this->getPosition());if (ptWorld.x>winSize.width/2){Common::moveNode(map,ccp(-dt*_speed,0));}
}void Mario::moveUp(float dt)
{if (_speedUp<=0){return;}if (!canMoveUp(dt)){// 反弹效果_speedDown = _speedUp;_speedUp = 0; // 不继续上升了return;}Common::moveNode(this,ccp(0,dt*_speedUp));_speedUp-=_speedAcc;//_speedDown=_speedUp;
}
void Mario::moveDown(float dt)
{if(_speedUp<=0){if (canMoveDown(dt)){if (_bFly==false){_bFly=true;updateStatus();}Common::moveNode(this,ccp(0,-dt*_speedDown));_speedDown+=_speedAcc;}else{if (_bFly){_bFly = false;_speedDown = _speedAcc;updateStatus();}}}}void Mario::stop()
{if (_dirRun!=Common::NONE){_dirRun=Common::NONE;updateStatus();}
}
void Mario::jump()
{static int i=0;CCLog("speed%d=%d",++i,_speedUp);if (_bFly)return;_speedUp=300;_bFly=true;updateStatus();
}

运行状态机,控制运行时的动画

void Mario::updateStatus()
{stopAllActions();if (_bFly){if (_dirFace==Common::LEFT){setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("SmallJumpLeft"));}else if(_dirFace==Common::RIGHT){setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("SmallJumpRight"));}return;}if (_dirRun==Common::LEFT){this->runAction(CCRepeatForever::create(CCAnimate::create(CCAnimationCache::sharedAnimationCache()->animationByName("SmallWalkLeft"))));}else if (_dirRun==Common::RIGHT){this->runAction(CCRepeatForever::create(CCAnimate::create(CCAnimationCache::sharedAnimationCache()->animationByName("SmallWalkRight"))));}else{if (_dirFace==Common::LEFT){this->setDisplayFrameWithAnimationName("SmallWalkLeft",0);}else if(_dirFace==Common::RIGHT){this->setDisplayFrameWithAnimationName("SmallWalkRight",0);}}
}

注:在实现这个功能的时候,由于把等于写成赋值,发生了许多灵异的错误,要小心啊,等于与赋值。

运行结果

结果

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

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

相关文章

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨大的国家【难度简单】

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

自动驾驶前沿报告!解密六大关键技术,全球人才分布

来源&#xff1a;智东西摘要&#xff1a;清华-中国工程院知识智能联合研究中心从技术、人才、应用和趋势的维度盘点自动驾驶的发展。从传统车企到新造车势力&#xff0c;再到互联网大佬&#xff0c;都在加注自动驾驶。自动驾驶既指向了更高效安全的交通运营系统&#xff0c;也意…

利用工厂模式实现怪物系统

利用工厂模式可以有效的降低类与类的藕合性&#xff0c;增强代码的可重用性&#xff0c;工厂模式主要通过虚函数的原理进行。 当基类指针指向一个子类对象&#xff0c;通过这个指针调用子类和基类同名成员函数的时候&#xff0c;基类声明为虚函数「子类不写也可以」就会调子类…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨好友申请 I :总体通过率【难度简单】

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

边缘计算技术发展与对策研究

来源&#xff1a;5G作者&#xff1a;洪学海&#xff0c;中国科学院计算技术研究所&#xff0c;中国科学院计算机网络信息中心&#xff0c;研究员&#xff1b;汪洋&#xff0c;中国科学院计算机网络信息中心。未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&a…

Android初探:LINUX(Ubuntu)下安装开发环境

第一步&#xff1a; 安装Ubuntu, 我现在装的是12.04LTS&#xff0c;12.04LTS 将得到长达5年的更新支持&#xff0c;而新出来的12.10则只有两年的更新支持&#xff0c;并且Google Android开发/源码网站上也将12.04作为支持系统之一&#xff0c;所以不推荐12.10安装完ubuntu系统后…

windows下同时安装python2与python3

由于python2与python3并不相互兼容&#xff0c;并且差别较大&#xff0c;所以有时需要同时安装&#xff0c;但在操作命令行时&#xff0c;怎么区别python2与python3呢&#xff1f; 1.下载并安装Python 2.7.9和Python 3.4.1。 2.找到Python 2.7.9的安装目录C:\Python27&#x…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨字节面试真题【难度困难】

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

发布 | 2018年中美智慧城市行业研究系列报告

来源&#xff1a;桥域咨询报告链接:https://pan.baidu.com/s/1fGrtzH0nLsldDvpE04DY6A 密码:q9q2未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体…

oracle收发邮件存储过程

oracle收发邮件存储过程 2012-04-13 13:33:32| 分类&#xff1a; .NET | 标签&#xff1a; |字号大中小 订阅 CREATE OR REPLACE PROCEDURE PROC_SEND_EMAIL(P_TXT VARCHAR2, P_SUB VARCHAR2, …

commons-fileupload实现文件上传下载

commons-fileupload是Apache提供的一个实现文件上传下载的简单&#xff0c;有效途径,需要commons-io包的支持&#xff0c;本文是一个简单的示例 上传页面,注意设置响应头 <body><center><h1>文件上传页面</h1><hr><form action"${page…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 8丨判断三角形【难度简单】

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

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 8丨平面上的最近距离【难度中等】

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

python实现统计你一共写了多少行代码

程序员要保证一定的代码量就必须勤奋的敲代码&#xff0c;但怎么知道自己一共写了多少代码呢&#xff0c;笔者用python写了个简单的脚本&#xff0c;遍历所有的.java,.cpp,.c文件的行数&#xff0c;但是正如大家所知&#xff0c;java生成了许多代码&#xff0c;所以有许多水分&…

工业机器人:四大家族垄断全球市场

来源&#xff1a;广发证券在世界工业机器人业界中&#xff0c;以瑞士的ABB、德国的库卡、日本的发那科和安川电机最为著名&#xff0c;并称工业机器人四大家族。全球机器人市场中&#xff0c;四大家族一直占据着重要位置&#xff0c;总市场份额一度超过50%以上。2015年以来由于…

Lucene正则表达式查询RegenxQuery

1 /*2 * 正则表达式查询3 */4 5 6 import java.io.IOException;7 8 import org.apache.lucene.analysis.standard.StandardAnalyzer;9 import org.apache.lucene.document.Document; 10 import org.apache.lucene.document.Field; 11 import org.apache.lucene.index.IndexWr…

pyinstaller--将py文件转化成exe

首先要注意一下:打包python文件成exe格式这个过程只能在windows环境下运行 1. 直接在命令行用pip安装 pyinstaller pip install pyinstaller</p> 2. 下载安装pyinstaler运行时所需要的windows拓展—pywin32 pywin32:http://sourceforge.net/projects/pywin32/files/p…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 9丨平均工资:部门与公司比较【难度困难】

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

深度|全面了解一下这个世界上最奇葩的公司:Google!

来源&#xff1a;轮回的刻度2015年8月11日&#xff0c;Google公司架构调整的资讯与分析刷遍了朋友圈。这些数不胜数的文章&#xff0c;几乎都是这样这样一种基调&#xff1a;Google好像做了一件很重大的事情&#xff0c;但是谁也不清楚它为什么这么做。这个问题也困扰着我&…

【原创】关于移动铁通某些网站打不开的问题

上下文&#xff1a;同学家移动铁通宽带&#xff0c;想要访问 www.xads.gov.cn (西安地税官网&#xff0c;做的我就不评价了) 有时网站能打开&#xff0c;有时却打不开 解决过程&#xff1a;想起自己家用的也是移动铁通&#xff0c;也是某些网站能有时能打开有时打不开。还是采用…