可能会用到的软件
XnConvert
https://www.xnview.com/en/xnconvert/
particle-editor
https://code.google.com/archive/p/cocos2d-windows-particle-editor/downloads
effecthub
http://effecthub.com/particle2dx
Particle Studio
http://www.waitingfy.com/archives/1235
https://www.xnview.com/en/xnconvert/
https://code.google.com/archive/p/cocos2d-windows-particle-editor/downloads
http://effecthub.com/particle2dx
http://www.waitingfy.com/archives/1235
打开命令提示符窗口,如果对某个命令的用法不清楚,可以输入 /?
来查看手册。
如 cd /?
一种是在黑框框里直接输入命令。
另一种是执行脚本文件。
需要注意的是,两种模式下稍有点区别,比方说:for命令里的变量,在命令行里是一个%,在批处理里是两个%。
C:\>for /?
对一组文件中的每一个文件执行某个特定命令。
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。
rd 删除一个目录。
/S 除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。
/Q 安静模式,带 /S 删除目录树时不要求确认
del 删除一个或多个文件。
/P 删除每一个文件之前提示确认。
/F 强制删除只读文件。
/S 删除所有子目录中的指定的文件。
/Q 安静模式。删除全局通配符时,不要求确认
/A 根据属性选择要删除的文件
用两个%包起来的就是使用变量
@echo off
set var1=3
echo %var1%
pause
@echo off
chcp 65001
set dirname=HelloWorld
if not exist %dirname% (
echo %dirname%文件夹不存在
) else (
echo %dirname%文件夹存在
)
pause
如何接收用户输入
@echo off
chcp 65001
set /p var1=请输入:
echo 您输入的是%var1%
pause
如何比较数字大小
@echo off
chcp 65001
set var1=1
set var2=2
set var2a=2
if %var2% EQU %var2a% (
echo %var2%等于%var2a%
)
if %var2% LEQ %var2a% (
echo %var2%小于或等于%var2a%
)
if %var2% GEQ %var2a% (
echo %var2%大于或等于%var2a%
)
if %var1% NEQ %var2% (
echo %var1%不等于%var2%
)
if %var1% LSS %var2% (
echo %var1%小于%var2%
)
if %var2% GTR %var1% (
echo %var2%大于%var1%
)
pause
如何使用for循环
rem 基础用法:没有开关
@echo off
chcp 65001
for %%i in (a,b,c,"你好!我的朋友") do (
echo %%i
)
pause
rem 基础用法:有/L,根据set里面的设置进行循环
rem 格式:FOR /L %%variable IN (start,step,end) DO command
@echo off
chcp 65001
for /L %%i in (1,2,6) do (
echo %%i
)
pause
/F的用法有点复杂,我就不写了,哈哈。
/R 文件遍历
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
则枚举该目录树。
rem 基础用法:有/R,文件夹遍历,打印AAA文件夹(包含子目录)下的所有png文件
@echo off
chcp 65001
for /R C:\Users\xxx\Desktop\AAA %%i in (*.png) do (
echo %%i
)
pause
rem 基础用法:有/R,文件夹遍历,打印file文件夹下的所有子目录
@echo off
chcp 65001
for /R D:\file %%i in (.) do (
echo %%i
)
pause
rem 基础用法:有/R,文件夹遍历,打印该bat所在目录及子目录下的所有文件
@echo off
chcp 65001
for /R %%i in (*.*) do (
echo %%i
)
pause
rem 基础用法:有/R,文件夹遍历,打印该bat所在目录及子目录下的所有目录
@echo off
chcp 65001
for /R %%i in (.) do (
echo %%i
)
pause
输出重定向命令
>
清除文件中原有的内容后再写入
>>
追加内容到文件末尾,而不会清除原有的内容
主要将本来显示在屏幕上的内容输出到指定文件中
指定文件如果不存在,则自动生成该文件
@echo off
chcp 65001
set a1=1
set b1=2
set a2=3
set b2=4
echo %a1% > a.txt
echo %b1% >> b.txt
echo %a2% > a.txt
echo %b2% >> b.txt
echo 你看这是追加 >> b.txt
pause
批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。
rem 这是没有使用延迟变量的例子,打印出来是2
@echo off
set var1=2
set var1=3 & echo %var1%
pause
变量延迟的启动语句是 setlocal enabledelayedexpansion
,并且变量要用一对感叹号包起来。
rem 这是使用延迟变量的例子,打印出来是3
@echo off
setlocal enabledelayedexpansion
chcp 65001
set var1=2
set var1=3 & echo !var1!
pause
rem 这是不使用延迟变量的例子,打印出来全是2
@echo off
chcp 65001
set var1=2
for /L %%i in (1,1,3) do (
set /a var1=var1+1
echo %var1%
)
pause
rem 这是使用延迟变量的例子,打印出来是2,3,4
@echo off
setlocal enabledelayedexpansion
chcp 65001
set var1=2
for /L %%i in (1,1,3) do (
set /a var1=var1+1
echo !var1!
)
pause
rem 这是调用exe的例子,很简单,直接指明路径就可以了,也可以传入参数
@echo off
chcp 65001
for /R %%i in (*.png) do (
D:\libwebp-1.2.2-windows-x64\bin\cwebp -q 100 %%i -o %%i -quiet
)
pause
我在使用 ssh -T git@github.com
时报错:ssh: connect to host github.com port 22: Connection refused
去 ipaddress 输入 github.com
查找到其IP地址
将查到的IP地址和网址映射放到你的本地 hosts
文件中即可,例子:140.82.112.4 github.com
PS: Windows 下 host
默认地址: C:\Windows\System32\drivers\etc
这种纪念法源于西方。耶稣诞生的那一年是公元元年,也叫公元1年。
没有公元0年。也就是说公元1年的上一年是公元前1年。这个跟数轴还是有区别的。
公元元年,对应西汉的最后一位皇帝汉平帝的原始元年。
汉平帝刘衎(公元前9年-6年2月3日),9岁登基,在位7年,死后,王莽建立新朝。
天干有十个。甲乙丙丁戊己庚辛壬癸。
地支有十二个。子丑寅卯辰巳午未申酉戌亥。注:对应十二生肖鼠牛虎兔龙蛇马羊猴鸡狗猪。
为什么60年一轮。头对头,即甲子。尾对尾,即癸亥。
甲子下一个是乙丑、丙寅、(中间省略)到癸酉,下一个甲戌,类推到癸亥。共60。其实就是天干重复6次,地支重复5次。10和12的最小公倍数是60。
没错,我去百度了,还是没看懂,我觉得稍微懂一下天干地支就行了。
第一段:
臣光曰:臣闻天子之职莫大于礼,礼莫大于分,分莫大于名。何谓礼?纪纲是也;何谓分?君臣是也;何谓名?公、侯、卿、大夫是也。夫以四海之广,兆民之众,受制于一人,虽有绝伦之力,高世之智,莫敢不奔走而服役者,岂非以礼为之纲纪哉!是故天子统三公,三公率诸侯,诸侯制卿大夫,卿大夫治士庶人。贵以临贱,贱以承贵。上之使下,犹心腹之运手足,根本之制支叶;下之事上,犹手足之卫心腹,支叶之庇本根。然后能上下相保而国家治安。故曰:天子之职莫大于礼也。
翻译:
臣司马光曰:我知道天子的职责中最重要的是维护礼教,礼教中最重要的是区分地位,区分地位中最重要的是匡正名分。什么是礼教?就是法纪。什么是区分地位?就是君臣有别。什么是名分?就是公、侯、卿、大夫等官爵。四海之广,亿民之众,都受制于天子一人。尽管是才能超群、智慧绝伦的人,也不能不在天子足下为他奔走服务,这难道不是以礼作为礼纪朝纲的作用吗!所以,天子统率三公,三公督率诸侯国君,诸侯国君节制卿、大夫官员,卿、大夫官员又统治士人百姓。权贵支配贱民,贱民服从权贵。上层指挥下层就好像人的心腹控制四肢行动,树木的根和干支配枝和叶;下层服侍上层就好像人的四肢卫护心腹,树木的枝和叶遮护根和干,这样才能上下层互相保护,从而使国家得到长治久安。所以说,天子的职责没有比维护礼制更重要的了。
我:当皇帝最重要的难道不是为百姓服务吗?另外,为啥那些牛逼的人给皇帝打工呢?我觉得还不是因为古时候读书就是为了做官嘛。
第二段:
文王序《易》,以乾、坤为首。孔子系之曰:“天尊地卑,乾坤定矣。卑高以陈,贵贱位矣。”言君臣之位犹天地之不可易也。《春秋》抑诸侯,尊王室,王人虽微,序于诸侯之上,以是见圣人于君臣之际未尝不也。非有桀、纣之暴,汤、武之仁,人归之,天命之,君臣之分当守节伏死而已矣。是故以微子而代纣则成汤配天矣,以季札而君吴则太伯血食矣,然二子宁亡国而不为者,诚以礼之大节不可乱也。故曰礼莫大于分也。
翻译:
周文王演绎排列《易经》,以乾、坤为首位。孔子解释说:“天尊贵,地卑微,阳阴于是确定。由低至高排列有序,贵贱也就各得其位。”这是说君主和臣子之间的上下关系就像天和地一样不能互易。《春秋》一书贬低诸侯,尊崇周王室,尽管周王室的官吏地位不高,在书中排列顺序仍在诸侯国君之上,由此可见孔圣人对于君臣关系的关注。如果不是夏桀、商纣那样的暴虐昏君,对手又遇上商汤、周武王这样的仁德明主,使人民归心、上天赐命的话,君臣之间的名分只能是作臣子的恪守臣节,矢死不渝。所以如果商朝立贤明的微子为国君来取代纣王,成汤创立的商朝就可以永配上天;而吴国如果以仁德的季札做君主,开国之君太伯也可以永享祭祀。然而微子、季札二人宁肯国家灭亡也不愿做君主,实在是因为礼教的大节绝不可因此破坏。所以说,礼教中最重要的就是地位高下的区分。
我:如果改朝换代的必要条件是有桀纣之暴和汤武之仁,那中国历史也就不会有那么多朝代了。我觉得司马光先生还是有点太古板了。那陈胜吴广不应该反秦咯?
王莽同学遮住了脸,心想你要是cue我,我就说“那小孩特别暴,我特别仁”。
位图字体的出现是为了处理像TTF一类的字体文件在不同平台显示有差异的问题。
因为可以由美术出图,所以呈现出的效果能够比字体文件更美观。
不需要用户去安装某个字体,就能够达到设计者想要呈现的效果。从游戏开发的角度来讲,也缩小了安装包的体积。
但是只适用于文本复杂度不高的情况,像文本无法固定的聊天内容,就不适用了。
工具 | 平台限制 | 官网 | 下载地址 | 是否免费 | 备注 |
---|---|---|---|---|---|
BMFont | 仅Windows | 链接 | 前边链接上有 | 免费 | 这个用得比较多 |
Glyph Designer | 仅MacOS | 链接 | 前边链接上有 | 60块一个月 | 功能比BMFont更强,但需要付费 |
Littera | 跨平台(在线工具) | 链接 | 不用下载,浏览器打开这个网址就行 | 免费 | 这个还蛮好用的,但需要安装Flash。Littera在油管上的视频。 |
SnowBamboo | 跨平台(在线工具) | 链接 | 不用下载,浏览器打开这个网址就行 | 免费 | 这个类似Littera,但不需要Flash。github仓库,给作者加星。 |
Hiero | 跨平台的(因为是Java做的) | 链接 | 前边链接上有 | 免费 | 这个我没用过 |
convert2fnt | 仅Windows | 没得 | 去搜嘛 | 免费 | 这是我之前在网上找到的一个小众软件,易用,功能较弱 |
2023/03/23更新:Littera这个网址挂了。
在使用之前,需要设置软件,其中许多设置我不懂,还是去看看官方文档吧。
网上搜索到的另一篇博客说到了这些设置的含义。
我们可以把这些设置保存成一个.bmfc
文件。下次使用时可以直接加载这个配置文件,不用每次都去设置一遍。
有两种制作方式,第一种是使用某个字体,然后选中某些字符,然后导出。第二种是提供图片给BMFont,然后设定好图片和字符的对应关系,然后导出。
我们通常是采用读取文本文件的方式来选择字符。
这里需要特别注意文本的编码,比方说在Windows系统上,用记事本保存文件时,有ANSI、UTF-16 LE、UTF-16 BE、UTF-8、带有BOM的UTF-8,我测试了一下,ANSI和UTF-8是不行的。
Edit->Open Image Manager->Image->Import image,Id那里填上数字,这个数字就对应着ASCII码里的某个字符,绑定成功后就会显示一个蓝色的小点。
第一行是对字体的介绍。info 开头:
字段 | 说明 | BMFont设置 | 备注 |
---|---|---|---|
face | 字体 | Font Settings -> Font graphics -> Font | |
size | 字号 | Font Settings -> Font graphics -> Size | |
bold | 是否加粗 | Font Settings -> Font graphics -> Bold | |
italic | 是否斜体 | Font Settings -> Font graphics -> Italic | |
charset | 字符集 | ||
unicode | 是否unicode | ||
stretchH | 纵向缩放百分比 | horizontal表示水平,vertical表示水平。那为啥这个叫纵向缩放百分比呢? | |
smooth | 是否开启平滑 | ||
aa | 是否开启抗锯齿 | ||
padding | 内边距 | ||
spacing | 外边距 | ||
outline | 描边 | Font Settings -> Effects -> Outline thickness |
第二行是对应所有字贴图的公共信息。common 开头:
字段 | 说明 | BMFont设置 | 备注 |
---|---|---|---|
lineHeight | 行高 | Font Settings -> Font graphics -> Font | |
base | 字的基本大小 | 没搞懂这个是在哪里设置的,有什么用 | |
scaleW | 合图的宽 | Export Options -> Texture -> Width | |
scaleH | 合图的高 | Export Options -> Texture -> Height | |
pages | 合图有几张 | ||
packed | 图片是否压缩 | ||
alphaChnl | 透明度 | ||
redChnl | 红色 | ||
greenChnl | 绿色 | ||
blueChnl | 蓝色 |
第三行是对应当前字贴图的信息
字段 | 说明 | BMFont设置 | 备注 |
---|---|---|---|
id | |||
file | 合图名字 |
第四行是当前贴图中所容纳的文字数量
字段 | 说明 | BMFont设置 | 备注 |
---|---|---|---|
chars count | 文字数量 |
第五行起把当前贴图中所用到的所有文字的编码以及对应在图片上的矩形位置,偏移等列出来
把BMFont生成的png拖入PS里,右键图层,点混合选项,那里可以加描边,然后保存图片就行。
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()-+=_`|{}\[]:";'<>?,./1234567890
用Xcode的Swift Package Manager安装,因为Xcode不能使用代理,所以比较麻烦。所以改用CocoaPods。下边是用pod的注意事项。
以前是pod 'Firebase/Auth'
,现在是pod 'FirebaseAuth'
需要加上use_frameworks!
,这里说了Breaking change: Podfiles must include use_frameworks! or use_frameworks! :linkage => :static.
。
如果报错'GoogleUtilities/GULURLSessionDataResponse.h' file not found
,可能是pod下来的版本不对。我的做法是注释掉pod 'FirebaseAuth'
后再pod。参考这篇文章。
如果报错Use of '@import' when C++ modules are disabled
,需要在Other C++ Flags
加上-fcxx-modules
。参考这篇文章。
proj.ios_mac\ios\RootViewController.mm
- (void)loadView {
//省略
UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(20, 50, 100, 30);
[button setTitle:@"Test Crash" forState:UIControlStateNormal];
[button addTarget:self action:@selector(crashButtonTapped:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (IBAction)crashButtonTapped:(id)sender {
@[][1];
}
Xcode->Organizer->Show in Finder->Show Package Contents
/path/to/pods/directory/FirebaseCrashlytics/upload-symbols -gsp /path/to/GoogleService-Info.plist -p ios /path/to/dSYMs
macOS的版本是12.3.1,Xcode的版本是13.3.1,在终端里输入git status
,然后有下面一段提示:
2022-05-06 17:20:43.213 xcodebuild[77022:1041489] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications for extension Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
2022-05-06 17:20:43.214 xcodebuild[77022:1041489] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionPointIdentifierToBundleIdentifier for extension Xcode.DebuggerFoundation.AppExtensionToBundleIdentifierMap.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
On branch master
Your branch is up to date with 'origin/master'.
虽然git status也可以用,但这段提示令人不爽。
我在终端里输入xcode-select --install
之后,弹出一个安装的窗口,在安装完之后,再输入git status
就没有上面哪些提示信息了。
xcode-select
这个命令就是说如果你的电脑上安装了多个xcode的版本,可以通过这个命令来选择使用哪一个版本。
在 Xcode 中查看使用的 CommandLineTools
Xcode –> Preferences –> Locations –> Command Line Tools
安装 CommandLineTools
xcode-select --install
除 iOS 之外的平台,去这个网站下载。
iOS 版本需要使用美区账号登录美区苹果商店,然后搜索 shadowrocket 安装。
注意不要下错了,开发者是Shadow Launch Technology Limited。
可以自己注册美区账号,也可以使用别人共享的账号,也可以自行购买。
参考这个网页。
打开软件 App Store -> 点击右上角的头像,拉到底部,退出登录,再登录新账号。
有可能弹出一个安全性的页面,选择 其他选项 -> 不升级 。千万不要开启双重验证。
下下来后,参考这个文章来导入。
Surfshark VPN 85%优惠+3个月畅享:https://bittly.cc/Surfshark
PrivadoVPN:https://privadovpn.com/pricing
Windscribe:https://windscribe.com/download
AtlasVPN:https://atlasvpn.com/free-vpn
zoogvpn:https://zoogvpn.com/free-vpn/
ProtonVPN:https://protonvpn.com/free-vpn
Hideme VPN:https://hide.me/en/free-vpn
TunnelBear:https://www.tunnelbear.com/