在Corona SDK中使用子目录的方法

原创文章,转载请注明: 转载自All-iPad.net 本文链接地址: 在Corona SDK中使用子目录的方法

如果你在用Corona SDK,那你一定对他的代码和资源组织方式颇有微辞。所有的代码和资源文件必须全部放在工程的根目录下,如果只是写一个简单的sample还好,当要处理几个几十个关卡,管理成百上千的图片和音乐资源文件,还有一堆的lua脚本文件的时候,这简直就像是一场噩梦。

 

在模拟器上支持子目录,理由很简单,当需要使用Corona的服务器来编译app时,只会将工程根目录下的文件发到服务器上去编译。很奇怪的是这个问题在很早的时候就被开发者所诟病,但是Corona开发者一直没有试图去改进。当然,在第三方工具Project Manager里面倒是提供了分类管理的功能,而且最新的Corona安装文件将30天试用期的Project Manager也包含在了里面。如果把这最基本的功能也作为一项服务来卖的话,实在是有点无语!

 

好了,抱怨的话多说无益,还是看看如何来解决这个问题吧。

 

在Code Exchange上终于有人提供了一个解决方案,Subfolders for Lua, audio, xml and other files. Keep sanity,7月17日由Lerg提供。

 

解决的方法也比较巧妙,在模拟器上开发时按照你希望的目录结构来进行,当需要提交到Corona Server去编译的时候使用脚本生成build目录,按照Corona的要求把代码和资源都放在这一个目录下。当然,因为lua代码编写的时候是分目录的,所以对于require方法也需要做一点修改,只需要把原来的xxx/xxx/xxx替换为xxx_xxx_xxx即可,很简单,但却非常的实用。

 

build目录生成的脚本使用python编写,代码如下:

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
prepare_build.py

Tool for keeping Lua and other files in subfolders

Author: Lerg
Release date: 2011-07-18
Version: 1.0
License: MIT

USAGE:
    Modify original_path and build_path to your needs and then simply run in a
    command line:
    python prepare_build.py
    You must be in the parent folder of your game's folder.
    Filenames extensions which are moved are defined in a list below.

I can be found on the corona IRC channel.
"""

original_path = 'your_app_folder'
build_path = 'build/'

import os, shutil

if os.path.isdir(build_path):
    shutil.rmtree(build_path)
os.mkdir(build_path)
for root, dirs, files in os.walk(original_path):
    for file in files:
        if file[0] != '.':
            filename = os.path.join(root, file)
            inner = filename.split('/', 1)[1]
            ext = filename.rsplit('.', 1)
            if len(ext) == 2 and ext[1] in ['lua', 'mp3', 'wav', 'xml']:  # <- put other extensions here
                inner = inner.replace('/', '_')
            outfilename = build_path + inner
            os.path.dirname(outfilename)
            dir = os.path.dirname(outfilename)
            if not os.path.isdir(dir):
                os.makedirs(dir)
            shutil.copyfile(filename, outfilename)

require方法的修改只需要在main.lua中定义即可,在main.lua的最前面定义自己的require方法,如下:

-- Override require
if system.getInfo('environment') ~= 'simulator' then
    local old_require = _G.require
    _G.require = function (path)
        local path = path:gsub('/', '_')
        return old_require(path)
    end
    isSimulator = false
else
    isSimulator = true
end

 

同样的,在所有加载资源文件的地方也需要采用类似的方法:

 

if not isSimulator then
    filename = filename:gsub('/', '_')
end

 

也就是把文件名做一次转换。

原文地址:http://developer.anscamobile.com/code/subfolders-lua-audio-xml-and-other-files-keep-sanity

原创文章,转载请注明: 转载自All-iPad.net

本文链接地址: 在Corona SDK中使用子目录的方法

你可能感兴趣的:(在Corona SDK中使用子目录的方法)