本文主要是介绍00003 不思议迷宫.0010.1.1:csb解析显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
00003 不思议迷宫.0010.1.1:csb解析显示
游戏的csb文件在最新版的cocos2dx中无法直接使用(格式不对,无法解析)。在反编译libcocos2dlua.so中,查看cocos2dVersion函数:
const char*__fastcall cocos2d::cocos2dVersion(cocos2d *this)
{
return "cocos2d-x3.3rc0";
}
它清楚地告诉我们,游戏是用cocos2d-x 3.3rc0开发的。
于是我就想办法下载cocos2d-x 3.3rc0。我先是从网上找,无果。后来突然发现自己实在是犯傻,因为cocos2dx是个开源项目,在github上有现成的,各个版本都有。于是就去github上下载了3.3rc0。但下载下来的压缩包只有50多M,解压后也只有100多M,一些东西都不全。仔细看了一下,原来还需要运行一下download-deps.py。然而运行后,在安装第二个依赖项时出错,报什么什么“cocos-binary-for-code-ide-3-lua-runtime-1.5” not a directory。同时,在cocos2d-x 3.3rc0的目录下发现一个deprecated-cocos-binary-for-code-ide-3-lua-runtime-1.5文件夹。原来是文件名不匹配。我以为改个名字就好,结果还不行。那我就手动安装吧。打开download-deps.py,看看相关的代码:
print("==> Prepare to download luaruntime binaries")
runtime_path =os.path.join(workpath, 'templates', 'lua-template-runtime', 'runtime')
installer = CocosZipInstaller(workpath, os.path.join(runtime_path,'config.json'), os.path.join(runtime_path, 'version.json'))
installer.run(workpath, runtime_path, opts.remove_downloaded,opts.force_update, opts.download_only)
安装到runtime_path这个目录。于是就把deprecated-cocos-binary-for-code-ide-3-lua-runtime-1.5下的内容剪切到cocos2d-x 3.3rc0/ templates/lua-template-runtime/runtime目录下,搞定。
接下来执行setup.py。结果发现搜索到的环境变量和已安装的cocos2dx有冲突,没敢继续,那就不执行了,不用cocos命令行创建工程了,改为自己手动拷贝。
建立起工程,执行,然后——解析错误。有点莫名其妙(现在想想,可能是中间某个步骤操作失误),又换成3.3rc1试了一下,发现终于可以了:
一些东西显示得不对,还需要调一调。先看看游戏是怎么弄的:
……
local frameWidth =cc.Director:getInstance():getOpenGLView():getFrameSize().width;
local frameHeight =cc.Director:getInstance():getOpenGLView():getFrameSize().height;
-- 布局不使用缩放,而是代码自行实现自适应布局
local w = frameWidth;
local h =frameHeight;
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(w, h,0);
……
function applicationScreenSizeChanged(width, height)
……
local oldSize= cc.Director:getInstance():getOpenGLView():getFrameSize();
ifoldSize.width ~= width or oldSize.height ~= height then
……
localsize = cc.Director:getInstance():getOpenGLView():getDesignResolutionSize();
cc.Director:getInstance():getOpenGLView():setFrameSize(width, height);
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(size.width,size.height, 0);
cc.Director:getInstance():setViewport();
end
end
无论如何,DesignResolutionSize是保持不变的,为OpenGLView的初始FrameSize。示例中的位置该如何调整呢?还是先看看官方是怎么弄的:
functionUIDungeonMain:ctor(levelData, floor)
……
local node =cc.CSLoader:createNode("layout/dungeon/DungeonMain.csb");
self:addChild(node);
……
self.panel = findChildByName(node,"CT1/panel");
self.attackLabel =findChildByName(self.node, "CT2/atk_val");
self.magicLabel =findChildByName(self.node, "CT2/magic_val");
self.hpLabel = findChildByName(self.node,"CT2/hp_val");
self.mpLabel = findChildByName(self.node,"CT2/mp_val");
self.specialImage =findChildByName(self.node, "CT2/specil");
self.gainImage = findChildByName(self.node,"CT2/gain");
self.debuffsImage =findChildByName(self.node, "CT2/debuffs");
……
resize(node);
……
end
resize这个函数很可能就是重点了:
-- 适配
resize = function(node)
local w =AlignM.frameSize.width;
local h =AlignM.frameSize.height;
node:setContentSize(w, h);
local scale;
if h / w> 1.5 then
scale =w / (DESIGN_WIDTH);
else
-- 在宽高比小于等于1.5时(如iphone或ipad),需要略微比预定比例缩小些。 所以加了75像素
scale =h / (DESIGN_HEIGHT + 75);
end
local topBg= findChildByName(node, "CT1/top_bg");
localbottomBg = findChildByName(node, "CT1/bottom_bg");
local mask =findChildByName(node, "CT1/mask");
localnewWidth = w / scale;
topBg:setScaleX(newWidth/topBg:getContentSize().width);
bottomBg:setScaleX(newWidth/bottomBg:getContentSize().width);
topBg:setScaleY(topBg:getScaleY());
bottomBg:setScaleY(bottomBg:getScaleY());
mask:setScaleX(newWidth/mask:getContentSize().width);
local ct1 =findChildByName(node, "CT1");
ct1:setPosition(w / 2, h / 2);
ct1:setScale(scale);
localscale2;
if h / w>= 1.5 then
scale2 =w / (DESIGN_WIDTH);
else
scale2 =h / (DESIGN_HEIGHT);
end
-- 底部菜单按原来适配规则缩放
local ct2 =findChildByName(node, "CT2");
ct2:setPosition(w / 2, 0);
ct2:setScale(scale2);
……
end
AlignM.frameSize是什么?
frameSize =cc.Director:getInstance():getOpenGLView():getFrameSize();
DESIGN_WIDTH、DESIGN_HEIGHT是什么?
DESIGN_WIDTH = 640;
DESIGN_HEIGHT = 960;
我想在我的cocos2dx-cpp工程中完美重现游戏的画面,于是我试图将lua代码转换成c++代码。在这么干了小半天之后,我就发现自己傻逼了:放着好好的lua代码不用,干嘛还转换成C++?
如果没有额外的C++代码,或者有但很方便还原,甚至可以还原全部开发环境,进行重新打包,在AppStore上架。我就试了试:重建cocos2dx-lua工程,拷贝资源和lua代码,执行后断断续续地出现一个问题。
1. [LUA ERROR] [string" core/module/EventMgr.luac "]:19: attempt to call global 'get_daemon_data' (a nil value):get_daemon_data这个函数其实已经定义,在core/base/DaemonData.luac中。于是在EventMgr.luac中添加:require "core/base/DaemonData"。
2. [LUA ERROR] [string"core/base/File.luac"]:5: module 'lfs' not found:cocos2dx 3.3rc1居然没有集成lfs。郁闷之余只好自己安装。到https://github.com/keplerproject/luafilesystem下载源码,将src目录下的lfs.h和lfs.c这两个文件拷贝到工程目录下的/frameworks/runtime-src/Classes中(当然,拷贝到其他的目录中也可以,比如/frameworks/cocos2d-x/下的某个。不过,这样的话,如果使用的是预编译库,就需要重新生成liblua.a等)。将lfs.h和lfs.c添加到工程,打开lua_module_register.h,作如下更改:
添加:#include "lfs.h"
在函数int lua_module_register(lua_State* L)中添加:
lua_getglobal(L, "package");
lua_getfield(L, -1
这篇关于00003 不思议迷宫.0010.1.1:csb解析显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!