从网上下了一点素材资源,外加自己ps一点资源,然后东拼西凑写了一个横版跑酷的小游戏

ps:csdn好不爽,无法传大点的gif,所以只好录了个短的gif,而且压缩之后凑合能看

预览

步骤

1 工程结构

开发环境
  • win8.1
  • vs2013
  • cocos2dx 3.2
代码目录

游戏组成结构

主要有以下几个场景

  • 预加载场景,用于loading等待
  • 主菜单场景
  • 游戏主场景(背景、移动地图、角色、拾取物)
  • 选项界面
  • 关于界面

2 预加载场景

主要是用于图片资源,音频资源的异步预加载,然后在回调里面跳转到主菜单场景,并且添加了进度条提示

void LoadingScene::loadingCallBack(Texture2D *texture)
{loadedNum++;//此处的预加载帧动画指示用于实验性质switch(loadedNum){case 1://预加载帧缓存纹理SpriteFrameCache::getInstance()->addSpriteFramesWithFile("boy.plist",texture);loadProgress->setPercentage((float)loadedNum/totalNum*100);break;case 2://预加载帧缓存纹理SpriteFrameCache::getInstance()->addSpriteFramesWithFile("girl.plist",texture);loadProgress->setPercentage((float)loadedNum/totalNum*100);break;default:break;}if(loadedNum==totalNum){//预加载帧动画auto boyAnimation=Animation::create();boyAnimation->setDelayPerUnit(0.1f);for(int i=1;i<=12;i++){char str[100]={0};sprintf(str,"boy%d.png",i);boyAnimation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(str));}AnimationCache::getInstance()->addAnimation(boyAnimation,"boyAnimation");//预加载帧动画auto girlAnimation=Animation::create();girlAnimation->setDelayPerUnit(0.2f);for(int i=1;i<=8;i++)girlAnimation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("girl"+std::to_string(i)+".png"));AnimationCache::getInstance()->addAnimation(girlAnimation,"girlAnimation");预加载音乐和音效SimpleAudioEngine::getInstance()->preloadBackgroundMusic("spring_music.wav");SimpleAudioEngine::getInstance()->preloadBackgroundMusic("winter_music.mp3");SimpleAudioEngine::getInstance()->preloadEffect("jump.wav");SimpleAudioEngine::getInstance()->preloadEffect("point.mp3");SimpleAudioEngine::getInstance()->preloadEffect("gameover.wav");//加载完毕跳转到游戏场景auto mainMenu=MainMenu::createScene();TransitionScene *transition=TransitionFade::create(1.0f,mainMenu);Director::getInstance()->replaceScene(transition);}}

3 主菜单场景

添加一个菜单和对应的回调函数,分别有开始游戏、选项、关于等菜单项

//添加菜单auto newGameItem=MenuItemImage::create("newgameA.png","newgameB.png",CC_CALLBACK_1(MainMenu::menuStartCallback,this));newGameItem->setPosition(Point(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2));auto optionItem=MenuItemImage::create("option_btn.png","option_btn.png",CC_CALLBACK_1(MainMenu::menuOptionCallback,this));optionItem->setPosition(Point(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2-60));auto aboutItem=MenuItemImage::create("aboutA.png","aboutB.png",CC_CALLBACK_1(MainMenu::menuAboutCallback,this));aboutItem->setPosition(Point(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2-120));auto menu=Menu::create(newGameItem,optionItem,aboutItem,NULL);menu->setPosition(Point::ZERO);this->addChild(menu,1);

4 游戏主场景

common头文件
这个头文件里面存储了一些定义的全局变量,比如关卡、男女角色选取等
//游戏关卡枚举
enum Level
{SPRING,WINTER
};//游戏角色枚举
enum PlayerType
{BOY,GIRL
};//游戏角色状态
enum PlayerState
{RUN,SLIDE,JUMP
};//地图元素枚举
enum BlockType
{LAND,  //砖块NPC,   //怪物STAR,  //星星TOOL,  //工具NONE   //空
};//场景间隔基本单位定为80,分辨率800*480,则排满是10*6个格子,便于作碰撞检测
const float BLOCK_SIZE=80.0f;
const float PICKUP_SIZE=40.0f;
const float PLAYER_RADIUS=50.0f;
const float GRAVITY=-1500.0f;
const float PLAYER_SPEED=700.0f;

为了便于计算,将屏幕设计分辨率定位800*480,一个砖块或怪物的大小是80*80,一个拾取物的大小是40*40,这样计算坐标时只需要左整数倍数的偏移就可以了。

游戏里面设置了两种关卡,分别对应了春天和冬天的地图,春天的怪物是绿水灵,冬天的怪物是蓝蘑菇,(玩过冒险岛的都知道),同时还可以选择男、女两种角色。
都是用全局变量进行控制。

游戏角色player类
class Player:public Node
{
public:virtual bool init() override;CREATE_FUNC(Player);
public:void run(); //主角奔跑void jump(); //主角跳跃void slide(); //主角滑行PlayerState playerState; //角色状态
private:Sprite *playerSprite; //奔跑的角色精灵Sprite *playerSpriteSlideJump; //滑行和起跳的角色精灵Animate *playerAnim;Texture2D *jumpTexture;Texture2D *slideTexture;};

游戏角色分男女,具有奔跑、跳跃、滑行三种状态

角色还有奔跑动画,同时还要为角色绑定刚体,需要受物理引擎作用
playerSprite=Sprite::create(playerTextureName); //此处必须初始化一张角色纹理,否则后面无法切换纹理jumpTexture=Sprite::create(playerJumpTexureName)->getTexture(); //创建跳跃纹理slideTexture=Sprite::create(playerSlideTextureName)->getTexture(); //创建滑行纹理playerAnim=Animate::create(playerAnimation);this->addChild(playerSprite);auto playerBody=PhysicsBody::createBox(playerSprite->getContentSize()); //这里要用包围盒,如果用圆形的话会导致滚动playerBody->setDynamic(true);playerBody->setContactTestBitmask(1);playerBody->setGravityEnable(true);playerBody->getShape(0)->setRestitution(0.0f); //设置刚体回弹力this->setPhysicsBody(playerBody);

游戏移动地图类
主要是地图中的砖块和怪物等元素的无限滚屏移动
首先,在初始化里面,手动设置初始地图,放置砖块、怪物、拾取物等等
//手动搭建地图,没有加入即时计算~//1层for(int i=0;i<10;i++){if(i!=3&&i!=4&&i!=7&&i!=8){//添加landauto block=Sprite::create(block_file);block->setPosition(BLOCK_SIZE/2+i*BLOCK_SIZE,BLOCK_SIZE/2+1*BLOCK_SIZE);this->addChild(block);block->setTag(LAND); //设置tagauto blockBody=PhysicsBody::createBox(block->getContentSize());blockBody->setDynamic(false);blockBody->setContactTestBitmask(1);blockBody->getShape(0)->setRestitution(0);block->setPhysicsBody(blockBody);}}//2层for(int i=0;i<10;i++){if(i==2||i==5||i==6){//添加怪物auto npc=Sprite::create(npc_file);npc->setTag(NPC);npc->setPosition(BLOCK_SIZE/2+i*BLOCK_SIZE,BLOCK_SIZE/2+2*BLOCK_SIZE);auto npcBody=PhysicsBody::createBox(npc->getContentSize());npcBody->setDynamic(false);npcBody->setContactTestBitmask(1);npcBody->getShape(0)->setRestitution(0);npc->setPhysicsBody(npcBody);this->addChild(npc);}if(i==3){//添加landauto block=Sprite::create(block_file);block->setPosition(BLOCK_SIZE/2+i*BLOCK_SIZE,BLOCK_SIZE/2+1*BLOCK_SIZE);this->addChild(block);block->setTag(LAND); //设置tagauto blockBody=PhysicsBody::createBox(block->getContentSize());blockBody->setDynamic(false);blockBody->setContactTestBitmask(1);blockBody->getShape(0)->setRestitution(0);block->setPhysicsBody(blockBody);}}//3层for(int i=0;i<10;i++){if(i!=0&&i!=3&&i!=4){//添加星星auto star1=Sprite::create(star_file);star1->setTag(STAR);star1->setPosition(PICKUP_SIZE/2+i*BLOCK_SIZE,BLOCK_SIZE/2+3*BLOCK_SIZE);auto starBody1=PhysicsBody::createBox(star1->getContentSize());starBody1->setDynamic(false);starBody1->setContactTestBitmask(1);starBody1->getShape(0)->setRestitution(0.0f);star1->setPhysicsBody(starBody1);this->addChild(star1);auto star2=Sprite::create(star_file);star2->setTag(STAR);star2->setPosition(PICKUP_SIZE/2*3+i*BLOCK_SIZE,BLOCK_SIZE/2+3*BLOCK_SIZE);auto starBody2=PhysicsBody::createBox(star2->getContentSize());starBody2->setDynamic(false);starBody2->setContactTestBitmask(1);starBody2->getShape(0)->setRestitution(0.0f);star2->setPhysicsBody(starBody2);this->addChild(star2);}}//4层for(int i=0;i<10;i++){if(i==3||i==4){//添加landauto block=Sprite::create(block_file);block->setPosition(BLOCK_SIZE/2+i*BLOCK_SIZE,BLOCK_SIZE/2+4*BLOCK_SIZE);this->addChild(block);block->setTag(LAND); //设置tagauto blockBody=PhysicsBody::createBox(block->getContentSize());blockBody->setDynamic(false);blockBody->setContactTestBitmask(1);blockBody->getShape(0)->setRestitution(0);block->setPhysicsBody(blockBody);}if(i==8){auto star1=Sprite::create(star_file);star1->setTag(STAR);star1->setPosition(PICKUP_SIZE/2+i*BLOCK_SIZE,BLOCK_SIZE/2+3*BLOCK_SIZE);auto starBody1=PhysicsBody::createBox(star1->getContentSize());starBody1->setDynamic(false);starBody1->setContactTestBitmask(1);starBody1->getShape(0)->setRestitution(0.0f);star1->setPhysicsBody(starBody1);this->addChild(star1);auto star2=Sprite::create(star_file);star2->setTag(STAR);star2->setPosition(PICKUP_SIZE/2*3+i*BLOCK_SIZE,BLOCK_SIZE/2+3*BLOCK_SIZE);auto starBody2=PhysicsBody::createBox(star2->getContentSize());starBody2->setDynamic(false);starBody2->setContactTestBitmask(1);starBody2->getShape(0)->setRestitution(0.0f);star2->setPhysicsBody(starBody2);this->addChild(star2);}if(i==6){//添加道具auto tool=Sprite::create(tool_file);tool->setTag(TOOL);tool->setPosition(PICKUP_SIZE/2+i*BLOCK_SIZE,BLOCK_SIZE/2+3*BLOCK_SIZE);auto toolBody=PhysicsBody::createBox(tool->getContentSize());toolBody->setDynamic(false);toolBody->setContactTestBitmask(1);toolBody->getShape(0)->setRestitution(0.0f);tool->setPhysicsBody(toolBody);this->addChild(tool);}}

每个物体都绑定了刚体,便于在物理世界做碰撞检测

然后需要启动无限滚屏
//启动调度器,地图滚屏this->schedule(schedule_selector(GameMap::mapUpdate),0.01f);

目前所采用的策略是党某个node消失在左侧是,重新设置其坐标到有边缘从右往左移动,不过,更好的方法是动态的随机生成地图结点,但是算法较复杂。

void GameMap::mapUpdate(float dt)
{for(auto &node:this->getChildren()){node->setPositionX(node->getPositionX()-3.0f);if(node->getPositionX()<=-node->getContentSize().width/2)node->setPositionX(node->getPositionX()+BLOCK_SIZE/2+10*BLOCK_SIZE);}}

游戏主场景类

这里有游戏最重要的逻辑代码。
一开始需要初始化物理引擎
auto *scene=Scene::createWithPhysics();scene->getPhysicsWorld()->setGravity(Vec2(0,GRAVITY));

添加背景滚屏,这是底层背景,移动速度比地图移动速度慢,这样有层次感,有景深感觉,让画面更加动感

backGround1=Sprite::create(backGroundFile);backGround1->setAnchorPoint(Point::ZERO);backGround1->setPosition(Point::ZERO);this->addChild(backGround1,0);backGround2=Sprite::create(backGroundFile);backGround2->setAnchorPoint(Point::ZERO);backGround2->setPosition(Point::ZERO);this->addChild(backGround2,0);
void GameScene::backGroundUpdate(float dt)
{backGround1->setPositionX(backGround1->getPositionX()-1.0f);backGround2->setPositionX(backGround1->getPositionX()+backGround1->getContentSize().width);if(backGround2->getPositionX()<=0.0f)backGround1->setPositionX(0.0f);
}

添加角色

//添加playerplayer=Player::create();player->setPosition(Point(visibleOrigin.x+2*BLOCK_SIZE,visibleOrigin.y+4*BLOCK_SIZE));this->addChild(player,1);

添加地图

//设置地图,默认锚点在左下角gameMap=GameMap::create();gameMap->setPosition(visibleOrigin.x,visibleOrigin.y);this->addChild(gameMap,1);

添加两个控制按钮

//添加滑行和跳跃按钮的事件score=0; //初始化分数slideBtn=Sprite::create("slideButton.png");auto slideBtnTexture1=Sprite::create("slideButton.png")->getTexture();auto slideBtnTexture2=Sprite::create("slideButtonPress.png")->getTexture();slideBtnTextures.pushBack(slideBtnTexture1);slideBtnTextures.pushBack(slideBtnTexture2);slideBtn->setScale(0.5);slideBtn->setPosition(Point(visibleOrigin.x+100,visibleOrigin.y+50));this->addChild(slideBtn,2);jumpBtn=Sprite::create("jumpButton.png");auto jumpBtnTexture1=Sprite::create("jumpButton.png")->getTexture();auto jumpBtnTexture2=Sprite::create("jumpButtonPress.png")->getTexture();jumpBtnTextures.pushBack(jumpBtnTexture1);jumpBtnTextures.pushBack(jumpBtnTexture2);jumpBtn->setScale(0.5);jumpBtn->setPosition(Point(visibleOrigin.x+visibleSize.width-100,visibleOrigin.y+50));this->addChild(jumpBtn,2);

触摸检测,用于控制按钮

滑行时动态更换纹理
跳跃时给角色一个向上的速度,暂停动画,更换纹理
要注意的是,一开始只能二段跳,接了道具之后可以三段跳
bool GameScene::onTouchBegan(Touch *touch,Event *event)
{auto touchPoint=touch->getLocation();//检测是否触摸在按钮区域if(slideBtn->getBoundingBox().containsPoint(touchPoint)){slideBtn->setTexture(slideBtnTextures.at(1));player->slide();}if(jumpTimes<jumpTotal&&jumpBtn->getBoundingBox().containsPoint(touchPoint)){if(isSound)SimpleAudioEngine::getInstance()->playEffect("jump.wav"); //播放跳跃音效jumpBtn->setTexture(jumpBtnTextures.at(1));player->jump();jumpTimes++;}return true;
}void GameScene::onTouchEnded(Touch *touch,Event *event)
{auto touchPoint=touch->getLocation();//判断是释放时是否在按钮区域if(slideBtn->getBoundingBox().containsPoint(touchPoint)){slideBtn->setTexture(slideBtnTextures.at(0));player->run();}if(jumpBtn->getBoundingBox().containsPoint(touchPoint)){jumpBtn->setTexture(jumpBtnTextures.at(0));}}

碰撞检测

bool GameScene::onContactBegin(const PhysicsContact &contact)
{jumpTimes=0; //落回地面就将已跳跃次数清零//获得被碰撞物体,getShapeA  getShapeB要尝试一下auto target=contact.getShapeA()->getBody()->getNode();if(target->getTag()==STAR){//碰到星星就涨分,星星消失gameMap->moveNode(target);addScore(100); //拾取星星得100}else if(target->getTag()==NPC&&target->getPositionY()+target->getContentSize().height/2<player->getPositionY()) //此处要用else if,只有当角色在怪物头上才能踩中{gameMap->moveNode(target);addScore(150); //踩怪得150}else if(target->getTag()==NPC&&target->getPositionY()+target->getContentSize().height/2>=player->getPositionY()) //如果角色正面遇到怪物就挂了gameOver();else if(target->getTag()==TOOL){jumpTotal=3;auto toolIcon=Sprite::create("accelerate_state.png");toolIcon->setPosition(Point(visibleOrigin.x+180,visibleOrigin.y+50));this->addChild(toolIcon,2);target->removeFromParent(); //道具只出现一次,从parent里面删除addScore(300); //道具300}//落回地面恢复跑步状态if(player->playerState==JUMP)player->run();return true;
}

碰撞检测的逻辑主要是

  • 判断碰撞的是砖块则继续奔跑
  • 判断碰撞的是怪物,并且是踩在投上,则消除怪物,得分
  • 判断碰撞的是拾取物,则消除拾取物,得分,如果是道具的话则获得三段跳的能力
  • 判断碰撞是正面遇到怪物,则游戏结束
游戏结束的逻辑
  • 正面遇到怪物
  • 落到屏幕底下
void GameScene::gameOver()
{//游戏结束停止所有的调度器gameMap->unscheduleAllSelectors();this->unscheduleAllSelectors();//播放游戏结束声音if(isSound)SimpleAudioEngine::getInstance()->playEffect("gameover.wav");//游戏结束出现菜单visibleSize=Director::getInstance()->getVisibleSize();visibleOrigin=Director::getInstance()->getVisibleOrigin();auto gameOverPanel=Node::create();auto overLabel=Sprite::create("gameover.png");overLabel->setPosition(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2+100);gameOverPanel->addChild(overLabel);auto backItem=MenuItemImage::create("back_to_menu.png","back_to_menu_press.png",[](Object *sender){//用lambda表达式作为菜单函数回调auto mainMenu=MainMenu::createScene();TransitionScene *transition=TransitionFade::create(1.0f,mainMenu);Director::getInstance()->replaceScene(transition);});auto backMenu=Menu::createWithItem(backItem);backMenu->setPosition(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2-50);gameOverPanel->addChild(backMenu);gameOverPanel->setPositionY(visibleOrigin.y+visibleSize.height);this->addChild(gameOverPanel,3);//滑入gameover logo,注意node的锚点在左下角gameOverPanel->runAction(MoveTo::create(0.5f,Vec2(visibleOrigin.x,visibleOrigin.y)));}

其他逻辑

都放到update这个函数里面进行
角色被阻挡后赶到原来的位置
//当角色被挡道之后跟上原来的位置float step=2.0f;if(player->getPositionX()<2*BLOCK_SIZE)player->setPositionX(player->getPositionX()+step);if(player->getPositionX()>2*BLOCK_SIZE)player->setPositionX(player->getPositionX()-step);

加分

void GameScene::addScore(float number)
{if(isSound)SimpleAudioEngine::getInstance()->playEffect("point.mp3"); //播放得分音效score+=number;scoreLabel->setString(String::createWithFormat("score: %d",score)->_string);
}

5 设置场景

设置游戏关卡、游戏角色和声音,这里懒得加xml配置文件存储。
//春天auto springItem=MenuItemImage::create("spring_icon.png","spring_icon_press.png",[](Object *sender){//修改关卡level=SPRING;textLevel->setString("level: Spring");});springItem->setPosition(visibleOrigin.x+visibleSize.width/4+35,visibleOrigin.y+visibleSize.height/4*3);//冬天auto winterItem=MenuItemImage::create("winter_icon.png","winter_icon_press.png",[](Object *sender){//修改关卡level=WINTER;textLevel->setString("level: Winter");});winterItem->setPosition(visibleOrigin.x+visibleSize.width/4*3-35,visibleOrigin.y+visibleSize.height/4*3);//男生auto boyItem=MenuItemImage::create("boy1.png","boy_jump.png",[](Object *sender){//修改角色playerType=BOY;textPlayer->setString("player: Boy");});boyItem->setPosition(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2-100);//女生auto girlItem=MenuItemImage::create("girl1.png","girl_jump.png",[](Object *sender){//修改角色playerType=GIRL;textPlayer->setString("player: Girl");});girlItem->setPosition(visibleOrigin.x+visibleSize.width/2+200,visibleOrigin.y+visibleSize.height/2-100);//声音开关auto soundItem=MenuItemImage::create("sound_on.png","sound_off.png",[](Object *sender){//修改声音isSound=!isSound;textSound->setString(isSound?"sound: On":"sound: Off");});soundItem->setPosition(visibleOrigin.x+soundItem->getContentSize().width/2,visibleOrigin.y+soundItem->getContentSize().height/2);auto menu=Menu::create(backItem,springItem,winterItem,boyItem,girlItem,soundItem,NULL);menu->setPosition(Point::ZERO);this->addChild(menu);

通过全局变量与其他场景交互

6 关于场景

//添加动态背景auto backGround=Sprite::create("about.jpg");backGround->setPosition(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2);auto repeatAnim=MoveBy::create(3.0f,Vec2(0,50));backGround->runAction(RepeatForever::create(Sequence::create(repeatAnim,repeatAnim->reverse(),NULL)));this->addChild(backGround,0);//添加关于告示auto aboutLabel=Sprite::create("aboutLabel.png");aboutLabel->setPosition(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2);this->addChild(aboutLabel,1);auto text=LabelBMFont::create("author:tashaxing\nE-mail:tashaxing@163.com\n\nWish you have fun!","bitmapFontChinese.fnt");text->setPosition(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2);this->addChild(text,2);

一些简介

效果图


整个demo也做了蛮久的,很多图片和图标,配色都是我自己ps的,算是策划、美术和程序一人承担了。
源码下载
csdn: 跑酷游戏
github: parkour

cocos2dx实例开发之2D横版跑酷相关推荐

  1. Unity 2D打造《盖伦快跑》横版跑酷ARPG

    是一个灵活且高性能的开发平台,用于制作富有创意的3D和2D智能互动游戏.以其"一次创作,多平台部署"的性能使开发者们能够将内容发布到所有最热门的平台. 随着3D游戏市场的高速发展, ...

  2. Unity学习笔记3 简易2D横版RPG游戏制作(三)

    这一篇本来应该是在上一篇后面直接补进去的.不过因为排版的问题.所以我就另开一篇来整理了,好了,废话不多说,马上整理: 十八.关卡的锁定与解锁 前面我们已经解决了在游戏开始时可以选择关卡的问题,接下来我 ...

  3. DirectX游戏开发之2D文字的实现

    DirectX游戏开发之2D文字的实现 文字是承载信息最有效的载体之一,各种游戏程序都离不开文字的显示.对于3D文字来说,2D文字有其渲染的高效性和实现的简洁性. 2D文字的显示无论在写2D游戏还是在 ...

  4. unity中实现经典的2d横版单向跳跃平台

    经常玩2d横版游戏的朋友们相信一定对这种单向跳跃平台很熟悉:我希望我的角色可以通过跳跃跳上平台,然后在平台之上按下键盘的下键后从平台上落下. 那么想要实现这样的效果具体要怎么做呢?我们还是先将想要实现 ...

  5. Android开发之2048安卓版

    之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...

  6. Unity 4 3 制作一个2D横版射击游戏 2

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在上一篇 ...

  7. 基于unity的2D横版游戏开发日志 小结

    前言 说是基于unity的2D横版游戏,实际上只是一个初学unity与C#新人的练手Demo,目前还处于半成状态.美术资源方面全部出自unity免费资源,经过自己的小修,大致拼出了一个游戏.代码方面, ...

  8. 2D横版摩托游戏源码

    这是一款2D横版摩托特技游戏.代码结构和传统写法有些差异,但是效果还算不错. 传统的写法可能会使用box2d引擎,或者至少模拟出一个简单的物理模型,这里代码有点另类,甚至连速度变量都没有,竟然也能做出 ...

  9. unity3d游戏2d横版射击游戏完整项目源码分享

    unity3d游戏2d横版射击游戏完整项目源码分享 免费下载地址: 链接:https://pan.baidu.com/s/1YwhEy7DeKIHFU8pBLdJFPg 提取码:3wnx 复制这段内容 ...

最新文章

  1. python实现socket编程,服务端开启多线程(和多个客户端聊天)
  2. maven项目的常用依赖
  3. 计算机语言E9,九种编程语言大对比
  4. 解决Ubuntu14.04 下 E: Encountered a section with no Package: header 问题
  5. MATLAB实战系列(二十四)-大规模邻域搜索(LNS)求解带时间窗的车辆路径问题(VRPTW)(附matlab源代码)
  6. spring beans源码解读之--XmlBeanFactory
  7. Java 读文件的5种方式
  8. c#+handle.exe实现升级程序在运行时自动解除文件被占用的问题
  9. [bzoj1008][HNOI2008]越狱-题解[简单组合数学]
  10. android uid变化,在Android中安装期间确定应用的UID如何?
  11. Rust_lings
  12. 【业务安全06】接口参数账号修改漏洞——基于metinfov4.0平台
  13. 台式计算机进入安全模式蓝屏,电脑进入安全模式时蓝屏怎么解决
  14. 华为荣耀7i刷linux,奇兔刷机独家支持华为荣耀7i一键刷机 全网首发刷机ROM包
  15. 2017,知识与财富
  16. Python今日编程——判断水仙花数然后求水仙花数
  17. 目前宽带的接入方式有哪些
  18. flutter在IOS上显示英文
  19. 同花顺软件“股本结构.财经”文件格式分析
  20. ffmpeg moov 前移命令

热门文章

  1. “Ubuntu 20.04 LTS _Focal Fossa - Release amd64 (20200423)” 的盘片插入驱动器“/cdrom/”再按「回车」键
  2. 特斯拉做工问题太多,但为何不影响大卖
  3. 美团、CVTE、腾讯面试题目总结
  4. (十五)c#Winform自定义控件-键盘(二)
  5. STL allocator
  6. chrome浏览器卡死问题解决
  7. 【记录】戴尔台式机预装WIN10降WIN7
  8. 【Linux新手篇】day6
  9. 微信公众号一次群发多条消息
  10. android无线打印