@H_301_10@
最近心血来潮,看到官方推荐的源码中有一款还不错的《超级马里奥》的源码,于是就下下来学习一下。
@H_301_10@
@H_301_10@
@H_301_10@
这里说明一下,我此次的重新,基本上是仿照这个源码写的,不同的是,在学习其同时,我加入了一点自己的东西。
这里给上原源码连接:
http://cn.cocos2d-x.org/tutorial/show?id=2053
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
因为我准备重写这个游戏,所以这里我会重新创建一个项目一切从头开始
@H_301_10@
@H_301_10@
@H_301_10@
我不喜欢写配置开发环境,因为这对于一个程序员来说是基础中的基础。所以,开发环境的东西请自行搞定。
@H_301_10@
@H_301_10@
@H_301_10@
我们首先创建一个项目叫做SuperMarioDemo,创建完成之后如图:
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
上面是创建完项目用VS打开的项目代码。对于原项目我删去HelloWorldScene.h和HelloWorldScene.cpp两个文件。然后对AppDelegate.h和AppDelegate.cpp做了如下修改:
@H_301_10@
@H_301_10@
@H_301_10@
AppDelegate.h
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
AppDelegate.cpp
@H_301_10@
@H_301_10@
@H_301_10@ 如此,我得到的界面是这样的: @H_301_10@
@H_301_10@
/** * 项目的入口类的声明 */ #ifndef _APP_DELEGATE_H_ #define _APP_DELEGATE_H_ #include "cocos2d.h" USING_NS_CC; /** * 创建app的入口类继承自cocos2dx的Application类 */ class AppDelegate : private Application { public: /** * 构造函数 */ AppDelegate(); /** * 析构函数 */ virtual ~AppDelegate(); /** * app加载完成函数 */ virtual bool applicationDidFinishLaunching(); /** * app进入后台运行函数 */ virtual void applicationDidEnterBackground(); /** * app从后台被唤醒的函数 */ virtual void applicationWillEnterForeground(); }; #endif
AppDelegate.cpp
@H_301_10@
@H_301_10@
/** * 游戏入口类的实现 */ #include "AppDelegate.h" #include "SimpleAudioEngine.h" using namespace CocosDenshion; /** * 构造函数,构造AppDelegate */ AppDelegate::AppDelegate() {} /** * 析构函数,回收或者回收前的最后一次操作 */ AppDelegate::~AppDelegate() {} /** * 主程序加载完成 */ bool AppDelegate::applicationDidFinishLaunching() { //创建一个单例导演 Director *director = Director::getInstance(); //通过导演获取一个OpenGL坐标系视图 auto glview = director->getOpenGLView(); //如果没有获取到 if(!glview) { //创建一个名叫“超级玛丽”的窗口 glview = GLView::create("超级玛丽"); //设置窗口为当期OpenGL坐标系视图 director->setOpenGLView(glview); } //默认显示帧率 director->setDisplayStats(true); //默认设置每秒60帧 director->setAnimationInterval(1.0 / 60); //这里是用于显示我们定义的场景 //auto scene = HelloWorld::createScene(); //运行这个场景 // director->runWithScene(scene); //因为函数是需要返回一个bool类型的返回值的,这里返回true return true; } /** * 当游戏被中断(比如打电话进来了)时自动响应的方法 */ void AppDelegate::applicationDidEnterBackground() { //暂停背景音乐播放 SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); //停止动作 Director::getInstance()->stopAnimation(); } /** * 游戏被重新唤起时调用的方法 */ void AppDelegate::applicationWillEnterForeground() { //重新开启动作 Director::getInstance()->startAnimation(); //继续播放背景音乐 SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); }
@H_301_10@ 如此,我得到的界面是这样的: @H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
当然,不用着急,因为里面还什么都没做,细心的看会发现
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
这几行已经被注释了,因为我还没有部署界面和场景,所以程序给的就是一个黑色的界面。
@H_301_10@
@H_301_10@
@H_301_10@
@H_301_10@
效果是这样的就没错了,这里我需要对C++和Cocos2dx的一些东西解释一下。
@H_301_10@
@H_301_10@
@H_301_10@
第一,在程序中.h文件的前面2行和最后一行的#ifndef...#define..#endif宏的作用是防止文件被多次引用,即如果项目中有多个.h文件的ifndef后面的大写(一般大写)名称一样的话除了创建的第一个.h文件里面的声明是可用的外,其他都无效,所以在使用的时候应避免重复。
@H_301_10@
@H_301_10@
@H_301_10@
第二,USING_NS_CC;此句同 using namespace cocos2d; 即使用cocos2dx的命名空间,使用了词句之后在后面的程序中如果遇到cocos2dx里面封装的类的时候可以不必使用cocos2d::封装类。如原代码中的class AppDelegate : private cocos2d::Application
@H_301_10@
在使用了命名空间之后可以直接写成class AppDelegate : private Application。
@H_301_10@
@H_301_10@
@H_301_10@