zoukankan      html  css  js  c++  java
  • 基于Quick-cocos2d-x的资源更新方案 二

    写在前面


    又是12点半了,对于一个程序员来说,这是一个黄金时间,精力旺盛,我想,是最适合整理和分享一些思路的时候了。

    自从上次写了 基于Quick-cocos2d-x的资源更新方案

    同样可见quick-cocos2d-x官方论坛贴子:http://www.cocoachina.com/bbs/read.php?tid=209421&fpage=2

    一直觉得有些什么地方不对。思考了许久之后,发现对于framework和update自身模块的更新,是有一定的问题的。

    对于update自身模块的更新来说,检查是否有更新,若有更新,则使用require "main"重新来过。 是非常合理。

    而对于framework的更新,就不是那么容易了。 前一篇文章中,我提到若检查到framework有更新,则提示用户重启客户端,看似很不经意的操作,却给了用户思考要不要再次打开此游戏的机会。

    对于这种思考机会,我们是不能给用户的。 因此,无缝更新才是硬道理。

    BTW:目前我使用的是 quick-cocos2d-x 2.2.3rc 版本

    改进后的热更新流程


    在思索良久后,我发现对于update模块的实现,是完全可以脱离quick框架的。update模块所需要的scene,writablePath,md5file等功能,都不是quick提供的,仅仅是quick提供了一层封装。因此,我们可以使用纯cocos2d-lua的API来实现update模块。这样一来,framework.init就可以不在update模块里调用,那当我们在update中更新了framework模块时,我们完全不需要担心require重入问题。 因为在真正进入游戏前,我们的framework中的任何模块,都还没有被require过。

    由于每天晚上只有1多小时的编程时间,所以,这事儿我又花了好几天。其间也遇上了不少问题。

    我先来说说新版的更新流程

    在前一文章的基础上,我们修改前三个步骤

    1、从服务器取得update模块,与本地进行比较
    2、检查update的md5值,看是否有更新,如果有更新,则下载update.bin,重新载入,并退到main(退出之前,注意清除对某些的引用),再次重新进入
    3、如果本地update的值与服务器相同,表示update模块没有更新,则去下载文件列表 flist

    .....后面的步骤不变

    这样修改完毕后,我们就可以完全实现update模块的自更新,以及framework的自更新了。 整个过程不需要重新启动。

    主要问题与解决办法


    下面来说说这几天遇上的问题

    1、在ANDROID上读取APK内文件的MD5值

    由于CCCrypto::md5file是用fopen读取文件内容,再交给MD5计算器得出MD5值。 所以,在APK里是不可以的,后来,我把fopen改成了CCFileUtils::getFileData得到解决

    2、flist是一个LUA文件,如果处于APK中,则无法使用dofile,如果是从网上下载,也无法使用dofile

    为了保持兼容,在读取APK和执行网上下载来的flist时,我使用了loadstring(str)() 这样就解决了所有问题

    3、递归创建文件和清空文件夹

    一开始使用了os.execute来执行mkdir,rm等命令,但一但执行命令时控制台有输出,那整个LUA的LOG就乱了。 后来改为了lfs手工创建和遍历删除来解决。工作良好

    4、compile_scripts.bat打包

    我需要将update打一个包,main.lua不打包,其余的app和config.lua打一个包

    由于compile_script.bat是按文件夹进行模块剔除的,所以,我只好调整以下结构

    scripts
    
       +--launcher_src
    
           +--launcher.lua
    
       app
    
       +---MyApp
    
       +---config.lua
    
       +---scenes
    
     --main.lua

    可以看出,我将更新模块单独放入了一个文件夹,将config.lua移到了app下面。 差点忘了说,我的update模块,也是没有依赖config.lua的。

    这样,我就可以打出app和luancher两个包了,阳光七月的打包后缀是*.bin,我用了png,总之,这个后缀是无关紧要的,打包我写了两个脚本

    build_app.bat

    内容:%QUICK_COCOS2DX_ROOT%/bin/compile_scripts.bat -i scripts/app_src -p app -o res/app.png

    build_lchr.bat

    内容:%QUICK_COCOS2DX_ROOT%/bin/compile_scripts.bat -i scripts/lchr_src -p lchr -o res/lchr.png

    这样当我们想要运行程序的时候,只需要打包一下就可以了。

    F5实时刷新


    考虑到很多时候,我们改了代码就想直接按F5,不想去打包……。 这里有两个方案。

    一是处理一下PLAYER的F5事件,自动执行上面两个脚本。

    二是处理一下main.lua,使它支持打包和非打包模式,目前,我是通过修改main.lua来做的

    LOAD_FROM_BIN = true
    APP_NAME = "dota"
    APP_PACKAGE_ROOT = ""
    
     
    
    if LOAD_FROM_BIN then
        APP_PACKAGE_ROOT = "app"
        CCLuaLoadChunksFromZIP("res/lchr.png")
        package.loaded["lchr.launcher"] = nil
        require("lchr.launcher")
    else
        APP_PACKAGE_ROOT = "app_src"
        package.loaded["lchr_src.launcher"] = nil
        require("lchr_src.launcher")
    end

    让一切消散在风里


    写到这里,已经不知道自己还要说些什么了。虽然目前功能不够完善,但已经可以发码了。希望能够给大家一个参考。

    源码下载地址

  • 相关阅读:
    CDH 2、Cloudera Manager的安装
    204 01 Android 零基础入门 03 Java常用工具类 04 Java集合 04 Map集合 01 Map概述
    203 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 07 删除宠物猫信息数据(引入泛型知识点)
    202 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 06 查找宠物猫信息数据
    201 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 05 添加重复的宠物猫信息数据
    200 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 04 添加和显式宠物猫信息
    199 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 03 宠物猫信息管理概述
    198 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 02 案例:在集合中插入字符串
    197 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 01 Set概述
    196 01 Android 零基础入门 03 Java常用工具类 04 Java集合 02 List集合 05 案例:公告的删除和修改
  • 原文地址:https://www.cnblogs.com/qilinzi/p/3812929.html
Copyright © 2011-2022 走看看