cocos2dx实例开发之2D横版跑酷
从网上下了一点素材资源,外加自己ps一点资源,然后东拼西凑写了一个横版跑酷的小游戏
ps:csdn好不爽,无法传大点的gif,所以只好录了个短的gif,而且压缩之后凑合能看
预览
步骤
1 工程结构
- win8.1
- vs2013
- cocos2dx 3.2
![](/assets/blank.gif)
游戏组成结构
主要有以下几个场景
- 预加载场景,用于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 游戏主场景
//游戏关卡枚举
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,这样计算坐标时只需要左整数倍数的偏移就可以了。
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)));}
其他逻辑
//当角色被挡道之后跟上原来的位置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 设置场景
//春天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);
一些简介
效果图
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
cocos2dx实例开发之2D横版跑酷相关推荐
- Unity 2D打造《盖伦快跑》横版跑酷ARPG
是一个灵活且高性能的开发平台,用于制作富有创意的3D和2D智能互动游戏.以其"一次创作,多平台部署"的性能使开发者们能够将内容发布到所有最热门的平台. 随着3D游戏市场的高速发展, ...
- Unity学习笔记3 简易2D横版RPG游戏制作(三)
这一篇本来应该是在上一篇后面直接补进去的.不过因为排版的问题.所以我就另开一篇来整理了,好了,废话不多说,马上整理: 十八.关卡的锁定与解锁 前面我们已经解决了在游戏开始时可以选择关卡的问题,接下来我 ...
- DirectX游戏开发之2D文字的实现
DirectX游戏开发之2D文字的实现 文字是承载信息最有效的载体之一,各种游戏程序都离不开文字的显示.对于3D文字来说,2D文字有其渲染的高效性和实现的简洁性. 2D文字的显示无论在写2D游戏还是在 ...
- unity中实现经典的2d横版单向跳跃平台
经常玩2d横版游戏的朋友们相信一定对这种单向跳跃平台很熟悉:我希望我的角色可以通过跳跃跳上平台,然后在平台之上按下键盘的下键后从平台上落下. 那么想要实现这样的效果具体要怎么做呢?我们还是先将想要实现 ...
- Android开发之2048安卓版
之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...
- Unity 4 3 制作一个2D横版射击游戏 2
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在上一篇 ...
- 基于unity的2D横版游戏开发日志 小结
前言 说是基于unity的2D横版游戏,实际上只是一个初学unity与C#新人的练手Demo,目前还处于半成状态.美术资源方面全部出自unity免费资源,经过自己的小修,大致拼出了一个游戏.代码方面, ...
- 2D横版摩托游戏源码
这是一款2D横版摩托特技游戏.代码结构和传统写法有些差异,但是效果还算不错. 传统的写法可能会使用box2d引擎,或者至少模拟出一个简单的物理模型,这里代码有点另类,甚至连速度变量都没有,竟然也能做出 ...
- unity3d游戏2d横版射击游戏完整项目源码分享
unity3d游戏2d横版射击游戏完整项目源码分享 免费下载地址: 链接:https://pan.baidu.com/s/1YwhEy7DeKIHFU8pBLdJFPg 提取码:3wnx 复制这段内容 ...
最新文章
- python实现socket编程,服务端开启多线程(和多个客户端聊天)
- maven项目的常用依赖
- 计算机语言E9,九种编程语言大对比
- 解决Ubuntu14.04 下 E: Encountered a section with no Package: header 问题
- MATLAB实战系列(二十四)-大规模邻域搜索(LNS)求解带时间窗的车辆路径问题(VRPTW)(附matlab源代码)
- spring beans源码解读之--XmlBeanFactory
- Java 读文件的5种方式
- c#+handle.exe实现升级程序在运行时自动解除文件被占用的问题
- [bzoj1008][HNOI2008]越狱-题解[简单组合数学]
- android uid变化,在Android中安装期间确定应用的UID如何?
- Rust_lings
- 【业务安全06】接口参数账号修改漏洞——基于metinfov4.0平台
- 台式计算机进入安全模式蓝屏,电脑进入安全模式时蓝屏怎么解决
- 华为荣耀7i刷linux,奇兔刷机独家支持华为荣耀7i一键刷机 全网首发刷机ROM包
- 2017,知识与财富
- Python今日编程——判断水仙花数然后求水仙花数
- 目前宽带的接入方式有哪些
- flutter在IOS上显示英文
- 同花顺软件“股本结构.财经”文件格式分析
- ffmpeg moov 前移命令
热门文章
- “Ubuntu 20.04 LTS _Focal Fossa - Release amd64 (20200423)” 的盘片插入驱动器“/cdrom/”再按「回车」键
- 特斯拉做工问题太多,但为何不影响大卖
- 美团、CVTE、腾讯面试题目总结
- (十五)c#Winform自定义控件-键盘(二)
- STL allocator
- chrome浏览器卡死问题解决
- 【记录】戴尔台式机预装WIN10降WIN7
- 【Linux新手篇】day6
- 微信公众号一次群发多条消息
- android无线打印