cocos2dx入门编程HelloGame
来源:互联网 发布:字有几个字节知乎 编辑:程序博客网 时间:2024/06/08 00:20
我们游戏开发通常是这样的,首先在Microsoft Visual Studio 2012中proj.win32工程编写代码并且在windows上调试运行,当游戏主体开发完成后,进行so文件的编译打包,然后继续在eclipse的proj.android工程中编写少量的代码完成游戏在android平台下的打包开发。
l 分析proj.win32工程的主要构成
用Microsoft Visual Studio 2012打开proj.win32工程
组成:
整个hellogame的解决方案由hellogame、libbox2d、libcocos2d、libSpine四个工程项目构成。
1、Hellogame工程:游戏主工程,我们开发工作主要在这个工程中完成
2、libbox2d工程:模拟2D刚体物体的C++物理引擎,大名鼎鼎植物大战僵尸、愤怒的小鸟等游戏均有这个引擎的功劳
3、libcocos2d工程:这个不用说了,整个cocos2dx核心
4、libSpine工程:工具软件支持库
接下来主要对Hellogame工程的代码进行解析,libbox2d工程在后面的物理引擎篇的时候在进行讲解,至于其它2个工程在后续使用到的篇幅中在进行讲解。
Hellogame工程的源代码:
工程主要由src目录下的AppDelegate.cpp、AppDelegate.h、HelloWorldScene.cpp、HelloWorldScene.h四个源文件和win32目录下的main.cpp、main.h两个源文件组成。
src目录下的源文件是所有6个平台共用的代码文件,不管是android还是ios都使用这个目录下的源文件,属于真正跨平台部分的代码。
win32目录下的源文件只是一个main主入口文件,负责win32平台下对游戏的调用。其实在对应的proj.android的工程里也有一个android平台对应的main主入口文件,只是由于平台的不同实现代码也各有不同,但是目的一样。
AppDelegate.cpp源代码:
AppDelegate类似于android的Application的作用,提供一些应用程序级别的状态的回调,整个游戏应用程序由这个文件方法进行控制。下面是几个主要方法的说明和解释:
#include"AppDelegate.h"
#include"HelloWorldScene.h"
//命名空间宏,偷懒引入cocos2d的头文件
USING_NS_CC;
AppDelegate::AppDelegate(){
}
AppDelegate::~AppDelegate()
{
}
//设置 OpenGL context
//这个设置对所有平台都有效
void AppDelegate::initGLContextAttrs()
{
//设置 OpenGL context属性,目前只能设置6个属性
//red,green,blue,alpha,depth,stencil
GLContextAttrs glContextAttrs = {8,8, 8,8, 24,8};
GLView::setGLContextAttrs(glContextAttrs);
}
//当应用程序启动时执行,游戏程序启动入口
//在这里我们启动了第一个scene(场景)
//在具体游戏中通常在这里启动loading界面
//你的游戏从这里开始!
bool AppDelegate::applicationDidFinishLaunching() {
// 初始化 director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("My Game");
director->setOpenGLView(glview);
}
// 在屏幕上显示FPS数
// 开发阶段建议开启这个设置,可以通过这个对自己游戏性能有个大体了解
// 等游戏正式发布时关闭这个设置
director->setDisplayStats(true);
// 设置 FPS数默认值为 1.0/60
director->setAnimationInterval(1.0 /60);
// 创建一个HelloWorld的scene.这个是自动回收的对象
auto scene = HelloWorld::createScene();
// 告诉director运行HelloWorld的scene
director->runWithScene(scene);
returntrue;
}
//当游戏进入后台时会调用这个方法
//比如玩游戏时按下android手机的home按键
//比如当游戏时有电话打入直接显示来电界面
void AppDelegate::applicationDidEnterBackground() {
Director::getInstance()->stopAnimation();
// 如果你的游戏使用了SimpleAudioEngine,必须在这里进行暂停
// 暂停代码如下:
//SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}
//当游戏恢复到前台运行时会调用这个方法
//比如接电话结束是游戏界面又恢复到前台时
void AppDelegate::applicationWillEnterForeground() {
Director::getInstance()->startAnimation();
// 如果你的游戏使用了SimpleAudioEngine,必须在这里进行恢复
// 恢复代码如下:
// SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}
上述代码解释中的提到的director(导演:负责游戏场景的显示切换等,像电影导演一样掌控整个电影的一切)、scene(场景:负责显示一个游戏场景,就像电影的一个场景镜头)。
上面代码中最重要的方法为applicationDidFinishLaunching(),因为你的游戏从这个方法开始!
HelloWorldScene.cpp源代码:
上面代码中在AppDelegate类的applicationDidFinishLaunching()方法中创建了一个HelloWorldScene的场景,并且运行这个场景,HelloWorldScene.cpp就是这个场景具体的代码实现。下面是几个主要方法的说明和解释:
#include"HelloWorldScene.h"
USING_NS_CC;
//创建场景
Scene*HelloWorld::createScene()
{
//创建一个自释放的场景对象
auto scene = Scene::create();
//创建一个自释放的画面层对象
auto layer = HelloWorld::create();
//把创建的画面层添加到场景中
//一个场景可以添加多个画面层
scene->addChild(layer);
//返回这个创建的场景
return scene;
}
//场景初始化方法
bool HelloWorld::init()
{
// 1. 首先进行父类初始化
if ( !Layer::init() )
{
//如果初始化父类失败返回false
returnfalse;
}
//获取整个手机可视屏幕尺寸
Size visibleSize =Director::getInstance()->getVisibleSize();
//获取手机可视屏原点的坐标
Vec2 origin =Director::getInstance()->getVisibleOrigin();
// 创建一个带图标的关闭按钮
// 点击后调用menuCloseCallback方法退出游戏
auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
// 设置关闭按钮的显示位置
// 显示在可视屏幕的右下角
closeItem->setPosition(Vec2(origin.x +visibleSize.width - closeItem->getContentSize().width/2 ,
origin.y +closeItem->getContentSize().height/2));
// 创建一个可自释放的菜单
auto menu = Menu::create(closeItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu,1);
//创建一个显示"HelloGame"文字的Label
auto label = Label::createWithTTF("Hello Game","fonts/Marker Felt.ttf",24);
// 设置label在屏幕中的显示位置
label->setPosition(Vec2(origin.x +visibleSize.width/2,
origin.y +visibleSize.height - label->getContentSize().height));
// 把label添加到画面层
this->addChild(label,1);
// 创建一个带图片的精灵
auto sprite = Sprite::create("HelloWorld.png");
// 设置图片精灵的显示位置
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
// 添加图片精灵到画面层
this->addChild(sprite,0);
returntrue;
}
//退出按钮事件
void HelloWorld::menuCloseCallback(Ref* pSender)
{
//当是wp8或者winrt平台的时候
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM ==CC_PLATFORM_WINRT)
MessageBox("You pressedthe close button. Windows Store Apps do not implement a close button.","Alert");
return;
#endif
//结束Director
Director::getInstance()->end();
//当是ios平台的时候退出
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
上述的代码是一个简单的Scene(场景)实现代码,当我们真正开发游戏时,其实就是制作一个一个的场景,并且通过Director进行调度组织构成一个完整的游戏。
- cocos2dx入门编程HelloGame
- cocos2dX——HelloGame项目的创建
- cocos2dx入门
- cocos2dx入门
- [cocos2dx lua]cocos2dx lua入门
- Cocos2dx入门全程记录
- Cocos2dx 入门小游戏实例
- Cocos2dx之入门基础
- Cocos2dx-lua -- 入门-class
- cocos2dx - 网络编程
- cocos2dx游戏开发概念入门
- cocos2dx入门学习第一天
- Cocos2dx入门小游戏---Runner教程
- Cocos2dx中的Spine骨骼入门
- cocos2dx从入门到精通
- cocos2dx编程记录(3)
- cocos2dx 防御式编程模式
- cocos2dx入门一之引擎初始化
- 多线程 生产者与消费者
- 在anaconda(python)下安装opencv
- Python装饰器
- Error:Failed to resolve: com.android.support:support-annotations:26.0.2
- R3注入的四种方式
- cocos2dx入门编程HelloGame
- axios 全攻略之 API
- 第一次使用Android Studio时你应该知道的一切配置
- 在VS中OpenCV用imread读取不到图片
- AtCoder AGC 005D 容斥+二分图+DP
- 09_28
- nginx
- 大学真的是该放松的时候吗?
- [算法]Gale-Shapley Algorithm-稳定匹配算法的设计、实现与探讨(下)