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相关文章:
cocosstudio工程文件(.ccs)维护问题
创建cocos工程.bat在多人合作的cocos项目中,大家公用一个ccs文件,存在的问题是如果大家都提交ccs文件比较容易出现冲突,解决冲突麻烦要耗费时间,不提交的话就拉不到其他人更新的csd文件。 方案一 解决冲突,更新提交c…...
Blender动画与云渲染:创造高质量作品的未来路径
Blender作为开源的3D图形软件,在多个领域广受欢迎。但随着项目复杂度提升,传统渲染方式受限。云渲染技术的兴起突破了这些限制,为创作者提供了更自由、高效的创作环境。 一、Blender动画项目的挑战 传统上,Blender动画渲染需要依…...
【MySQL】3.MySQL核心概念解析:数据完整性、事务处理、索引及聚簇索引与非聚簇索引
探索MySQL的内部机制,理解数据完整性、事务处理、索引策略以及聚簇索引与非聚簇索引的区别是至关重要的。这些概念构成了数据库设计和优化的基础,对于确保数据的准确性、提高查询效率、维护数据的一致性和实现复杂的数据库操作至关重要。本文将逐一剖析这…...
【netty系列-03】深入理解NIO的基本原理和底层实现(详解)
Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…...
大数据Scala教程从入门到精通第二篇:Scala入门
一:Scala入门 1:为什么学习Scala Spark新一代内存级大数据计算框架,是大数据的重要内容 Spark就是使用Scala编写的。因此为了更好的学习Spark,需要掌握Scala这门语言 Spark的兴起,带动Scala语言的发展! 2:Scala的发展…...
Spring Data JPA数据批量插入、批量更新真的用对了吗
Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 前言 在前两篇文章已经…...
数据结构-线性表-应用题-2.2-12
1)算法的基本设计思想:依次扫描数组的每一个元素,将第一个遇到的整数num保存到c中,count记为1,若遇到的下一个整数还是等于num,count,否则count--,当计数减到0时,将遇到的下一个整数保存到c中,计…...
目录页码右对齐快速解决
选择目录–段落–制表符,按图中设置即可...
分红76.39亿,分红率再创新高,成长活力无限的伊利带来丰厚回报
伊利47万股东,又等来了一个好消息。 4月29日,伊利股份发布2023年报,实现营业总收入1261.79亿元,归母净利润104.29亿元,双创历史新高,实现连续31年稳健增长。 在递交亮眼成绩单的同时,乳业巨头伊…...
关于行进线路。
https://map.tianditu.gov.cn/ 作者:Chockhugh 链接:https://www.zhihu.com/question/20545559/answer/494685117 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 以50km,几乎全是…...
Unity 编辑器工具 - 资源引用查找器
目录 1.功能概述 2.完整代码 3. 实现原理 4. 使用预览 5.新增优化版本 在Unity项目开发过程中,管理和维护资源之间的引用关系是至关重要的。当然我们项目也是需要这个功能 毕竟项目大了之后查找资源引用还是交给 资源引用查找器 比较好。 1.功能概述 资源引用…...
MySQL中的批量更新实战
MySQL中的批量更新实战 表结构 mysql> desc dept; --------------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------------- | deptno | int(11) …...
为软件教学文档增加实践能力
为了更方便软件教学,我们在凌鲨(OpenLinkSaas)上增加了公共资源引用的功能。 目前可以被引用的公共资源: 微应用常用软件公共知识库Docker模板 引用公共资源 引用微应用 目前微应用包含了主流数据库,终端等工具,可以方便的进行各种相关实…...
39-2 Web应用防火墙 - WAF数据库层绕过
如果你本地没有安装mysql就先安装一下:4-2 MySQL 的下载与安装_mysql5.7.9.1下载-CSDN博客 一、数据库层绕过简介 绕过数据库层通常用于规避Web应用防火墙(WAF)的SQL注入防护规则。攻击者需要利用数据库特性,寻找规避常规安全策略的方法。这里涉及到不同数据库的特性、SQ…...
薪酬激励策略:留住企业核心人才的关键
在竞争激烈的商业环境中,企业为了保持竞争力和市场地位,必须高度重视人才的管理和发展。企业的核心人才是推动企业发展的关键因素,因此,如何有效地激励和留住这些核心人才,成为企业持续发展的关键之一。薪酬激励策略作…...
【bbs02补】注册功能form组件-前端-后端-总结、登录功能(前端、后端、生成验证码)
1 注册功能 1.1 注册功能form组件 1.2 注册功能前端 1.3 注册功能后端 1.4 forms组件和前后端总结 2 登录功能 2.1 登录前端 2.2 生成验证码 1 注册功能 1.1 注册功能form组件 # 注册页面-用户名-密码-确认密码-邮箱-手机号-头像# form组件 可以帮助我们1 快速生成前端页面2 数…...
MindSponge分子动力学模拟——定义一个分子系统
技术背景 在前面两篇文章中,我们分别介绍了分子动力学模拟软件MindSponge的软件架构和安装与使用。这里我们进入到实用化阶段,假定大家都已经在本地部署好了基于MindSpore的MindSponge的编程环境,开始用MindSponge去做一些真正的分子模拟的工…...
unity想让方法带一个默认参数怎么写
在C#中,包括Unity使用的C#版本,你可以为方法参数提供默认值。这允许你在调用方法时省略某些参数,并使用这些参数的默认值。以下是如何为一个方法参数设置默认值的示例: using UnityEngine; public class MyClass : MonoBehaviou…...
从零开始的软件测试学习之旅(六)测试网络基础知识
测试网络基础知识 HTTP和HTMLURLDNS客户端和服务器请求方法和状态码面试高频Fiddler抓包工具教学弱网 HTTP和HTML 概念 html: HyperText Markup Language 超文本标记语言 http: HyperText Transfer Protocol 超文本传输协议 超文本: 图片, 音频, 视频 关系:http 可以对 html 的…...
NSS题目练习
[SWPUCTF 2021 新生赛]gift_F12 通过题目提示可以知道flag应该可以在源代码中找到 查看源代码,直接用 ctrlf 搜索flag即可 [SWPUCTF 2021 新生赛]jicao 题目打开后能看到一串php代码,要求是用post传参传入idwllmNB以及用get传参传入json[x]"wllm&q…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
