最近心血来潮,看到官方推荐的源码中有一款还不错的《超级马里奥》的源码,于是就下下来学习一下。
这里说明一下,我此次的重新,基本上是仿照这个源码写的,不同的是,在学习其同时,我加入了一点自己的东西。
这里给上原源码连接:
http://cn.cocos2d-x.org/tutorial/show?id=2053
因为我准备重写这个游戏,所以这里我会重新创建一个项目一切从头开始
我不喜欢写配置开发环境,因为这对于一个程序员来说是基础中的基础。所以,开发环境的东西请自行搞定。
我们首先创建一个项目叫做SuperMarioDemo,创建完成之后如图:
上面是创建完项目用VS打开的项目代码。对于原项目我删去HelloWorldScene.h和HelloWorldScene.cpp两个文件。然后对AppDelegate.h和AppDelegate.cpp做了如下修改:
AppDelegate.h
- /**
- * 项目的入口类的声明
- */
- #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
- /**
- * 游戏入口类的实现
- */
- #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();
- }
当然,不用着急,因为里面还什么都没做,细心的看会发现
这几行已经被注释了,因为我还没有部署界面和场景,所以程序给的就是一个黑色的界面。
效果是这样的就没错了,这里我需要对C++和Cocos2dx的一些东西解释一下。
第一,在程序中.h文件的前面2行和最后一行的#ifndef...#define..#endif宏的作用是防止文件被多次引用,即如果项目中有多个.h文件的ifndef后面的大写(一般大写)名称一样的话除了创建的第一个.h文件里面的声明是可用的外,其他都无效,所以在使用的时候应避免重复。
第二,USING_NS_CC;此句同 using namespace cocos2d; 即使用cocos2dx的命名空间,使用了词句之后在后面的程序中如果遇到cocos2dx里面封装的类的时候可以不必使用cocos2d::封装类。如原代码中的class AppDelegate : private cocos2d::Application
在使用了命名空间之后可以直接写成class AppDelegate : private Application。
第三,音乐类 (SimpleAudioEngine)的使用要注意加入两个的东西。#include "SimpleAudioEngine.h"和using namespace CocosDenshion;否则报错