设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2862|回复: 5
打印 上一主题 下一主题

[已经解决] 关于一个诡异的字体定义方法

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
476 小时
注册时间
2011-3-22
帖子
46
跳转到指定楼层
1
 楼主| 发表于 2013-1-28 00:41:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 muyumuyulnny 于 2013-1-28 14:52 编辑

有一个英文脚本,它不适用正常的字体而是用以下脚本来定义字体  
RUBY 代码复制
  1. class Bitmap
  2.   #--------------------------------------------------------------------------
  3.   # * Bitmap Font
  4.   #  x    :  the x of the starting letter
  5.   #  y    :  the y of the starting letter
  6.   #  text :  the text to display
  7.   #  font :  the font to render (optional)
  8.   #--------------------------------------------------------------------------
  9.   def bitmap_font(x, y, text, font = 'FE7_Text', color = 'White', dash = false)
  10.     text = text.to_s
  11.     if font == 'Verdana'
  12.       # Create the font
  13.       font_image = RPG::Cache.picture(font)
  14.       # Determine sizing.
  15.       char_width  = font_image.width  / 26
  16.       char_height = font_image.height / 3
  17.       # Loop through each letter.
  18.       text.length.times do |index|
  19.         # Get the Byte.
  20.         byte = text[index]
  21.         # Get Letter
  22.         letter = byte.chr
  23.         # If it is a letter
  24.         if letter =~ /[A-Z]/
  25.           iX = (byte - 65) * char_width
  26.           iY = char_height
  27.         elsif letter =~ /[a-z]/
  28.           iX =(byte - 97) * char_width
  29.           iY = 0
  30.         # If it is a number
  31.         elsif letter =~ /[0-9]/
  32.           iX = letter.to_i * char_width
  33.           iY = 2 * char_height
  34.         # Otherwise it's a symbol
  35.         else
  36.           unless letter == ' ' or letter == ''
  37.             # Define the order
  38.             order = ['.', ',', '$', '!', '(', ')', '-', '/', '\\', '?', ';',
  39.                 ':', '#', '&', '"', "'"]
  40.             iX = (order.index(letter) + 10) * char_width
  41.             iY = 2 * char_height
  42.           end
  43.         end
  44.         # If it's not a space, draw it
  45.         if letter != ' ' and letter != ""
  46.           rect = Rect.new(iX, iY, char_width, char_height)
  47.           # Blit it to the screen
  48.           self.blt((index * char_width) + x, y, font_image, rect)
  49.         end
  50.       end
  51.     end
  52.     if font == 'AWOS'
  53.       # Create the font
  54.       font_image = RPG::Cache.picture(font)
  55.       $placement = 0
  56.       # Loop through each letter.
  57.       text.length.times do |index|
  58.         # Determine sizing.
  59.         char_width  = 8 #font_image.width  / 26
  60.         char_height = 12 #font_image.height / 3
  61.         # Get the Byte.
  62.         byte = text[index]
  63.         # Get Letter
  64.         letter = byte.chr
  65.         # If it is a letter
  66.         if letter =~ /[A-Z]/
  67.           iX = (byte - 65) * char_width
  68.           iY = char_height
  69.           if letter == 'W' or letter == 'M'
  70.             char_width = 8
  71.           elsif letter == 'I'
  72.             char_width = 2
  73.           else
  74.             char_width = 6
  75.           end
  76.         elsif letter =~ /[a-z]/
  77.           iX =(byte - 97) * char_width
  78.           iY = 0
  79.           if letter == 'a' or letter == 'd' or letter == 'm' or letter == 'v'
  80.             char_width = 6
  81.           elsif letter == 'w' or letter == 'x' or letter == 'z'
  82.             char_width = 6
  83.           elsif letter == 'j' or letter == 't'
  84.             char_width = 4
  85.           elsif letter == 'i' or letter == 'l'
  86.             char_width = 2
  87.           else
  88.             char_width = 5
  89.           end
  90.         # If it is a number
  91.         elsif letter =~ /[0-9]/
  92.           iX = letter.to_i * char_width
  93.           iY = 2 * char_height
  94.           if letter == '1'
  95.             char_width = 4
  96.           else
  97.             char_width = 7
  98.           end
  99.         # Otherwise it's a symbol
  100.         else
  101.           unless letter == ' ' or letter == ''
  102.             # Define the order
  103.             order = ['.', ',', '$', '!', '(', ')', '-', '/', '\\', '?', ';',
  104.                 ':', '#', '&', '"', "'", '+']
  105.             iX = (order.index(letter) + 10) * char_width
  106.             iY = 2 * char_height
  107.           end
  108.           if letter == '.' or letter == ':' or letter == "'"
  109.             char_width = 2
  110.           elsif letter == ',' or letter == '!' or letter == ';'
  111.             char_width = 3
  112.           elsif letter == '(' or letter == ')' or letter == '-' or letter == '"'
  113.             char_width = 4
  114.           elsif letter == '#'
  115.             char_width = 7
  116.           elsif letter == '&'
  117.             char_width = 8
  118.           else
  119.             char_width = 6
  120.           end
  121.         end
  122.         letter == ' ' or letter == "" ? char_width = 3 : nil
  123.         # If it's not a space, draw it
  124.         if letter != ' ' and letter != ""
  125.           rect = Rect.new(iX, iY, char_width, char_height)
  126.           # Blit it to the screen
  127.           self.blt($placement + x, y, font_image, rect)
  128.         end
  129.         $placement += char_width
  130.       end
  131.     end
  132.     if font == 'FE7_Text' or font == 'FE7_TextL'
  133.       large_text = (font == 'FE7_TextL')
  134.       # Create the font
  135.       font = 'FE7_Text' + '_' + (color == 'Info2' ? 'Info' : color)
  136.       font_image = RPG::Cache.picture(font)
  137.       $placement = 0
  138.       # Loop through each letter.
  139.       text.length.times do |index|
  140.         # Determine sizing.
  141.         char_width  = 8 #font_image.width  / 26
  142.         char_height = 14 #font_image.height / 3
  143.         # Get the Byte.
  144.         byte = text[index]
  145.         # Get Letter
  146.         letter = byte.chr
  147.         # If it is a letter
  148.         if letter =~ /[A-Z]/
  149.           iX = (byte - 65) * char_width
  150.           iY = char_height * (large_text ? 3 : 1)
  151.           if large_text
  152.             char_width = 8
  153.           else
  154.             if letter == 'W' or letter == 'M' or letter == 'V' or
  155.                 letter == 'Q' or letter == 'X' or letter == 'Y' or letter == 'T'
  156.               char_width = 7
  157.             elsif letter == 'I' or letter == 'L'
  158.               char_width = 5
  159.             else
  160.               char_width = 6
  161.             end
  162.           end
  163.         elsif letter =~ /[a-z]/
  164.           iX =(byte - 97) * char_width
  165.           iY = 0
  166.           if letter == 'a' or letter == 'm' or letter == 'v' or
  167.               letter == 'w' or letter == 'x'
  168.             char_width = 7
  169.           elsif letter == 'f' or letter == 'j' or letter == 'r' or letter == 't'
  170.             char_width = 5
  171.           elsif letter == 'i' or letter == 'l'
  172.             char_width = 3
  173.           else
  174.             char_width = 6
  175.           end
  176.         # If it is a number
  177.         elsif letter =~ /[0-9]/
  178.           iX = letter.to_i * char_width
  179.           iY = 2 * char_height
  180.           if color == 'Info'
  181.             char_width = 7
  182.           else
  183.             char_width = 8
  184.           end
  185.         # Otherwise it's a symbol
  186.         else
  187.           unless letter == ' ' or letter == ''
  188.             # Define the order
  189.             order = ['.', ',', '$', '!', '(', ')', '-', '/', '\\', '?', ';',
  190.                 ':', '#', '&', '"', "'", '+']
  191.             iX = (order.index(letter) + 10) * char_width
  192.             iY = 2 * char_height
  193.           end
  194.           if letter == '.' or letter == ':' or letter == "'" or
  195.               letter == ',' or letter == ';'
  196.             char_width = 3
  197.           elsif letter == '(' or letter == ')'
  198.             char_width = 5
  199.           elsif letter == '"' or letter == '!'
  200.             char_width = 5
  201.           elsif letter == '#'
  202.             char_width = 6
  203.           elsif letter == '-'
  204.             if color == 'Combat'
  205.               char_width = 8
  206.             else
  207.               char_width = 7
  208.             end
  209.             #$placement += 1
  210.           elsif letter == '$' # Equipped/Experience 'E'
  211.             char_width = 8
  212.           else
  213.             char_width = 7
  214.           end
  215.         end
  216.         (letter == ' ' or letter == "") ? (char_width = 4) : nil
  217.         # If it's not a space, draw it
  218.         if letter != ' ' and letter != ""
  219.           rect = Rect.new(iX, iY, char_width, char_height)
  220.           # Blit it to the screen
  221.           self.blt($placement + x, y, font_image, rect)
  222.         end
  223.         $placement += char_width - 1
  224.         $placement += 1 if (letter =~ /[A-Z]/ and large_text)
  225.         $placement += 1 if (letter =~ /[0-9]/)
  226.         $placement += 1 if (letter == '-' and (dash or color == 'Combat'))
  227.         $placement += 2 if (letter == '-' and !(dash or (color == 'Combat')))
  228.       end
  229.     end
  230.     if font == 'FE7_Convo'
  231.       # Create the font
  232.       font = 'FE7_Convo' + '_' + color
  233.       font_image = RPG::Cache.picture(font)
  234.       $placement = 0
  235.       # Loop through each letter.
  236.       text.length.times do |index|
  237.         # Determine sizing.
  238.         char_width  = 8 #font_image.width  / 26
  239.         char_height = 16 #font_image.height / 3
  240.         # Get the Byte.
  241.         byte = text[index]
  242.         # Get Letter
  243.         letter = byte.chr
  244.         # If it is a letter
  245.         if letter =~ /[A-Z]/
  246.           iX = (byte - 65) * char_width
  247.           iY = char_height
  248.           if ['M', 'W', 'X'].include?(letter)
  249.             char_width = 8
  250.           elsif ['Q', 'S'].include?(letter)
  251.             char_width = 7
  252.           elsif letter == 'I'
  253.             char_width = 4
  254.           else
  255.             char_width = 6
  256.           end
  257.         elsif letter =~ /[a-z]/
  258.           iX =(byte - 97) * char_width
  259.           iY = 0
  260.           if letter == 'g'
  261.             char_width = 7
  262.           elsif ['a', 'm', 'v', 'w', 'x'].include?(letter)
  263.             char_width = 6
  264.           elsif letter == 'r' or letter == 't'
  265.             char_width = 4
  266.           elsif letter == 'j'
  267.             char_width = 3
  268.           elsif letter == 'i' or letter == 'l'
  269.             char_width = 2
  270.           else
  271.             char_width = 5
  272.           end
  273.         # If it is a number
  274.         elsif letter =~ /[0-9]/
  275.           iX = letter.to_i * char_width
  276.           iY = 2 * char_height
  277.           if letter == '1'
  278.             char_width = 4
  279.           elsif letter == '4'
  280.             char_width = 7
  281.           else
  282.             char_width = 6
  283.           end
  284.         # Otherwise it's a symbol
  285.         else
  286.           unless letter == ' ' or letter == ''
  287.             # Define the order
  288.             order = ['.', ',', '$', '!', '(', ')', '-', '/', '\\', '?', ';',
  289.                 ':', '#', '&', '"', "'", '+', '%']
  290.             if !order.include?(letter)
  291.               next
  292.             end
  293.             iX = (order.index(letter) + 10) * char_width
  294.             iY = 2 * char_height
  295.           end
  296.           if ['.', ',', ';', ':', "'"].include?(letter)
  297.             char_width = 2
  298.           elsif ['!', '(', ')'].include?(letter)
  299.             char_width = 3
  300.           elsif letter == '-'
  301.             char_width = 4
  302.           elsif letter == '"' or letter == '+'
  303.             char_width = 5
  304.           elsif letter == '#'
  305.             char_width = 6
  306.           elsif letter == '%' or letter == '$' # Equipped/Experience 'E'
  307.             char_width = 8
  308.           else
  309.             char_width = 7
  310.           end
  311.         end
  312.         (letter == ' ' or letter == "") ? (char_width = 4) : nil
  313.         # If it's not a space, draw it
  314.         if letter != ' ' and letter != ""
  315.           rect = Rect.new(iX, iY, char_width, char_height)
  316.           # Blit it to the screen
  317.           self.blt($placement + x, y, font_image, rect)
  318.         end
  319.         $placement += char_width
  320.         #$placement += 1 if (letter =~ /[A-Z]/ and large_text)
  321.         #$placement += 1 if (letter =~ /[0-9]/)
  322.         #$placement += 1 if (letter == '-' and (dash or color == 'Combat'))
  323.         #$placement += 2 if (letter == '-' and !(dash or (color == 'Combat')))
  324.       end
  325.     end
  326.   end
  327. end



能否在其中加入一个可使用中文的字体?因为这是一个系列的脚本,它的窗口里都是用的
@content[index].bitmap.bitmap_font(4,6,@commands[index], 'FE7_Text','White')
  @lv_hp.bitmap.bitmap_font(0, 16, 'HP', 'FE7_TextL', 'Yellow')
之类的语句来写的,一旦把'HP'改成'生命'它就完全不能显示了。
其实我以前有问过的,可是一直到过期都没人理我... ...所以本着锲而不舍的精神再问一次。

Lv3.寻梦者

风行者

梦石
0
星屑
2540
在线时间
6938 小时
注册时间
2011-10-2
帖子
2395

开拓者

2
发表于 2013-1-28 08:40:02 手机端发表。 | 只看该作者
这上面只能输出英文字符,你写中文当然就显示不能了。改字体在你的脚本里全局搜索font.name。然后改成你想要的字体。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3851
在线时间
1966 小时
注册时间
2013-1-3
帖子
9536
3
发表于 2013-1-28 09:03:55 | 只看该作者
您全局搜索font.name,然后把括号里的字体名称改为您想要的,一定要写全称(可在我的电脑\window\Font中查找)。
《宿愿·寻剑篇》正式版已经发布!快去看看!点击进入论坛发布贴
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
270 小时
注册时间
2010-2-4
帖子
1305
4
发表于 2013-1-28 10:59:04 | 只看该作者
替换成如下脚本- -b
  1. class Bitmap
  2.   #--------------------------------------------------------------------------
  3.   # * Bitmap Font
  4.   #  x    :  the x of the starting letter
  5.   #  y    :  the y of the starting letter
  6.   #  text :  the text to display
  7.   #  font :  the font to render (optional)
  8.   #--------------------------------------------------------------------------
  9.   def bitmap_font(x, y, text, font = '黑体', color = "", dash = false)
  10.     self.font.name = font
  11.     draw_text(x, y, text.size * 32, 32, text)
  12.   end
  13. end
复制代码

点评

非常感谢,可以使用中文字了!  发表于 2013-1-28 13:18
好歹当年也当过大魔王过,orz
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
476 小时
注册时间
2011-3-22
帖子
46
5
 楼主| 发表于 2013-1-28 13:14:29 | 只看该作者
幻风 发表于 2013-1-28 08:40
这上面只能输出英文字符,你写中文当然就显示不能了。改字体在你的脚本里全局搜索font.name。然后改成你想 ...

问题是这个人在描绘文字的时候就不是用的
self.font.name = ""
这种方法,而是自己定义的bitmap_font(x, y, text, font = 'FE7_Text', color = 'Yellow', dash = false)
如果搜font.name 的话只能搜到XP自带脚本而不能搜到这个作者自己写的脚本里的文字。
仍然非常感谢您的回答。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
47
在线时间
976 小时
注册时间
2011-4-30
帖子
860
6
发表于 2013-1-28 13:30:32 | 只看该作者
muyumuyulnny 发表于 2013-1-28 13:14
问题是这个人在描绘文字的时候就不是用的
self.font.name = ""
这种方法,而是自己定义的bitmap_font(x,  ...

LZ难道没看到这段脚本吗?

      char_width  = font_image.width  / 26
      char_height = font_image.height / 3

很明显这是个使用图片显示文字的脚本,也就是你脚本里输入文字,它给你从一张图片里找出对应的图片文字,然后显示,

英文26个字母才好这么弄,你中文要用先得准备一张几千字的图?你有么??再说读取方式和英文的也不一样吧??

它里面改字体颜色都是用的另一张图,你还想改字号??

楼下一群人看都没看就瞎解释。
湿滑落式骑!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-4 11:55

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表