CountD 发表于 2006-5-27 18:15:45

[分享]itoa命令/对话中显示半角数字、字母乱码解决办法

虽然很笨但是还是相当实用DI。

办法1:判断文字变量长度。
如果观察一下就可以注意到,当显示2005,12或者其他类似的,长度可以被2整除的数字时,是可以正确显示的。但是碰到235之类的,一定会变成乱码。具体的原理可能说不明白,但是可以确认的是NS显示文字的做法确实是一次显示1个全角字符或者2个半角字符。假如碰到独立的半角字符就会出错。
在这种情况下,为了可以正确的显示半角符号,首先要稍微预处理一下。


;一段姓名输入代码

textfield $name,247,246,555,278,16,32,0 ;输入文字

len %temp,$name ;计算长度

div %temp,2 ;将长度/2取余
if %temp<>0 add $name," " ;有半角符号出现时,加入半角空格1个



不过,以上的东西,其实还是有BUG。在显示单个半角符号。例如玩家只输入了“1”“a”时,依然无法正确显示。而且,如果是全,半角混用的,例如输入“3月”时,依然会出问题。——不过我想没哪个玩家会这么起名的吧……

办法2:穷举法……
此是比较无奈的做法但是100%不会出错。专门针对因为以上所说的1位数无法正确显示的BUG。
就是……1位数单独处理XD

;日期显示代码
date %year,%month,%day
itoa $year,%year
itoa $month,%month
itoa $day,%day

if %month=1 mov $month,"01"
if %month=2 mov $month,"02"
if %month=3 mov $month,"03"
if %month=4 mov $month,"04"
if %month=5 mov $month,"05"
if %month=6 mov $month,"06"
if %month=7 mov $month,"07"
if %month=8 mov $month,"08"
if %month=9 mov $month,"09"

if %day=1 mov $day,"01"
if %day=2 mov $day,"02"
if %day=3 mov $day,"03"
if %day=4 mov $day,"04"
if %day=5 mov $day,"05"
if %day=6 mov $day,"06"
if %day=7 mov $day,"07"
if %day=8 mov $day,"08"
if %day=9 mov $day,"09"

mov $date,":s/32,32,0,1;#000000"
add $date,%year
add $date,"年"
add $date,$month
add $date,"月"
add $date,$day
add $date,"日"


以上,虽然说是穷举,但是工作量还是很小的。=v=

zero龙 发表于 2006-5-27 18:19:44

抢了沙发在看~

zero龙 发表于 2006-5-27 18:52:17


如果这样的话。。。。。汗~真恐怖~难道Narcissu里存档的计算公式就是解决这个问题的?
不知道那里有数组的教程。for命令看的也不是很明白~
*saveload_spload

for %save_num=1 to 20

    savetime %save_num,%save_month,%save_day,%save_hour,%save_minute
    ;セーブ無し
    if %save_month == 0 mov $save_str,":s/14,14,1;#EEFCFD#99CCFB--月--日--时--分":goto *saveload_spload_next

    mov $save_str,":s/14,14,1;#EEFCFD#99CCFB"
    mov %temp_num,%save_month:gosub *num2str
    add $save_str,$temp_str
    add $save_str,"月"
    mov %temp_num,%save_day:gosub *num2str
    add $save_str,$temp_str
    add $save_str,"日"
    mov %temp_num,%save_hour:gosub *num2str
    add $save_str,$temp_str
    add $save_str,"时"
    mov %temp_num,%save_minute:gosub *num2str
    add $save_str,$temp_str
    add $save_str,"分"

      *saveload_spload_next

    if %save_num <= 10 lsp %save_num+150,$save_str,84,18 + (%save_num * 49)
    if %save_num >= 11 lsp %save_num+150,$save_str,440,18 + ( (%save_num - 10) * 49)

    ;小見出しテキスト抽出
    mov $save_str,":s/14,14,1;#EEFCFD#99CCFB"
    mov %temp_num,%save_num+500
    add $save_str,$%temp_num

    if %save_num <= 10 lsp %save_num+130,$save_str,84,35 + (%save_num * 49)
    if %save_num >= 11 lsp %save_num+130,$save_str,440,35 + ( (%save_num - 10) * 49)

next
print 1

return

CountD 发表于 2006-5-27 19:38:40

啊啊啊...图片位置居然能这么算...OTL...

zero龙 发表于 2006-5-27 22:03:05


我都看不懂~~~那是什么?

zero龙 发表于 2006-5-27 22:11:40


那段就是那游戏的存档时间记录。比我的短多了。就是看不懂~

CountD 发表于 2006-5-27 22:11:42

就是NS里的数字不但可以用变量代替,也可以用包含变量的计算式代替...
虽然是已经知道的功能,但是没想到可以这样用...或者说可以用到这么疯狂,带括号的加减乘除之类的...=v=
我也没试过这么复杂的循环呢...

zero龙 发表于 2006-5-27 22:13:43


这个只是简单的电子书的游戏就这么BT~~

CountD 发表于 2006-5-27 22:23:12

很容易看懂啊...
*num2str 应该就是对数字的具体处理部分.
其他部分就是简单的加入年月日.
至于FOR的用法,就是一次次循环把所有的存档都这么处理了.
因为每个存档的数据和存档图片位置都不一样,所以做得稍微有弹性了一点.

zero龙 发表于 2006-5-27 22:30:51


我刚看自己的东东突然想起来了。那个是算显示时间的位置吧~~~
至于for命令我自己也不清楚。
for %save_num=1 to 20
难道是~是这个变量在1到20之间?执行下面的东东~不过后面不是还有个step吗?每次递增数值 他怎么没有~~
页: [1] 2 3
查看完整版本: [分享]itoa命令/对话中显示半角数字、字母乱码解决办法