首页 数据库 mysql教程 【一】仿微信飞机大战cocos2d

【一】仿微信飞机大战cocos2d

Jun 07, 2016 pm 03:42 PM
飞机

参考 【偶尔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.游戏开始界面


一、首先是开始欢迎界面的展示

【一】仿微信飞机大战cocos2d

这里我们实现了简单静态界面,以及一个炫酷的动态图,虽然只是三秒钟!【一】仿微信飞机大战cocos2d,我这里直接用了偶尔e网事大神的资源,大神请原谅我把你的飞机升级成3.0版本的,如果不爽,请过来打我~好吧,我好jian.....


二、初始工程的介绍

假设你已经创建了一个名为“PlayThePlane”的工程,那么你的解决方案将会是这样的:

【一】仿微信飞机大战cocos2d


工程是从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程序正式开始运行
}
登录后复制
Application::getInstance()->run()里面到底运行了什么呢?混蛋,自己跳进去看下不就知道了,又不是陷阱,那可都是宝藏堆。我只告诉你它调用了AppDelegate.h中的applicationDidFinishLaunching();这时候我们看看
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__
登录后复制


好吧,我发现我都注释了,没什么好说,直接看HelloWorldScene.cpp代码:
#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); // 执行上述动画
登录后复制
Sequence* sequence=Sequence::create(repeat, repeatdone, NULL);我的理解是,Sequence存放动作队列。其中repeat, repeatdone, NULL这个三个动作是顺序执行的,也就是说先执行完repeat动作(小飞机飞三次),然后执行repeatdone,从而触发回调函数loadingDone(),游戏的开始就是在这里哟。

好了,到这里就完成了所谓的游戏开始前的界面。下次说什么我也不知道,写什么,说什么吧。


我看了下我的排版,着实奇怪,有时候行和行间距离很近,有时候很远。而且怎么设置字体啊,我想一开始就是小型字体,而不是每次写完一段,再手动去改。

大家有什么不懂得,可以直接问我(不要问的太深入~),我也是刚开始学cocos2dx,大家一起学习。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

吉祥航空'原神号”已正式开航,首航周享受纪念登机牌、餐盒和水杯的特别体验 吉祥航空'原神号”已正式开航,首航周享受纪念登机牌、餐盒和水杯的特别体验 Nov 11, 2023 pm 06:37 PM

11月11日,吉祥航空宣布“原神号”已成功进行首航,同时也推出了吉祥航空×原神主题的周边产品。这些周边产品包括按照1:150等比例制作的787飞机模型、“原神”三周年合作款护照包以及三周年合作款飞行盖毯本站注意到,“原神号”执飞时间为2023年11月8日-2024年11月8日,机型为波音787-9宽体机,公务舱29座、经济舱295座。购票方式:打开吉祥航空App点击首页“《原神》三周年”置顶图片进入“《原神》三周年主题航班”落地页查看“原神号”计划执飞航班选择出发时间点击“预订”进入购票页面首航

航空公司调整机票退改规则,国航提供国内无理由退票券×2 航空公司调整机票退改规则,国航提供国内无理由退票券×2 Jan 08, 2024 pm 06:26 PM

本站1月6日消息,中国南方航空、东方航空相继发布机票退改规则调整公告,将机型变动导致无法成行、航班变动导致航程改变、航班经停点延误等因素纳入客票免费退改适用范围,同时放宽因病退改规则,自北京时间2024年1月10日零时起生效。南航调整如下:扩大客票免费退改范围将机型变动致您无法成行、航班经停点延误、机场转场、不可抗力等因素均纳入客票免费退改适用范围。放宽因病退改规则1.对于因病无法成行的旅客,所持南航国内及国际客票均可申请因病变更或退票。2.因病退改证明材料调整为缴费发票或住院押金证明(二选一)

预计西南航空将在明年4月获得波音737 MAX 7飞机认证,计划于10-11月投入运营 预计西南航空将在明年4月获得波音737 MAX 7飞机认证,计划于10-11月投入运营 Nov 11, 2023 am 09:37 AM

本站11月11日消息,据路透社报道,西南航空一位高管透露,波音737MAX7飞机将于2024年4月获得美国联邦航空管理局的认证,并将于10-11月开始投入运营。本站注意到,西南航空在上个月公布了额外108架MAX7飞机的新订单,预计在2031年之前交付。不过,该飞机的交付时间表取决于美国联邦航空管理局(FAA)的认证,认证的延迟已经迫使其将数十架MAX7订单转换为MAX8。周四晚间,西南航空的首席运营官安德鲁・沃特森(AndrewWatterson)在接受采访时表示:“我们内部的规划是,预计在4

国内自主研发的初级民用教练机AG100 '领雁' 正式上线并交付,设备具备自动驾驶技术 国内自主研发的初级民用教练机AG100 '领雁' 正式上线并交付,设备具备自动驾驶技术 Jan 23, 2024 am 08:33 AM

本站1月21日消息,航空工业通飞日前举办新一代国产初级教练机“领雁”AG100首批飞机下线交付仪式,首批交付河南新丝路航校和珠海中航飞行学校。本站注意到,“领雁”AG100飞机是航空工业通飞自主研发的国产新一代民用初级教练机,引入了第三座辅助培训功能,提升飞行培训效率;配备自动驾驶系统和整机伞降系统,最大程度保障机组和乘客安全;采用高可靠性设计,全机采用低成本复合材料设计制造技术。图源航空工业通飞公众号同时,AG100搭载最新型ROTAX915is发动机,可以使用车用汽油,方便燃料保障并降低培训

中国四川成都落地空中客车首个全生命周期飞机服务中心 中国四川成都落地空中客车首个全生命周期飞机服务中心 Jan 24, 2024 pm 11:33 PM

空中客车飞机全生命周期服务中心今日宣布投入运营,将为飞机全生命周期管理提供解决方案。该中心位于中国四川成都。据介绍,作为其首家一站式服务中心,空客飞机全生命周期服务中心将面向各种机型,涵盖业务范围包括从飞机停放、存储到维修、升级、改装、拆解、回收以及拆解后的二手可用航材分销业务。该服务中心已获得欧洲航空安全局(EASA)和中国民用航空局的相关认证,未来规划总占地面积71.7万平方米,规划建设停放125架飞机。从投运到2025年,中心将逐步扩大运营,直接聘用员工150人。空中客车飞机全生命周期服务

波音:未来 20 年全球将需要近 4.4 万架新民用飞机 波音:未来 20 年全球将需要近 4.4 万架新民用飞机 Jul 23, 2024 pm 06:55 PM

本站7月22日消息,在范堡罗航展开幕前夕,波音发布了2024年民用航空市场展望(CMO),预测到2043年全球航空公司将需要近44000架新的民用飞机。随着航空旅行完全恢复,最新的未来20年飞机交付量较去年预测值增长3%。该展望还预测,新兴市场和全球单通道市场需求将继续成为民航业的主要增长驱动力。根据CMO,与2023年相比,航空客运量将在未来20年内年均增长4.7%。未来20年的CMO预测亮点包括:全球民用机队预计每年增长3.2%,增速较航空运量慢,因为航空公司继续通过提高上座率和增加飞机每日

PPT给飞机添加飞翔的动态效果的详细步骤 PPT给飞机添加飞翔的动态效果的详细步骤 Mar 26, 2024 pm 09:01 PM

1、先下载一个飞机的图片素材,建议下载PNG格式的;下载好后新建一个PPT文件,把素材拖进PPT中,按住shift键,等比缩小飞机的大小,并把它移到PPT的右下角。2、现在需要给它添加动画:选中飞机图片,点击【动画】-【动作路径】-【直线】,自动出现了一条直线,看到了吗?。3、现在这个路径不是我们想要的路径,我们要调整直线的位置,让飞机从左下角飞到右上角,选中那个红色点点后,就会出现飞机的目标路径,颜色淡很多,把它移动到右上角,路径就改变好了,现在试下播放效果。4、点击预览后发现不对,飞机是飞上

如何利用C++实现一个简单的飞机订票系统? 如何利用C++实现一个简单的飞机订票系统? Nov 02, 2023 pm 12:35 PM

如何利用C++实现一个简单的飞机订票系统?随着空中交通的发展和人们对舒适旅行的需求增加,飞机订票系统变得越来越重要。在这篇文章中,我们将学习如何利用C++编程语言来实现一个简单的飞机订票系统。这个系统将允许用户查询航班信息、选择座位、预订和取消机票等功能。首先,我们需要创建一个Flight类来表示航班。这个类应该包括以下属性:航班号、起飞地、目的地、起飞时间

See all articles