Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【Cocos2d-x Lua笔记二】CocosLuaGame开篇大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_674_0@ 上一节,创建了一个新项目。现在看看里面都有些什么。

@H_674_0@ 如果用的是3.2版本的引擎默认新建的项目应该是这样的

@H_674_0@

@H_674_0@如果是用3.3的引擎创建的是这样的

@H_674_0@显然,第二个简单多了,那么就从简单的说起吧。

@H_674_0@1.入口文件

@H_674_0@打开src目录

@H_674_0@cocos目录里就是引擎的代码了,不去管它。而main.lua就是执行Lua代码的入口文件了。那怎么设置入口文件呢?进入工程目录的\frameworks\runtime-src\Classes下(工程里没有这个目录?构建一下win32的runtime就行了。在 Cocos IDE中右键工程--Cocos工具--构建自定义runtime。)。好了看看AppDelegate.cpp

#include "AppDelegate.h"
#include "CCLuaENGIne.h"
#include "SimpleAudioENGIne.h"
#include "cocos2d.h"
#include "Runtime.h"
#include "ConfigParser.h"
#include "lua_module_register.h"

using namespace CocosDenshion;

USING_NS_Cc;
using namespace std;

AppDelegate::AppDelegate()
{
}

AppDelegate::~AppDelegate()
{
    SimpleAudioENGIne::end();
}

//if you want a different context,just modify the value of glContextAttrs
//it will takes effect on all platforms
void AppDelegate::initGLContextAttrs()
{
    //set OpenGL context attributions,now can only set six attributions:
    //red,green,blue,alpha,depth,stencil
    GLContextAttrs glContextAttrs = {8,8,24,8};

    GLView::setGLContextAttrs(glContextAttrs);
}

bool AppDelegate::applicationDidFinishLaunching()
{
#if (COCOS2D_DEBUG > 0)
    // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE
    initRuntime();
#endif
    
    // initialize director
    auto director = Director::geTinstance();
    auto glview = director->getOpenGLView();    
    if(!glview) {
        Size viewSize = ConfigParser::geTinstance()->geTinitViewSize();
        String title = ConfigParser::geTinstance()->geTinitViewName();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
        extern void createSimulator(const char* viewName,float width,float height,bool isLandscape = true,float frameZoomFactor = 1.0f);
        bool isLanscape = ConfigParser::geTinstance()->isLanscape();
        createSimulator(title.c_str(),viewSize.width,viewSize.height,isLanscapE);
#else
        glview = cocos2d::GLViewImpl::createWithRect(title.c_str(),Rect(0,viewSize.height));
        director->setOpenGLView(glview);
#endif
    }
   
    auto ENGIne = LuaENGIne::geTinstance();
    ScriptENGIneManager::geTinstance()->setScriptENGIne(ENGInE);
    lua_State* L = ENGIne->getLuaStack()->getLuaState();
    lua_module_register(L);

    // If you want to use Quick-Cocos2d-X,please uncomment below code
    // register_all_quick_manual(L);

    LuaStack* stack = ENGIne->getLuaStack();
    stack->setXXTEAKeyAndSign("2dxLua",strlen("2dxLua"),"XXTEA",strlen("XXTEA"));
    
    //register custom function
    //LuaStack* stack = ENGIne->getLuaStack();
    //register_custom_function(stack->getLuaState());
    
#if (COCOS2D_DEBUG > 0)
    // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE
    startRuntime();
#else
    ENGIne->executeScriptFile(ConfigParser::geTinstance()->getEntryFile().c_str());
#endif

    return true;
}

// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBACkground()
{
    Director::geTinstance()->stopAnimation();

    SimpleAudioENGIne::geTinstance()->pauseBACkgroundMusic();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground()
{
    Director::geTinstance()->startAnimation();

    SimpleAudioENGIne::geTinstance()->resumeBACkgroundMusic();
}
@H_674_0@
其中ENGIne->executeScriptFile(ConfigParser::geTinstance()->getEntryFile().c_str());这一行就是设置入口Lua文件了。那么ConfigParser::geTinstance()->getEntryFile().c_str()跟main.lua又有什么关系呢,同样打开ConfigParser.cpp

#include "json/document.h"
#include "json/filestream.h"
#include "json/Stringbuffer.h"
#include "json/writer.h"
#include "ConfigParser.h"

#define CONFIG_FILE "config.json"
#define CONSOLE_PORT 6010
#define UPLOAD_PORT 6020
#define WIN_WIDTH   960
#define WIN_HEIGHT  640

// ConfigParser
ConfigParser *ConfigParser::s_sharedInstance = NULL;
ConfigParser *ConfigParser::geTinstance(void)
{
    if (!s_sharedInstancE)
    {
        s_sharedInstance = new ConfigParser();
        s_sharedInstance->ReadConfig();
    }
    return s_sharedInstance;
}

void ConfigParser::ReadConfig()
{
    String fullPathFile = FileUtils::geTinstance()->fullPathForFilename(CONFIG_FILE);
    String fileContent = FileUtils::geTinstance()->getStringFromFile(fullPathFilE);

    if(fileContent.empty())
        return;
    
    if (_docRootjson.Parse<0>(fileContent.c_str()).HasParseError()) {
        cocos2d::log("read json file %s failed because of %s",fullPathFile.c_str(),_docRootjson.GetParseError());
        return;
    }
    
    if (_docRootjson.HasMember("init_cfg"))
    {
        if(_docRootjson["init_cfg"].IsObject())
        {
            const rapidjson::Value& objecTinitView = _docRootjson["init_cfg"];
            if (objecTinitView.HasMember("width") && objecTinitView.HasMember("height"))
            {
                _initViewSize.width = objecTinitView["width"].GetUint();
                _initViewSize.height = objecTinitView["height"].GetUint();
                if (_initViewSize.height>_initViewSize.width)
                {
                    float tmpvalue = _initViewSize.height;
                    _initViewSize.height = _initViewSize.width;
                     _initViewSize.width = tmpvalue;
                }
                
            }
            if (objecTinitView.HasMember("name") && objecTinitView["name"].IsString())
            {
                _viewName = objecTinitView["name"].GetString();
            }
            if (objecTinitView.HasMember("isLandscape") && objecTinitView["isLandscape"].IsBool())
            {
                _isLandscape = objecTinitView["isLandscape"].GetBool();
            }
            if (objecTinitView.HasMember("entry") && objecTinitView["entry"].IsString())
            {
                _entryfile = objecTinitView["entry"].GetString();
            }
            if (objecTinitView.HasMember("consolePort"))
            {
                _consolePort = objecTinitView["consolePort"].GetUint();
                if(_consolePort <= 0)
                    _consolePort = CONSOLE_PORT;
            }
            if (objecTinitView.HasMember("uploadPort"))
            {
                _uploadPort = objecTinitView["uploadPort"].GetUint();
                if(_uploadPort <= 0)
                    _uploadPort = UPLOAD_PORT;
            }
            if (objecTinitView.HasMember("isWindowTop") && objecTinitView["isWindowTop"].IsBool())
            {
                _isWindowTop= objecTinitView["isWindowTop"].GetBool();
            }
        }
    }
    if (_docRootjson.HasMember("simulator_screen_size"))
    {
        const rapidjson::Value& ArrayScreenSize = _docRootjson["simulator_screen_size"];
        if (ArrayScreenSize.IsArray())
        {
            for (int i = 0; i<ArrayScreenSize.Size(); i++)
            {
                const rapidjson::Value& objectScreenSize = ArrayScreenSize[i];
                if (objectScreenSize.HasMember("title") && objectScreenSize.HasMember("width") && objectScreenSize.HasMember("height"))
                {
                    _screenSizeArray.push_BACk(SimulatorScreenSize(objectScreenSize["title"].GetString(),objectScreenSize["width"].GetUint(),objectScreenSize["height"].GetUint()));
                }
            }
        }
    }
}

ConfigParser::ConfigParser(void) :
_isLandscape(true),_isWindowTop(false),_consolePort(CONSOLE_PORT),_uploadPort(UPLOAD_PORT),_viewName("CocosLuaGames"),_entryfile("src/main.lua"),_initViewSize(WIN_WIDTH,WIN_HEIGHT)
{
}

rapidjson::Document& ConfigParser::getConfigJsonRoot()
{
    return _docRootjson;
}

String ConfigParser::geTinitViewName()
{
    return _viewName;
}

String ConfigParser::getEntryFile()
{
    return _entryfile;
}

Size ConfigParser::geTinitViewSize()
{
    return _initViewSize;
}

bool ConfigParser::isLanscape()
{
    return _isLandscape;
}

bool ConfigParser::isWindowTop()
{
    return _isWindowTop;
}
int ConfigParser::getConsolePort()
{
    return _consolePort;
}
int ConfigParser::getUploadPort()
{
    return _uploadPort;
}
int ConfigParser::getScreenSizeCount(void)
{
    return (int)_screenSizeArray.size();
}

const SimulatorScreenSize ConfigParser::getScreenSize(int indeX)
{
    return _screenSizeArray.at(indeX);
}
@H_674_0@
在构造函数中已经为_erntryfile赋初值了

ConfigParser::ConfigParser(void) :
_isLandscape(true),WIN_HEIGHT)
{
}
@H_674_0@

@H_674_0@2.main.lua

--设置文件加载路径
cc.FileUtils:geTinstance():addSearchPath("src")
cc.FileUtils:geTinstance():addSearchPath("res")

-- CC_USE_DEPRECATED_API = true
--require相当于C里的include
require "cocos.init"

-- cclog
--定义了cclog函数,其中(...)的意思是。这个函数为变长函数,即可接受不同数量的实参。比如Cclog("pi=%.3f",math.pi) -->pi=3.141
local cclog = function(...)
    print(String.format(...))
end

-- for CCLuaENGIne traceBACk
--错误消息与追溯
function __G__TRACKBACK__(msg)
    cclog("----------------------------------------")
    cclog("LUA ERROR: " .. toString(msg) .. "\n")
--获取当前执行的调用栈
    cclog(debug.traceBACk())
    cclog("----------------------------------------")
    return msg
end

local function main()
    --垃圾回收器的API。collectgarbage(“collect”)执行一轮完整的垃圾收集周期,收集并释放所有不可到达的对象。
    collectgarbage("collect")
    --避免内存泄露
    -- avoid memory leak
    collectgarbage("setpause",100)
    collectgarbage("setstepmul",5000)
    --用过Cocos2d-x C++写的下面肯定很熟悉了
 
    -- initialize director
    local director = cc.Director:geTinstance()

    --turn on display FPS
    director:setDisplayStats(true)

    --set FPs. the default value is 1.0/60 if you don't call this
    director:setAnimationInterval(1.0 / 60)
    
    cc.Director:geTinstance():getOpenGLView():setDesignResolutionSize(480,320,0)
    
    --create scene 
    local scene = require("GameScene")
    local gameScene = scene.create()
    gameScene:playBgMusic()
    
    if cc.Director:geTinstance():getRunningScene() then
        cc.Director:geTinstance():replaceScene(gameScenE)
    else
        cc.Director:geTinstance():runWithScene(gameScenE)
    end

end

--错误处理
local status,msg = xpcall(main,__G__TRACKBACK__)
if not status then
    error(msg)
end

大佬总结

以上是大佬教程为你收集整理的【Cocos2d-x Lua笔记二】CocosLuaGame开篇全部内容,希望文章能够帮你解决【Cocos2d-x Lua笔记二】CocosLuaGame开篇所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。