【一】仿微信飞机大战cocos2d
参考 【偶尔e网事】 的 【cocos2d-x入门实战】微信飞机大战 cocos2dx 2.0版本, 偶尔e网事他 写的非常详细,面面俱到,大家非常有必要看下。可以通过下面链接跳转: cocos2d-x入门实战 这里面我以 【cocos2d-x入门实战】微信飞机大战为蓝本,用cocos2dx 3.0r
参考 【偶尔e网事】 的 【cocos2d-x入门实战】微信飞机大战 cocos2dx 2.0版本,偶尔e网事他写的非常详细,面面俱到,大家非常有必要看下。可以通过下面链接跳转:
cocos2d-x入门实战
这里面我以【cocos2d-x入门实战】微信飞机大战 为蓝本,用cocos2dx 3.0rc1翻版。安装环境什么的,我就不说了,网上都可以找到,我直接从游戏开始界面说起。
想往下看的话,你必须会的一件事,就是你已经能创建出cocos2dx3.rc1的helloworld工程。
飞机大战源码和资源放在第四节中,不想看的直接去第四节中找吧
打飞机是一项需要前戏的运动,所以我们加个欢迎界面什么的,搞搞前戏气氛,还是很有必要的。
下面就让我们完成前戏,该做的事情:
1.游戏开始界面
一、首先是开始欢迎界面的展示
这里我们实现了简单静态界面,以及一个炫酷的动态图,虽然只是三秒钟!,我这里直接用了偶尔e网事大神的资源,大神请原谅我把你的飞机升级成3.0版本的,如果不爽,请过来打我~好吧,我好jian.....
二、初始工程的介绍
假设你已经创建了一个名为“PlayThePlane”的工程,那么你的解决方案将会是这样的:
工程是从main.cpp开始执行的:
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance);// UNREFERENCED_PARAMETER 告诉编译器,已经使用了该变量,不必检测警告! UNREFERENCED_PARAMETER(lpCmdLine); // 要是没加,应该会有这个“warning C4100: “lpCmdLine” : unreferenced formal parameter.” // create the application instance 创建应用实例 AppDelegate app; return Application::getInstance()->run();// cocos2dx AppDelegate程序正式开始运行 }
bool AppDelegate::applicationDidFinishLaunching() { // initialize director 导演 auto director = Director::getInstance(); // 窗体框架 auto glview = director->getOpenGLView(); if(!glview) { glview = GLView::createWithRect("PlayerThePlane", Rect(0, 0, 480, 800)); // 窗体名 + 宽高规格 director->setOpenGLView(glview); // 1.LOOK 该函数会自动按设计宽高和缩放方式适应手机屏幕,设置游戏分辨率 (设计宽,设计高,缩放方式)。 glview->setDesignResolutionSize(480, 800, kResolutionNoBorder); } // turn on display FPS 打印帧率,不希望左下角三行出现的 就注释掉 或者设置false director->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this 一秒60帧 director->setAnimationInterval(1.0 / 60); // create a scene. it's an autorelease object 创建场景 auto scene = HelloWorld::createScene(); // run 导演让场景开始运作 director->runWithScene(scene); return true; }
这里我们修改和添加的东西有:
glview = GLView::createWithRect("PlayerThePlane", Rect(0, 0, 480, 800)); 我们设置了我们飞机的名字,和容纳的空间
glview->setDesignResolutionSize(480, 800, kResolutionNoBorder);
注释很清楚,就不再解释了。
auto scene = HelloWorld::createScene();这个就是我们的开始场景,auto是c++11的特性。触景生情,好的场景,会让人情不自禁的想把这个飞机打下去,所以我们有必要要让场景炫起来。
director->runWithScene(scene);把scene场景交给导演来运作
三、游戏开始界面的具体实现
我们先看下HelloWorldScene.h代码:
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" class HelloWorld : public cocos2d::Layer { public: // 产生一个场景,然后把本Layer层类加入到场景中去 static cocos2d::Scene* createScene(); // 在Layer层中添加精灵元素 virtual bool init(); // a selector callback 退出按钮回调 void menuCloseCallback(cocos2d::Ref* pSender); // 它的具体实现其实就是HelloWorld::create(),你进入CREATE_FUNC宏定义可以看到 CREATE_FUNC(HelloWorld); public: void loadingDone(Node* pNode); // 从开始界面 跳到游戏界面 void PreloadMusicAndPicture(); // 预加载音乐和图片 }; #endif // __HELLOWORLD_SCENE_H__
#include "HelloWorldScene.h" #include "SimpleAudioEngine.h" USING_NS_CC; Scene* HelloWorld::createScene() { // 创建一个自动释放的场景 auto scene = Scene::create(); // 创建一个自动释放的layer层 auto layer = HelloWorld::create(); // 场景中加入layer层 scene->addChild(layer); // 返回场景 return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { // 当你想调用父类的virtual,又想有自己的实现的时候,就这么写 if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin(); // 创建退出按钮 auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width/2 , origin.y + closeItem->getContentSize().height/2)); auto menu = Menu::create(closeItem, NULL); menu->setPosition(Point::ZERO); this->addChild(menu, 1); ///////////////////////////// // 3. add your codes below... // add a label shows "Hello World" // create and initialize a label // 下面的代码去掉,加入自己的代码 // 返回OpenGL视图的大小 Size winSize=Director::getInstance()->getWinSize(); // 预加载图片和音乐 PreloadMusicAndPicture(); // 背景图(精灵) auto background = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("background.png")); background->setPosition(Point(winSize.width/2,winSize.height/2)); // 设置位置 // 场景中加入背景图 this->addChild(background); // 加入copyright图片(精灵) auto copyRight = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("shoot_copyright.png")); copyRight->setAnchorPoint(Point(0.5, 0)); // 描点 copyRight->setPosition(Point(winSize.width/2,winSize.height/2)); this->addChild(copyRight); // 加入loading图片(精灵) auto loading = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading1.png")); loading->setPosition(Point(winSize.width/2,winSize.height/2)); this->addChild(loading); // Animation是由许多精灵帧组成,可以设置间隔时间,持续时间等,它实际上是包含着一组数据 Animation* animation=Animation::create(); animation->setDelayPerUnit(0.2f); // 间隔时间 animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading1.png")); animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading2.png")); animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading3.png")); animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading4.png")); // 通过帧数据创建帧动作(创建序列帧动画) Animate* animate=Animate::create(animation); Repeat* repeat=Repeat::create(animate,3); // 重复一个动作的次数 CallFuncN* repeatdone=CallFuncN::create(CC_CALLBACK_1(HelloWorld::loadingDone, this)); // 创建回调函数 CC_CALLBACK_1 代表一个参数 Sequence* sequence=Sequence::create(repeat, repeatdone, NULL);// 让多个动作按照前后顺序逐一执行 repeatdone 放在 repeat前的话,就不会播放执行3次序列帧的动画 loading->runAction(sequence); // 执行上述动画 this->setKeypadEnabled(true); // 设置监听Android的按键,如返回键、菜单键、Home键等。 return true; } void HelloWorld::menuCloseCallback(Ref* pSender) { Director::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif } void HelloWorld::PreloadMusicAndPicture() { //png加入全局cache中 plist存储了 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ui/shoot_background.plist"); SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ui/shoot.plist"); // 音效 CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("sound/background-music1.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/bullet.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/enemy1_down.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/enemy2_down.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/enemy3_down.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/game_over.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/get_bomb.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/get_double_laser.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/use_bomb.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/big_spaceship_flying.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/achievement.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/out_porp.mp3"); CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/button.mp3"); // 背景音乐 CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/game_music.mp3",true); } void HelloWorld::loadingDone( Node* pNode ) { }
路径
预加载的路径是项目路径下的Resources文件夹
这个是我的工程资源路径:E:\studyCocos2dx3.0RC1\PlayThePlane\Resources
如:SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ui/shoot_background.plist");
其实就是SpriteFrameCache::getInstance()->addSpriteFramesWithFile("E:/studyCocos2dx3.0RC1/PlayThePlane/Resources/ui/shoot_background.plist");
图片加载
我们的图片是用TexturePacker工具把若干图片打包生成的一张总的png和plist,plist保存着png图片中的各个数据,比如名字大小什么的。当然你也可以不用这种整合的,那么加载图片的方式就改变了,比如背景图的加载:
// 背景图(精灵) auto background = Sprite::create("ui/shoot_background/background.png"); background->setPosition(Point(winSize.width/2,winSize.height/2)); // 设置位置 // 场景中加入背景图 this->addChild(background);
音乐加载
预加载中,有一个不是预加载,而是直接加载开启的:
CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/game_music.mp3",true);这个是直接把开启了背景音乐。
图片动画效果以及游戏开始的回调
CallFuncN* repeatdone=CallFuncN::create(CC_CALLBACK_1(HelloWorld::loadingDone, this)); // 创建回调函数 CC_CALLBACK_1 代表一个参数 Sequence* sequence=Sequence::create(repeat, repeatdone, NULL);// 让多个动作按照前后顺序逐一执行 repeatdone 放在 repeat前的话,就不会播放执行3次序列帧的动画 loading->runAction(sequence); // 执行上述动画
好了,到这里就完成了所谓的游戏开始前的界面。下次说什么我也不知道,写什么,说什么吧。
我看了下我的排版,着实奇怪,有时候行和行间距离很近,有时候很远。而且怎么设置字体啊,我想一开始就是小型字体,而不是每次写完一段,再手动去改。
大家有什么不懂得,可以直接问我(不要问的太深入~),我也是刚开始学cocos2dx,大家一起学习。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

11月11日,吉祥航空宣布「原神號」已成功進行首航,同時也推出了吉祥航空×原神主題的周邊產品。這些週邊產品包括以1:150等比例製作的787飛機模型、「原神」三週年合作款護照包以及三週年合作款飛行蓋毯本站注意到,「原神號」執飛時間為2023年11月8日-2024年11月8日,機型為波音787-9寬體機,公務艙29座、經濟艙295座。購票方式:打開吉祥航空App點擊首頁“《原神》三週年”置頂圖片進入“《原神》三週年主題航班”落地頁查看“原神號”計劃執飛航班選擇出發時間點擊“預訂”進入購票頁面首航

本站1月6日消息,中國南方航空、東方航空相繼發布機票退改規則調整公告,將機型變動導致無法成行、航班變動導致航程改變、航班經停工延誤等因素納入客票免費退改適用範圍,同時放寬因病退改規則,自北京時間2024年1月10日零時起生效。南航調整如下:擴大客票免費退改範圍將機型變動致您無法成行、航班經停點延誤、機場轉場、不可抗力等因素均納入客票免費退改適用範圍。放寬因病退改規則1.對於因病無法成行的旅客,所持南航國內及國際客票均可申請因病變更或退票。 2.因病退改證明資料調整為繳費發票或住院押金證明(二選一)

本站11月11日消息,據路透社報道,西南航空一位高層透露,波音737MAX7飛機將於2024年4月獲得美國聯邦航空管理局的認證,並將於10-11月開始投入營運。本站注意到,西南航空在上個月公佈了額外108架MAX7飛機的新訂單,預計在2031年之前交付。不過,該飛機的交付時間表取決於美國聯邦航空管理局(FAA)的認證,認證的延遲已經迫使其將數十架MAX7訂單轉換為MAX8。週四晚間,西南航空的首席營運長安德魯・沃特森(AndrewWatterson)在接受採訪時表示:「我們內部的規劃是,預計在4

本站1月21日消息,航空工業通飛日前舉辦新一代國產初級教練機「領雁」AG100首批飛機下線交付儀式,首批交付河南新絲路航校及珠海中航飛行學校。本站注意到,「領雁」AG100飛機是航空工業通飛自主研發的國產新一代民用初級教練機,引進了第三座輔助訓練功能,提升飛行訓練效率;配備自動駕駛系統和整機傘降系統,最大程度保障機組及乘客安全;採用高可靠性設計,全機採用低成本複合材料設計製造技術。圖源航空工業通飛公眾號同時,AG100搭載最新型ROTAX915is發動機,可以使用車用汽油,方便燃料保障並降低培訓

空中巴士飛機全生命週期服務中心今日宣布投入運營,將為飛機全生命週期管理提供解決方案。該中心位於中國四川成都。據介紹,作為其首個一站式服務中心,空中巴士飛機全生命週期服務中心將面向各種機型,涵蓋業務範圍包括從飛機停放、儲存到維修、升級、改裝、拆解、回收以及拆解後的二手可用航材經銷業務。該服務中心已獲得歐洲航空安全局(EASA)和中國民用航空局的相關認證,未來規劃總佔地面積71.7萬平方米,規劃興建停放125架飛機。從投運到2025年,中心將逐步擴大運營,直接聘用員工150人。空中巴士飛機全生命週期服務

本站7月22日消息,在範堡羅航展開幕前夕,波音發布了2024年民用航空市場展望(CMO),預測到2043年全球航空公司將需要近44,000架新的民用飛機。隨著航空旅行完全恢復,最新的未來20年飛機交付量較去年預測值增加3%。該展望也預測,新興市場和全球單通道市場需求將繼續成為民航業的主要成長驅動力。根據CMO,與2023年相比,航空客運量將在未來20年內年均成長4.7%。未來20年的CMO預測亮點包括:全球民用機隊預計每年增長3.2%,增速較航空運量慢,因為航空公司繼續透過提高上座率和增加飛機每日

本站10月18日消息,本田的飛機事業子公司-HondaAircraftCompany(以下簡稱:HACI)在2023年美國公務航空大會暨展覽會的媒體日舉辦新聞發布會,正式發布新款輕型公務機的命名為「HondaJetEchelon」。據介紹,「Echelon」是指一種梯形排布的飛行隊列,這種飛行隊列的空氣動力效率高,能夠節省能量消耗。同時,「Echelon」還有「精選類別」的衍生意義。這個名稱體現了HACI對未來商務噴射機的願景:效率至上,舒適始終。本站查詢獲悉,HondaJetEchelon(

如何利用C++實作一個簡單的飛機訂票系統?隨著空中交通的發展和人們對舒適旅行的需求增加,飛機訂票系統變得越來越重要。在這篇文章中,我們將學習如何利用C++程式語言來實作一個簡單的飛機訂票系統。這個系統將允許用戶查詢航班資訊、選擇座位、預訂和取消機票等功能。首先,我們需要建立一個Flight類別來表示航班。這個類別應該包括以下屬性:航班號碼、起飛地、目的地、起飛時間
