參考 【偶尔e网事】 的 【cocos2d-x入门实战】微信飞机大战  cocos2dx 2.0版本号,偶尔e网事他写的很具体,面面俱到,大家很有必要看下。能够通过以下链接跳转:

cocos2d-x入门实战

这里面我以【cocos2d-x入门实战】微信飞机大战 为蓝本,用cocos2dx
3.0rc1翻版。安装环境什么的,我就不说了,网上都能够找到,我直接从游戏開始界面说起。

想往下看的话,你必须会的一件事,就是你已经能创建出cocos2dx3.rc1的helloworldproject。

以下是飞机大战图片资源下载:

图片资源下载地址

打飞机是一项须要前戏的运动,所以我们加个欢迎界面什么的,搞搞前戏气氛,还是非常有必要的。

以下就让我们完毕前戏,该做的事情:

1.游戏開始界面



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

这里我们实现了简单静态界面,以及一个炫酷的动态图,尽管仅仅是三秒钟!,我这里直接用了偶尔e网事大神的资源,大神请原谅我把你的飞机升级成3.0版本号的,假设不爽,请过来打我~好吧,我好jian.....

二、初始project的介绍

如果你已经创建了一个名为“PlayThePlane”的project,那么你的解决方式将会是这种:

project是从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 退出button回调
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目录

这个是我的project资源路径: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,大家一起学习。

【一】仿微信飞机大战cocos2d-x3.0rc1的更多相关文章

  1. unity仿微信飞机大战项目

    开发路线: 1,游戏背景(连续播放) 2,添加主角 3,设置游戏主角的动画 4,添加两种子弹并设置子弹的运动 5,添加三种子弹 设置子弹的自动生成和运动 6,添加两种奖励物品 设置奖励物品的自动生成和 ...

  2. 用DIV+Css+Jquery 实现的旧版微信飞机大战。

    用jquery 实现的旧版微信飞机大战. 以前一直都是做后台和业务逻辑,前端很少去做, 现在个小游戏. 方向键控制方向,Ctrl 键 放炸弹(当然你的有炸弹,哈哈)! 主要都是用div+Css实现的, ...

  3. Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现

    看到cocos2d-x推出了3.1版本号,真是每月一次新版本号,速度. 另一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!! . 视频下载 ...

  4. 用Javascript模拟微信飞机大战游戏

    最近微信的飞机大战非常流行,下载量非常高. 利用JS进行模拟制作了一个简单的飞机大战[此源码有很多地方可以进行重构和优化] [此游戏中没有使用HTML5 任何浏览器都可以运行]. 效果图: 原理:利用 ...

  5. 500行代码,教你用python写个微信飞机大战

    这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手. 帮助蹲厕族.YP族.饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右 ...

  6. [置顶] 【cocos2d-x入门实战】微信飞机大战之六:子弹层的处理

    这一篇将会处理完子弹层的其他要点. 1.子弹的初始位置 子弹的初始位置在飞机的机头位置,因为飞机在游戏的过程中会随着玩家的触摸而改变其位置,所以,子弹的初始位置只能以当前飞机位置为基准进行添加. CC ...

  7. [置顶] 【cocos2d-x入门实战】微信飞机大战之三:飞机要起飞了

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11730601 不过明眼人一看就知道起飞的不是飞机,是背景,相对运动引起的错觉. 1 ...

  8. [置顶] 【cocos2d-x入门实战】微信飞机大战之二:别急,先处理好CCScene和CCLayer的关系

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11713197 在整个游戏开始之前,我们先看一下HelloWorld示例中CCSce ...

  9. [置顶] 【cocos2d-x入门实战】微信飞机大战之四:飞机登场咯

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11757175 昨天收到了电子工业出版社寄过来的<cocos2d-x游戏开发之 ...

随机推荐

  1. python+opencv

    $cd numpy $ sudo python setup.py build $ sudo python setup.py installRunning from numpy source direc ...

  2. hdoj 2896 病毒侵袭(AC自动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 思路分析:题目为模式匹配问题,对于一个给定的字符串,判断能匹配多少个模式:该问题需要静态建树,另 ...

  3. HDOJ 1423 Greatest Common Increasing Subsequence(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1423 思路分析:[问题定义]给定两个序列A[0, 1,..., m]和B[0, 1, ..., n], ...

  4. nyoj-709-异形卵(水题)

    异 形 卵 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描写叙述 我们探索宇宙,是想了解浩瀚星空的奥妙.但我们却非常少意识到宇宙深处藏匿的危急,它们无时无刻不紧盯着我们的地球 ...

  5. HDU 4725 The Shortest Path in Nya Graph-【SPFA最短路】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:有N个点和N层..一层有X个点(0<=X<=N).两邻两层间有一条路花费C.还有M ...

  6. Android 中文API (65) —— BluetoothClass[蓝牙]

    前言 本章内容是android.bluetooth.BluetoothClass,为Android蓝牙部分的章节翻译.用于描述远端设备的类型,特点等信息,通过getBluetoothClass()方法 ...

  7. 「C」 函数、运算、流程控制

    一.函数 (一)什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”. (二)函数的定义 目的:将一个常用的功能封装起来,方 ...

  8. JavaSE学习总结第15天_集合框架1

      15.01 对象数组的概述和使用 public class Student { // 成员变量 private String name; private int age; // 构造方法 publ ...

  9. resolve "Undefined attribute name" warning for Angular "ng-" attributes in HTML files

    由于这些attributes引起的warning数量较多, 影响直观查找其他warning. 因此选择将这类warning忽视掉: Project Property -> Validation ...

  10. ASP.NET jQuery 随笔 在TextBox里面阻止复制、剪切和粘贴事件

    当用户要输入一些密码.信用卡信息和银行账号等敏感信息,用户更希望手工通过键盘敲入数据,而好过通过剪贴板复制粘贴. 我们先来看下实现后的效果: <%@ Page Language="C# ...