当前位置: 首页 > news >正文

cocosstudio工程文件(.ccs)维护问题

创建cocos工程.bat在多人合作的cocos项目中,大家公用一个ccs文件,存在的问题是如果大家都提交ccs文件比较容易出现冲突,解决冲突麻烦要耗费时间,不提交的话就拉不到其他人更新的csd文件

方案一  解决冲突,更新提交ccs文件

这种方案也可以说没有方案,容易造成开发人员不愿意提交自己的ccs文件

方案二 每个人拷贝一个ccs文件自己用

这种方案比较简单粗暴,缺点是要看别人的csd文件需要打开别人的工程

方案三 ccs文件不进行维护,由脚本生成

先说工作流,当需要看别人的csd的时候

1.更新svn(假如版控用svn)

2.执行脚本

CreateCocosProject.py,注意读者需要根据脚本存放位置适当修改文件

#!/usr/bin/python
# -*- coding: utf-8 -*-import os, shutil, re, sys
import xml.etree.ElementTree as ET
from xml.dom import minidomSCRIPT_PATH = os.path.dirname(os.path.realpath(__file__))COCOS_PATH = os.path.realpath(os.path.join(SCRIPT_PATH, "..", "cocosstudio"))
PROJECT_NAME = sys.argv[1]# COCOS_INCLUDE_DIRS = {"res":True, "csb":True, "preview":True}
# COCOS_UNINCLUDE_DIRS = {"res/csb":True, "res/spine":True, "res/chatEmoji":True}
OUT_PATH = os.path.realpath(os.path.join(COCOS_PATH, "..",PROJECT_NAME))# 获取csd文件类型
def GetCsdFileType(csdPath):print(csdPath)tree = ET.parse(csdPath)propertyGroupNode = tree.getroot().find("./PropertyGroup")attrib = propertyGroupNode.attribreturn attrib["Type"]#创建一个工程节点
def CreateProjectNode(csdPath):e = ET.Element("Project")csdType = GetCsdFileType(csdPath)csdName = os.path.basename(csdPath)e.set("Type", csdType)e.set("Name", csdName)return e#获取plsit文件frames
def GetPlistFrames(plistPath):tree = ET.parse(plistPath)rootDict = tree.getroot().find("dict")frames = []dictList = list(rootDict)sizeStr = ""for i in range(0, len(dictList), 2):node1 = dictList[i]node2 = dictList[i+1]if node1.text == "frames":framesNodes = node2.findall("./key")for frameNameNode in framesNodes:frames.append(frameNameNode.text)return framesdef CreatePListNode(plistPath):e = ET.Element("PlistImageFolder")plistName = os.path.basename(plistPath)plistBaseName = os.path.splitext(plistName)[0]e.set("PListFile", plistName)e.set("Name", ".%s_PList.Dir" % plistBaseName)# 添加子节点frames = GetPlistFrames(plistPath)for frame in frames:childE = ET.Element("PlistImageFile")childE.set("Name", frame)childE.set("Key", frame)e.append(childE)return edef CreateFolderNode(folderName):e = ET.Element("Folder")e.set("Name", folderName)return edef CreateNode(tag, filePath):e = ET.Element(tag)eBaseName = os.path.basename(filePath)e.set("Name", eBaseName)return e
def CreateCsiNode(csiName):eBaseName = os.path.basename(csiName)e = ET.Element("PlistInfo")eBaseName = os.path.basename(csiName)e.set("Name", eBaseName)e.set("Type", "Plist")return ezh_pattern = re.compile(u'[\u4e00-\u9fa5]+')
def contain_zh(word):if word.find(" ") != -1:print(u"Error:发现空格")print(word)return Truetry:word = word.encode("utf-8")global zh_patternmatch = zh_pattern.search(word)return matchexcept UnicodeError:print(u"Error:发现中文")print(word)return Truereturn matchdef CreateHead():Solution = ET.Element("Solution")PropertyGroup = ET.Element("PropertyGroup", {"Name":"CocosProject", "Type":"CocosStudio", "Version":"3.10.0.0"})SolutionFolder = ET.Element("SolutionFolder")Group = ET.Element("Group", {"ctype":"ResourceGroup"})RootFolder = ET.Element("RootFolder", {"Name":"."})Solution.append(PropertyGroup)Solution.append(SolutionFolder)SolutionFolder.append(Group)Group.append(RootFolder)return Solution, RootFolderdef checkCanAdd(dirName):# if dirName.find(".svn") != -1:#     return False# p = dirName[len(COCOS_PATH) + 1:]# p = p.replace(os.path.sep, "/")# for k in COCOS_INCLUDE_DIRS:#     if re.match(r"^%s.*"%k, p):#         for j in COCOS_UNINCLUDE_DIRS:#             if re.match(r"^%s.*"%j, p):#                 return False#         return Truereturn Truedef TraversalDir(dirPath):rootNode, rootFolderNode = CreateHead()nodeDict = {}nodeDict[""] = rootNodeindex = 0for root, dirs, files in os.walk(dirPath):if not checkCanAdd(root):continueif re.match(r'.*_PList.Dir.*', root):continueif contain_zh(root):exit(-1)tempFolderPath = root[len(COCOS_PATH) + 1:]rIndex = tempFolderPath.rfind(os.path.sep)folderNode = NonedirName = NonedirKey = Noneif -1 != rIndex:dirName = tempFolderPath[rIndex+1:]dirKey = tempFolderPath[0:rIndex]parentNode = nodeDict[dirKey]folderNode = CreateFolderNode(dirName)parentNode.append(folderNode)nodeDict[tempFolderPath] = folderNodeelif tempFolderPath == "":folderNode = rootFolderNodeelse:folderNode = CreateFolderNode(tempFolderPath)nodeDict[tempFolderPath] = folderNoderootFolderNode.append(folderNode)for file in files:if contain_zh(os.path.join(root, file)):exit(-1)childNode = Noneext = os.path.splitext(file)if len(ext) == 2 :extName = ext[1].lower()if extName == ".png" or extName == ".jpg":if not os.path.exists(os.path.join(root, ext[0]+".plist")):childNode = CreateNode("Image", file)elif extName == ".mp3":childNode = CreateNode("Audio", file)elif extName == ".ttf":childNode = CreateNode("TTF", file)elif extName == ".fnt":childNode = CreateNode("Fnt", file)elif extName == ".csd":fullCsdPath = os.path.join(root, file)childNode = CreateProjectNode(fullCsdPath)elif extName == ".csi":childNode = CreateCsiNode(file)elif extName == ".plist":if root.find("particle") != -1:childNode = CreateNode("PlistParticleFile", file)   else:if os.path.exists(os.path.join(root, ext[0]+".png")):fullPlistPath = os.path.join(root, file)childNode = CreatePListNode(fullPlistPath)if childNode is not None:folderNode.append(childNode)# tree.write(OUT_PATH)# strArr = PrettyDumpXml(rootNode, 0)# rootNode.write(OUT_PATH)# print(list(rootFolderNode))# for node in list(rootFolderNode):#     print(node.attrib)pFile = open(OUT_PATH, "w")pFile.write(ET.tostring(rootNode))pFile.close()def rewriteXml():doc_xml = minidom.parse(OUT_PATH)pFile = open(OUT_PATH, "w")doc_xml.writexml(pFile, "\t", "\t", "\n", "utf-8")pFile.close()TraversalDir(COCOS_PATH)
rewriteXml()

创建cocos工程.bat

@echo off
set dir=%~dp0
cd %dir%scripts
echo %dir%scripts
python CreateCocosProject.py game_ui_edit.ccs
pause
http://www.lryc.cn/news/343594.html

相关文章:

  • Blender动画与云渲染:创造高质量作品的未来路径
  • 【MySQL】3.MySQL核心概念解析:数据完整性、事务处理、索引及聚簇索引与非聚簇索引
  • 【netty系列-03】深入理解NIO的基本原理和底层实现(详解)
  • 大数据Scala教程从入门到精通第二篇:Scala入门
  • Spring Data JPA数据批量插入、批量更新真的用对了吗
  • 数据结构-线性表-应用题-2.2-12
  • 目录页码右对齐快速解决
  • 分红76.39亿,分红率再创新高,成长活力无限的伊利带来丰厚回报
  • 关于行进线路。
  • Unity 编辑器工具 - 资源引用查找器
  • MySQL中的批量更新实战
  • 为软件教学文档增加实践能力
  • 39-2 Web应用防火墙 - WAF数据库层绕过
  • 薪酬激励策略:留住企业核心人才的关键
  • 【bbs02补】注册功能form组件-前端-后端-总结、登录功能(前端、后端、生成验证码)
  • MindSponge分子动力学模拟——定义一个分子系统
  • unity想让方法带一个默认参数怎么写
  • 从零开始的软件测试学习之旅(六)测试网络基础知识
  • NSS题目练习
  • Springboot+vue项目零食销售商城
  • cesium 雷达遮罩(电弧球效果)
  • W801学习笔记二十三:语文和英语学习应用的代码汇总
  • 安卓LayoutParams浅析
  • UltralSO制作启动盘时报错:磁盘/映像容量太小解决办法
  • 2024-05-09四月初二周四
  • 【微服务】springcloud整合dubbo3使用nacos作为注册中心
  • php中常用的数据类型汇总
  • 【源码阅读】Golang中的go-sql-driver库源码探究
  • 2024-05-08 postgres-火山模型-执行-记录
  • QT5带UI的常用控件