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…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
