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

用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;也意…

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

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

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

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

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

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

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

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

【每日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年以来由于…

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

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

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

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

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 9丨有趣的电影【难度简单】

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

一文看懂机器人技术的发展史

来源&#xff1a;传感器技术机器人技术是综合了计算机、控制论、机构学、信息和传感技术、人工智能、仿生学等多学科而形成的高新技术&#xff0c;是当代研究十分活跃&#xff0c;应用日益广泛的领域。机器人应用情况&#xff0c;是一个国家工业自动化水平的重要标志。机器人并…

python实现简单爬虫抓取图片

最近在学习python,正如大家所知&#xff0c;python在网络爬虫方面有着广泛的应用&#xff0c;下面是一个利用python程序抓取网络图片的简单程序&#xff0c;可以批量下载一个网站更新的图片&#xff0c;其中使用了代理IP的技术。 import urllib.request import os import rand…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 10丨换座位【难度中等】

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

5G之后是什么?

来源&#xff1a;IEEE电气电子工程师学会如果你听过有关5G的承诺它可为自动驾驶汽车和沉浸式虚拟现实保驾护航的宣传&#xff0c;估计你很快就会意识到下一代无线网络将需要承载多少数据。但是&#xff0c;工程师们是不是太专注于提供满足数据饥渴型应用程序需要的低延迟网络&a…

javaweb实现验证码功能

在javaweb的用户注册与登陆功能时&#xff0c;有时为了防止漏洞或者大量注册&#xff0c;可以使用验证码功能&#xff0c;下面是验证码的一个简单实现 验证码类 public class ValiImg extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletRespon…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 10丨买下所有产品的客户【难度中等】

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

数据洪流时代的芯片之变

芯片无所不在&#xff0c;没有芯片&#xff0c;就没有现代生活。 图片来源&#xff1a;百度图片来源&#xff1a;科学网摘要&#xff1a;自中兴事件发生以来&#xff0c;对于我国半导体及芯片产业一直存在两种截然相反的认识。自中兴事件发生以来&#xff0c;对于我国半导体及芯…