Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用cocos2d-x v3.1开发小游戏(基本框架) #65

Open
hanxi opened this issue Feb 24, 2021 · 0 comments
Open

使用cocos2d-x v3.1开发小游戏(基本框架) #65

hanxi opened this issue Feb 24, 2021 · 0 comments

Comments

@hanxi
Copy link
Owner

hanxi commented Feb 24, 2021

小游戏的组成

  • 欢迎界面

在游戏资源未全部加载完之前就需要载入,避免进入游戏会有一段黑屏时间。

可以用来展示游戏名称或者开发者logo。

  • 开始菜单界面

一般用于显示游戏名称和关卡选择(或者称游戏难度选择)。

可以外加一些设置性功能,如声音开关,帮助入口等等。

如果游戏设置内容较多可以把设置作为一个单独界面,在开始菜单上提供入口即可。

有的小游戏是以弹窗方式的菜单

  • 主游戏界面

游戏的中心部分,比如2048游戏的格子滑动界面,扫雷游戏的扫雷界面,贪吃蛇游戏的蛇移动的界面,等等。

小游戏拥有这一个界面也能算一个小游戏,但是没有其他界面会使游戏缺少更多选择。

游戏的主要逻辑都是在完成这个界面。

  • 游戏结束界面

游戏结束一般都会有个分数,用于展示本次游戏得分和历史最高得分对比。

在这个界面上可以添加再玩一次的按钮,让玩家重新玩一次。

大多数小游戏都是以弹窗的方式展示游戏结果。

  • 排行榜界面 (可选)

游戏中有分数这个概念就会有排名。

可以是单机的排行榜,也可以是联机的排行榜(需要服务器保存数据)。

排行榜可以促进玩家拿到更高的分数(也是有缺点的,看到其他玩家玩的分数太高了而放弃了)。

cocos2d-x v3.1 lua 框架的使用

  • lua代码结构

src
├── conf.lua                  # 配置文件,一些不变的配置保存在这里
├── GameOverScene.lua         # 游戏结束的界面
├── GameScene.lua             # 游戏主逻辑界面
├── HelloScene.lua            # 欢迎界面,在这里做资源更新检测
├── main.lua                  # 游戏lua脚本的入口
├── MainMenuScene.lua         # 游戏主菜单界面
├── RankScene.lua             # 排行榜界面
└── util.lua                  # 通用功能函数实现

每个XXOOScene.lua 文件的样子如下:

local XXOOScene = {}

XXOOScene.newScene = function ()
    local scene = cc.Scene:create()
    -- do other XXOO things
    return scene
end

return XXOOScene

关于Scene界面跳转,在util中封装一个通用函数用于界面跳转。

function util.toScene(scene)
    -- 增加一个统一的界面跳转动画
    scene = cc.TransitionSlideInR:create(0.5, scene)
    if cc.Director:getInstance():getRunningScene() then
        cc.Director:getInstance():replaceScene(scene)
    else
        cc.Director:getInstance():runWithScene(scene)
    end
end

main.lua用户进入HelloScene界面

HelloScene = require("src/HelloScene")
 
local function main()
    cc.FileUtils:getInstance():addSearchResolutionsOrder("src")
    cc.FileUtils:getInstance():addSearchResolutionsOrder("res")
 
    HelloScene.newScene()
end
 
 
local status, msg = xpcall(main, __G__TRACKBACK__)
if not status then
    error(msg)
end
  • 游戏启动logo的Scene特殊处理

因为加载lua资源需要时间,待所有资源都加载完再创建游戏启动界面会出现启动的时候黑屏。我在1G的安卓机上测试需要5秒才能进入到lua创建的Scene。

解决方案:在 C++ 中创建启动画面,HelloScene.lua中不做创建Scene的操作,直接getRunningScene。

AppDelegate::applicationDidFinishLaunching () {

    // ... other xxoo things

    auto scene = Scene::create();
    auto s = Director::getInstance()->getWinSize();
    auto layer = LayerColor::create(Color4B(255, 255, 255, 255), s.width, s.height);
    auto logo = Sprite::create("res/logo.png");
    layer->addChild(logo);
    logo->setPosition(Vec2(s.width*0.5,s.height*0.7));
    scene->addChild(layer,0);
    director->runWithScene(scene);
 
    // 特殊处理,延迟加载lua(创建好logoScene再加载)
    auto action = CallFunc::create(startLua);
    layer->runAction(action);

    return true;
}
  • cocos2d-x v3.1 引擎的精简

起因: 引擎编译完之后发现lib文件相比2.x版本的大了不少。由于是做小游戏,一般都会有用不到的引擎部分,比我我就没用到ui编辑器,所以就想办法不编译ui编辑器部分。

步骤:

  • 找到mk文件: $ find . -name "Android.mk"
  • 修改mk文件,把与ui编辑器相关的语句注释掉。
  • 编译,在编译错误提示中找出还有什么需要注释的代码。我遇到的问题主要是CCB那些。需要在lua_cocos2dx_extension_manual.cpp中把CCB的代码注释。
  • CCLuaStack.cpp中也需要注释几个注册函数。

我还精简了物理引擎,刚开始是用到了的,但后面看小游戏用不上就把它也干掉了(大概省下1M)。

  • cocos/scripting/lua-bindings/auto/ 下的文件生成

看README后执行生成命令,遇到了一些问题:

  • 问题1:官方只提供ubuntu 64位的libclang.so文件,在32位机子上跑会报下面这个错误

  • LibclangError: libclang.so: wrong ELF class: ELFCLASS64. To provide a path to libclang use Config.set_library_path() or Config.set_library_file().
  • 解决方法:在llvm官网下载4.3版本的llvm和clang。编译生成libclang.so.3.4。拷贝到bindings-generator/libclang/下覆盖libclang.so文件。怎么编译的那个博客现在找不到了,步骤大概是:
  • clang-3.4.src.tar.gz 和 llvm-3.4.src.tar.gz 。解压,然后把clang目录拷贝到llvm-3.4/tools/下。编译,在llvm-3.4同一个目录下建一个build文件夹,进入到build,执行cmake ../llvm-3.4/CMakeLists.txt

文字描述可能不清晰,目录结构如下:

. -> build
| ->llvm-3.4  -> tools -> clang -> CMakeLists.txt 
             |-> CMakeLists.txt
  • 问题2: 找不到头文件,报错出现unkown type name ,原因是官方配置的android_headers路径和我电脑上的不一样,主要是gcc的版本,我的是4.8的,官方配置是4.7。如下:

  • details = "unknown type name '__locale_t'"
  • 解决方法:修改cocos2dx.ini中的android_headers 的值把/cxx-stl/gnu-libstdc++/4.7/ 改成/cxx-stl/gnu-libstdc++/4.8/ 。有两个地方要修改。这个问题要看自己的安卓ndk的配置情况,也许你的还是4.6呢,自己可以去ndk对应的路径下找找看自己的ndk版本。
@hanxi hanxi changed the title 【旧博客迁移】使用cocos2d-x v3.1开发小游戏(基本框架) 使用cocos2d-x v3.1开发小游戏(基本框架) Aug 10, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant