Cocos2d-x 资源头文件生成脚本

前端之家收集整理的这篇文章主要介绍了Cocos2d-x 资源头文件生成脚本前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Cocos2d-x 资源头文件生成脚本


1、简述

近来在学习 Cocos2d-x,在资源管理这一块,因为在代码中使用资源的话,要手动输入文件名,管理起来比较麻烦,也有可能写错。所以写了一个脚本来自动生成资源文件名称 .h 文件,在项目中使用。

比如, 一个普通的 Cocos2d-x 项目的文件夹如下:

我们希望脚本层层遍历 Resources 文件夹下的目录和文件,用目录名做 C++ 的 namespace 名称,用文件名做 C++ 资源变量名。将目录结构按 C++ 代码的方式映射到 Classes/Resources.h 文件中。

比如,按上图,我们生成Resources.h 文件为:

  1. #pragma once
  2.  
  3. namespace res {
  4.  
  5. const char* const background = "background.png";
  6.  
  7. namespace fonts {
  8. const char* const Consolas = "Consolas.ttf";
  9. }
  10. }

2、脚本内容

脚本逻辑也非常简单,用一个递归算法层层遍历文件夹即可,遇到特殊字符的时候,要进行额外处理,确保生成的变量名符合 C++ 的变量名命名规则——这里我将特殊字符替换为了下划线 “_”。具体代码如下:

  1. #!/usr/bin/env python
  2. #-*-conding:utf8-*-
  3. #
  4. # @author arnozhang
  5. # @date 2015.11.02
  6. # @email zyfgood12@163.com
  7.  
  8. import sys;
  9. import os;
  10.  
  11.  
  12. def name_2_var_name(name,full_name = False):
  13. result = ''
  14.  
  15. if not full_name:
  16. pos = name.rfind('.')
  17. if pos >= 0:
  18. name = name[0:pos]
  19.  
  20. if len(name) <= 0:
  21. return name
  22.  
  23. for ch in name:
  24. is_digit = ch >= '0' and ch <= '9'
  25. is_underline = ch == '_'
  26. is_upper = ch >= 'A' and ch <= 'Z'
  27. is_lower = ch >= 'a' and ch <= 'z'
  28.  
  29. if not (is_digit or is_underline or is_upper or is_lower):
  30. ch = '_'
  31. result += ch
  32.  
  33. first = result[0]
  34. if first >= '0' and first <= '9':
  35. result = '_' + result
  36.  
  37. return result
  38.  
  39.  
  40.  
  41. def handle_path(file,path,res_path,namespace,indent):
  42. list = os.listdir(path)
  43. path_list = []
  44. for node in list:
  45. sub_file = path + node
  46. insert_pos = 0
  47. if os.path.isdir(sub_file):
  48. path_list.append(node)
  49. else:
  50. path_list.insert(insert_pos,node)
  51. ++insert_pos
  52.  
  53. indent_str = ''.join([' ' for i in range(indent * 4)])
  54. namespace_indent_str = ''
  55. if indent > 1:
  56. namespace_indent_str = ''.join([' ' for i in range((indent - 1)* 4)])
  57.  
  58. file.write('\n\n')
  59. file.write(namespace_indent_str)
  60. file.write('namespace ' + namespace + ' {\n\n')
  61.  
  62. name_list = []
  63.  
  64. for node in path_list:
  65. sub_file = path + node
  66. name = name_2_var_name(node)
  67. if len(name) == 0:
  68. continue
  69.  
  70. if name in name_list:
  71. name = name_2_var_name(node,full_name = True)
  72.  
  73. name_list.append(name)
  74. if os.path.isdir(sub_file):
  75. sub_res_path = name
  76. if len(res_path) > 0:
  77. sub_res_path = res_path + '/' + name
  78.  
  79. handle_path(file,sub_file + '/',sub_res_path,name,indent + 1)
  80. else:
  81. res_file_path = node
  82. if len(res_path) > 0:
  83. res_file_path = res_path + '/' + node
  84.  
  85. generate_res_content(file,res_file_path,indent_str)
  86.  
  87. file.write(namespace_indent_str)
  88. file.write('}\n')
  89.  
  90.  
  91. def generate_res_content(file,indent_str):
  92. file.write(indent_str)
  93. file.write('static const char* const ' + name + ' = "' + res_file_path + '";\n')
  94.  
  95.  
  96. if __name__ == '__main__':
  97. file = open('./Classes/Resources.h',mode = 'w')
  98. file.write('#pragma once\n')
  99.  
  100. handle_path(file,'./Resources/','','res',1)
  101. file.close()

3、示例

比如,我们有一个项目的 Resources 文件如下组织:

我们运行 python 脚本后,生成Classes/Resources.h 文件如下:

  1. #pragma once
  2.  
  3.  
  4. namespace res {
  5.  
  6. const char* const loading = "loading.png";
  7. const char* const HelloWorld = "HelloWorld.png";
  8. const char* const CloseSelected = "CloseSelected.png";
  9. const char* const CloseNormal = "CloseNormal.png";
  10.  
  11.  
  12. namespace fonts {
  13.  
  14. const char* const Marker_Felt = "fonts/Marker Felt.ttf";
  15. const char* const arial = "fonts/arial.ttf";
  16. }
  17.  
  18.  
  19. namespace res {
  20.  
  21. }
  22. }

以上。

猜你在找的Cocos2d-x相关文章