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

Project1

 找回密码
 注册会员
搜索
查看: 16426|回复: 29

[RMVX发布] 路牌提示系统

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2007-5-27
帖子
2560

第1届Title华丽大赛新人奖

发表于 2008-10-2 01:57:31 | 显示全部楼层 |阅读模式

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

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

x
路牌提示系统 by 沉影不器

功能说明:
   仿照《黑暗圣剑传说2 序章》(柳柳)的介绍里提到的效果写的,据说是空之轨迹里的效果
   原游戏的实现方式是公共事件播放动画, 以下引用原描述:
     "方便玩家的路牌设计, 当靠近路牌的时候, 路牌就会指引玩家的方向"

使用说明(详见范例工程):
   ① 制作路牌皮肤文件, 包含三个文件(64×64的窗体和两个箭头标志)
   ② 在地图上创建路牌事件, 并在事件中用注释写上指路内容, 允许多项
   ③ 指路内容格式为(忽略空格): 方向代号 = 该方向所指向的名称
      其中方向代号为: 2 4 6 8
      例: 2 = 悦来客栈        显示"↓ 悦来客栈"
   ④ 创建与路牌事件同名的区域, 表示玩家进入该区域时激活相应路牌

  1. #==============================================================================
  2. # 路牌提示系统 by 沉影不器
  3. #------------------------------------------------------------------------------
  4. # 功能说明:
  5. #   仿照《黑暗圣剑传说2 序章》(柳柳)的介绍里提到的效果写的,据说是空之轨迹里的效果
  6. #   原游戏的实现方式是公共事件播放动画, 以下引用原描述:
  7. #     "方便玩家的路牌设计, 当靠近路牌的时候, 路牌就会指引玩家的方向"
  8. #------------------------------------------------------------------------------
  9. # 使用说明(详见范例工程):
  10. #   ① 制作路牌皮肤文件, 包含三个文件(64×64的窗体和两个箭头标志)
  11. #   ② 在地图上创建路牌事件, 并在事件中用注释写上指路内容, 允许多项
  12. #   ③ 指路内容格式为(忽略空格): 方向代号 = 该方向所指向的名称
  13. #      其中方向代号为: 2 4 6 8
  14. #      例: 2 = 悦来客栈        显示"↓ 悦来客栈"
  15. #   ④ 创建与路牌事件同名的区域, 表示玩家进入该区域时激活相应路牌
  16. #==============================================================================
  17. # □ Spriteset_Roadsign
  18. #==============================================================================
  19. class Spriteset_Roadsign
  20.   #--------------------------------------------------------------------------
  21.   # ○ 参数设定
  22.   #--------------------------------------------------------------------------
  23.   WIDTH_MIN = 96                      # 窗体最小宽度
  24.   SHOW_TIME = 60                      # 窗体显示时间
  25.   
  26.   FONT = "宋体"                       # 字体
  27.   FONT_SIZE = 14                      # 字体大小
  28.   FONT_SHADOW = false                 # 字体阴影
  29.   FONT_COLOR = Color.new(0,0,0)       # 字体颜色
  30.   
  31.   SIGN_SKIN = "Roadsign"              # 路牌皮肤
  32.   SKIN_SIZE = 8                       # 皮肤厚度(边框)
  33.   SIGN_OPACITY = 192                  # 路牌不透明度
  34.   
  35.   X_ADJ = 0                           # 路牌箭头坐标微调
  36.   Y_ADJ = 0
  37.   #--------------------------------------------------------------------------
  38.   # ○ 初始化对象
  39.   #     event : 事件
  40.   #--------------------------------------------------------------------------
  41.   def initialize(event)
  42.     @event = event
  43.     # 显示控制符
  44.     @show = true
  45.     # 显示时间计数
  46.     @show_count = 0
  47.     # 相对定位
  48.     @x_plus = 0
  49.     @y_plus = 0
  50.     # 描绘内容
  51.     @texts = get_texts
  52.     # 主'窗体'
  53.     @base_sprite = Sprite.new
  54.     @base_sprite.z = 999
  55.     @base_sprite.opacity = 0
  56.     # 大小和尺寸
  57.     set_size
  58.     get_pos
  59.     reset_pos
  60.     # 描绘皮肤
  61.     draw_skin
  62.     refresh
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # ○ 释放
  66.   #--------------------------------------------------------------------------
  67.   def dispose
  68.     @base_sprite.bitmap.dispose
  69.     @base_sprite.dispose
  70.     @arrow_sprite.bitmap.dispose
  71.     @arrow_sprite.dispose
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ○ 是否释放
  75.   #--------------------------------------------------------------------------
  76.   def disposed?
  77.     return @base_sprite.disposed?
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # ○ 更新画面
  81.   #--------------------------------------------------------------------------
  82.   def update
  83.     # 跟随路牌
  84.     reset_pos
  85.     # 显示期
  86.     if @show_count > 0
  87.       @show_count -= 1
  88.       return
  89.     end
  90.     # 开始显示期
  91.     if @base_sprite.opacity >= 255
  92.       @show_count = SHOW_TIME
  93.       @show = false
  94.     end
  95.     # 显示中或隐藏中
  96.     if @show
  97.       @base_sprite.opacity += 8 if @base_sprite.opacity < 255
  98.     else
  99.       @base_sprite.opacity -= 8 if @base_sprite.opacity > 0
  100.     end
  101.     @arrow_sprite.opacity = @base_sprite.opacity
  102.     # 自释放
  103.     self.dispose if !@show and @base_sprite.opacity <= 0
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ○ 获取描绘文本
  107.   #--------------------------------------------------------------------------
  108.   def get_texts
  109.     down  = @event.read_roadsign("2")
  110.     left  = @event.read_roadsign("4")
  111.     right = @event.read_roadsign("6")
  112.     up    = @event.read_roadsign("8")
  113.     texts = []
  114.     texts.push("↓ " + down)  if down  != ""
  115.     texts.push("← " + left)  if left  != ""
  116.     texts.push("→ " + right) if right != ""
  117.     texts.push("↑ " + up)    if up    != ""
  118.     return texts
  119.   end
  120.   #--------------------------------------------------------------------------
  121.   # ○ 创建位图
  122.   #--------------------------------------------------------------------------
  123.   def create_bitmap(width, height)
  124.     @base_sprite.bitmap = Bitmap.new(width, height)
  125.     # 字体设定
  126.     @base_sprite.bitmap.font = Font.new(FONT, FONT_SIZE)
  127.     @base_sprite.bitmap.font.shadow = FONT_SHADOW
  128.     @base_sprite.bitmap.font.color = FONT_COLOR
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ○ 设定尺寸
  132.   #--------------------------------------------------------------------------
  133.   def set_size
  134.     # 最小宽度
  135.     width = WIDTH_MIN
  136.     # 测试宽度的临时位图
  137.     test_bitmap = Bitmap.new(1, 1)
  138.     test_bitmap.font = Font.new(FONT, FONT_SIZE)
  139.     for text in @texts
  140.       c_width = test_bitmap.text_size(text).width
  141.       width = c_width if c_width > width
  142.     end
  143.     height = @texts.size * line_height
  144.     create_bitmap(width+SKIN_SIZE*2, height+SKIN_SIZE*2)
  145.     # 释放临时位图
  146.     test_bitmap.dispose
  147.   end
  148.   #--------------------------------------------------------------------------
  149.   # ○ 获取坐标
  150.   #--------------------------------------------------------------------------
  151.   def get_pos
  152.     x = @event.screen_x - width/2
  153.     if @event.screen_y > height
  154.       y = @event.screen_y - height - 32
  155.       # 箭头类型标志
  156.       up = true
  157.     else
  158.       y = @event.screen_y
  159.       # 箭头类型标志
  160.       up = false
  161.     end
  162.     # 相对定位
  163.     @x_plus = x - @event.screen_x
  164.     @y_plus = y - @event.screen_y
  165.     set_arrow_sprite(up)
  166.   end
  167.   #--------------------------------------------------------------------------
  168.   # ○ 重设坐标
  169.   #--------------------------------------------------------------------------
  170.   def reset_pos
  171.     # 相对定位
  172.     @base_sprite.x = @event.screen_x + @x_plus
  173.     @base_sprite.y = @event.screen_y + @y_plus
  174.     @arrow_sprite.x = @event.screen_x - 16 + X_ADJ
  175.     @arrow_sprite.y = @event.screen_y - 32 + Y_ADJ
  176.   end
  177.   #--------------------------------------------------------------------------
  178.   # ○ 设定箭头
  179.   #--------------------------------------------------------------------------
  180.   def set_arrow_sprite(up = true)
  181.     @arrow_sprite = Sprite.new
  182.     @arrow_sprite.opacity = 0
  183.     # 上下两套箭头
  184.     case up
  185.     when true
  186.       bitmap = Cache.system(SIGN_SKIN + "_arrow_up")
  187.       rect = Rect.new(0, 0, bitmap.width, bitmap.height)
  188.       @arrow_sprite.bitmap = Bitmap.new(rect.width, rect.height)
  189.       @arrow_sprite.bitmap.blt(0, 0, bitmap, rect, SIGN_OPACITY)
  190.     when false
  191.       bitmap = Cache.system(SIGN_SKIN + "_arrow_down")
  192.       rect = Rect.new(0, 0, bitmap.width, bitmap.height)
  193.       @arrow_sprite.bitmap = Bitmap.new(rect.width, rect.height)
  194.       @arrow_sprite.bitmap.blt(0, 0, bitmap, rect, SIGN_OPACITY)
  195.     end
  196.     bitmap.dispose
  197.   end
  198.   #--------------------------------------------------------------------------
  199.   # ○ 获取宽度
  200.   #--------------------------------------------------------------------------
  201.   def width
  202.     return @base_sprite.width
  203.   end
  204.   #--------------------------------------------------------------------------
  205.   # ○ 获取高度
  206.   #--------------------------------------------------------------------------
  207.   def height
  208.     return @base_sprite.height
  209.   end
  210.   #--------------------------------------------------------------------------
  211.   # ○ 获取行高
  212.   #--------------------------------------------------------------------------
  213.   def line_height
  214.     return FONT_SIZE + 2
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # ○ 描绘皮肤
  218.   #--------------------------------------------------------------------------
  219.   def draw_skin
  220.     # 皮肤文件
  221.     skin = Cache.system(SIGN_SKIN)
  222.     @base_sprite.bitmap.clear
  223.     # 描绘角
  224.     src_rect = Rect.new(0,0,16,16)
  225.     @base_sprite.bitmap.blt(0, 0, skin, src_rect, SIGN_OPACITY)
  226.     src_rect = Rect.new(48,0,16,16)
  227.     @base_sprite.bitmap.blt(width-16, 0, skin, src_rect, SIGN_OPACITY)
  228.     src_rect = Rect.new(0,48,16,16)
  229.     @base_sprite.bitmap.blt(0, height-16, skin, src_rect, SIGN_OPACITY)
  230.     src_rect = Rect.new(48,48,16,16)
  231.     @base_sprite.bitmap.blt(width-16, height-16, skin, src_rect, SIGN_OPACITY)
  232.     # 描绘边
  233.     dest_rect = Rect.new(16,0,width-32,16)
  234.     src_rect = Rect.new(16,0,32,16)
  235.     @base_sprite.bitmap.stretch_blt(dest_rect, skin, src_rect, SIGN_OPACITY)
  236.     dest_rect = Rect.new(16,height-16,width-32,16)
  237.     src_rect = Rect.new(16,48,32,16)
  238.     @base_sprite.bitmap.stretch_blt(dest_rect, skin, src_rect, SIGN_OPACITY)
  239.     dest_rect = Rect.new(0,16,16,height-32)
  240.     src_rect = Rect.new(0,16,16,32)
  241.     @base_sprite.bitmap.stretch_blt(dest_rect, skin, src_rect, SIGN_OPACITY)
  242.     dest_rect = Rect.new(width-16,16,16,height-32)
  243.     src_rect = Rect.new(48,16,16,32)
  244.     @base_sprite.bitmap.stretch_blt(dest_rect, skin, src_rect, SIGN_OPACITY)
  245.     # 描绘底
  246.     dest_rect = Rect.new(16,16,width-32,height-32)
  247.     src_rect = Rect.new(16,16,32,32)
  248.     @base_sprite.bitmap.stretch_blt(dest_rect, skin, src_rect, SIGN_OPACITY)
  249.     # 释放皮肤文件
  250.     skin.dispose
  251.   end
  252.   #--------------------------------------------------------------------------
  253.   # ○ 刷新
  254.   #--------------------------------------------------------------------------
  255.   def refresh
  256.     # 逐行
  257.     for i in 0...@texts.size
  258.       rect = Rect.new(SKIN_SIZE, i*line_height+SKIN_SIZE, @base_sprite.width, line_height)
  259.       text = @texts[i]
  260.       @base_sprite.bitmap.draw_text(rect, text)
  261.     end
  262.   end
  263. end

  264. #==============================================================================
  265. # ■ Game_Event
  266. #==============================================================================
  267. class Game_Event < Game_Character
  268.   #--------------------------------------------------------------------------
  269.   # ◎ 定义实例变量
  270.   #--------------------------------------------------------------------------
  271.   attr_reader   :name                    # 事件名称
  272.   attr_accessor :roadsign                # 路牌标志
  273.   #--------------------------------------------------------------------------
  274.   # ◎ 刷新
  275.   #--------------------------------------------------------------------------
  276.   alias old_refresh refresh
  277.   def refresh
  278.     # 事件名称
  279.     @name = @event.name
  280.     # 路牌
  281.     @roadsign = ''
  282.     old_refresh
  283.   end
  284.   #-------------------------------------------------------------------------
  285.   # ○ 读取路牌指定字段
  286.   #     section : 字段名
  287.   #     ignore_caps : 忽略大小写(仅字段名)
  288.   #-------------------------------------------------------------------------
  289.   def read_roadsign(section, ignore_caps = false)
  290.     result = ''
  291.     # 忽略大小写时,全部转大写
  292.     section.upcase! if ignore_caps
  293.     # 转symbol方便比较
  294.     s = section.to_sym
  295.     @roadsign.each_line{|line|
  296.       temp = line.split(/=/)
  297.       # 去掉干扰字符
  298.       temp.each {|i| i.strip!}
  299.       temp[0].upcase! if ignore_caps
  300.       if temp[0].to_sym == s
  301.         unless temp[1] == nil
  302.           result = temp[1]
  303.         end
  304.         # 如果希望同名字段值覆盖前面的字段,去掉下一行
  305.         break
  306.       end
  307.     }
  308.     return result
  309.   end
  310. end

  311. #==============================================================================
  312. # ■ Game_Player
  313. #==============================================================================
  314. class Game_Player < Game_Character
  315.   #--------------------------------------------------------------------------
  316.   # ◎ 刷新画面
  317.   #--------------------------------------------------------------------------
  318.   alias old_update update
  319.   def update
  320.     old_update
  321.     # 路牌窗体刷新
  322.     unless @roadsign_sprite == nil or @roadsign_sprite.disposed?
  323.       @roadsign_sprite.update
  324.     end
  325.   end
  326.   #--------------------------------------------------------------------------
  327.   # ◎ 增加步数
  328.   #--------------------------------------------------------------------------
  329.   alias old_increase_steps increase_steps
  330.   def increase_steps
  331.     old_increase_steps
  332.     # 路牌操作
  333.     setup_roadsign_spriteset
  334.   end
  335.   #--------------------------------------------------------------------------
  336.   # ○ 显示路牌
  337.   #--------------------------------------------------------------------------
  338.   def setup_roadsign_spriteset
  339.     name = roadsign_name
  340.     return if name == "" or name == @old_name
  341.     @old_name = name
  342.     event = get_event(name)
  343.     return if event == nil
  344.     roadsign_event = setup_roadsign_event(event)
  345.     return if roadsign_event == nil
  346.     # 生成路牌窗体
  347.     if @roadsign_sprite == nil or @roadsign_sprite.disposed?
  348.       @roadsign_sprite = Spriteset_Roadsign.new(roadsign_event)
  349.     end
  350.   end
  351.   #--------------------------------------------------------------------------
  352.   # ○ 设置路牌
  353.   #     event   : 事件(Game_Map内部)
  354.   #--------------------------------------------------------------------------
  355.   def setup_roadsign_event(event)
  356.     return if event.list == nil
  357.     for line in event.list
  358.       if line.code == 108 or 408
  359.         unless line.parameters.empty?
  360.           event.roadsign += line.parameters.to_s + "\r\n"
  361.         end
  362.       end
  363.     end
  364.     return event
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # ○ 查找路牌名称
  368.   #--------------------------------------------------------------------------
  369.   def roadsign_name
  370.     for area in $data_areas.values
  371.       return area.name if $game_player.in_area?(area)
  372.     end
  373.     @old_name = ""
  374.     return @old_name
  375.   end
  376.   #--------------------------------------------------------------------------
  377.   # ○ 获取事件
  378.   #     event_name   : 事件名
  379.   #--------------------------------------------------------------------------
  380.   def get_event(event_name)
  381.     $game_map.events.each_value {|event|
  382.     return event if event.name == event_name}
  383.     return nil
  384.   end
  385. end
复制代码


提示消息使用的皮肤(类似窗体皮肤)
三个文件:一个主窗体,两个箭头


写在事件注释里的格式:



效果截图:






《黑暗圣剑传说2 序章》(柳柳)效果对比


范例工程里的地图是从原汇人工作室提供的地图包里随便抽的,作者不详
>>点击此处下载范例工程<<

阿桑奇不是一个偶像;阿桑奇是一种思想

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
2077
在线时间
3473 小时
注册时间
2006-9-6
帖子
37329

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

发表于 2008-10-2 02:36:49 | 显示全部楼层
截图中效果倒是很简陋……
Lofter个站:点击进入吧 不要犹豫了come on baby! (闲水、游戏预告、游戏发布)

回复 支持 反对

使用道具 举报

Lv1.梦旅人

穿越一季:朔

梦石
0
星屑
50
在线时间
333 小时
注册时间
2007-4-11
帖子
5369

贵宾

发表于 2008-10-2 02:44:31 | 显示全部楼层
我比较喜欢这个效果..但貌似感觉不怎么完美{/gg}个人眼光
6R复活?别扯淡了.

柳柳一旦接手66RPG,我果断呵呵啊。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2008-1-15
帖子
280
发表于 2008-10-2 02:57:43 | 显示全部楼层
沉影永远都是创新的作者{/fd}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2007-5-27
帖子
2560

第1届Title华丽大赛新人奖

 楼主| 发表于 2008-10-2 04:39:38 | 显示全部楼层
以下引用越前リョーマ于2008-10-1 18:36:49的发言:
截图中效果倒是很简陋……
以下引用塑望于2008-10-1 18:44:31的发言:
我比较喜欢这个效果..但貌似感觉不怎么完美个人眼光
请您想像中的效果长啥样?

此效果完全仿《黑暗圣剑2》的宣传图


原帖:
http://rpg.blue/viewthread.php?tid=77601

阿桑奇不是一个偶像;阿桑奇是一种思想

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
383 小时
注册时间
2007-7-27
帖子
4106

开拓者

发表于 2008-10-2 06:53:06 | 显示全部楼层
汗……不是ff12效果,ff12只是有npc响应而已……
吸吸
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
2077
在线时间
3473 小时
注册时间
2006-9-6
帖子
37329

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

发表于 2008-10-2 07:09:24 | 显示全部楼层
以下引用沉影不器于2008-10-1 20:39:38的发言:


以下引用越前リョーマ于2008-10-1 18:36:49的发言:
截图中效果倒是很简陋……

以下引用塑望于2008-10-1 18:44:31的发言:
我比较喜欢这个效果..但貌似感觉不怎么完美个人眼光

请您想像中的效果长啥样?

此效果完全仿《黑暗圣剑2》的宣传图


原帖:
http://rpg.blue/viewthread.php?tid=77601

应该是字体问题……
Lofter个站:点击进入吧 不要犹豫了come on baby! (闲水、游戏预告、游戏发布)

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
6 小时
注册时间
2008-9-28
帖子
103
发表于 2008-10-2 07:31:28 | 显示全部楼层
以下引用沉影不器于2008-10-1 20:39:38的发言:


以下引用越前リョーマ于2008-10-1 18:36:49的发言:
截图中效果倒是很简陋……

以下引用塑望于2008-10-1 18:44:31的发言:
我比较喜欢这个效果..但貌似感觉不怎么完美个人眼光

请您想像中的效果长啥样?

此效果完全仿《黑暗圣剑2》的宣传图


原帖:
http://rpg.blue/viewthread.php?tid=77601

看出来了...
生命在于运动,坑化有益健康……我的游戏什么时候才能完工啊!! >_<
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-9-28
帖子
11
发表于 2008-10-2 08:16:21 | 显示全部楼层
以下引用越前リョーマ于2008-10-1 23:09:24的发言:
应该是字体问题…

我也覺得…{/fd}
( a + b )^2 = a^2 + 2ab + b^2 (囧 + 冏)^2 = 囧^2 + 2囧冏+ 冏^2
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2007-5-27
帖子
2560

第1届Title华丽大赛新人奖

 楼主| 发表于 2009-6-12 08:00:00 | 显示全部楼层
以下引用trentswd于2008-10-1 22:53:06的发言:
汗……不是ff12效果,ff12只是有npc响应而已……
那就是空之轨迹了...

以下引用越前リョーマ于2008-10-1 23:09:24的发言:
应该是字体问题……

字体各类效果在脚本中都可以自定义,皮肤嫌朴素也可以自定义


我自己的游戏工程里,区域名称填写事件id,整理发布时改成填事件名称,其实自己觉得id更方便

阿桑奇不是一个偶像;阿桑奇是一种思想

回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-1-19 08:37

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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