幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1245|回复: 1

[分享]地图传送

[复制链接]

3

主题

232

帖子

583

积分

⑤进阶

哇咔咔~传说中的称号.

积分
583
发表于 2006-11-27 21:35:16 | 显示全部楼层 |阅读模式
[s:2] 很简单的哈希表运用``~  
  1. class Game_System
  2.   attr_accessor :save_map                 
  3.   alias int initialize
  4.   def initialize
  5.     int
  6.     @save_map = {}
  7.   end
  8.   def map_push(id,x,y)
  9.     $game_system.save_map[id] = [x,y]
  10.   end
  11. end
  12. class Window_Map < Window_Selectable
  13.   def initialize
  14.     super(160, 64, 320, 256)
  15.     @column_max = 4
  16.     @map_data = load_data("Data/MapInfos.rxdata")
  17.     refresh
  18.     self.index = 0
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 获取地图ID
  22.   #--------------------------------------------------------------------------
  23.   def map_id
  24.     return @data[self.index]
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 刷新
  28.   #--------------------------------------------------------------------------
  29.   def refresh
  30.     if self.contents != nil
  31.       self.contents.dispose
  32.       self.contents = nil
  33.     end
  34.     @data = []
  35.     data = $game_system.save_map.keys.sort!
  36.     for keys in data#$game_system.save_map.keys
  37.       if keys != nil
  38.         @data.push(keys)
  39.       end
  40.     end
  41.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
  42.     @item_max = @data.size
  43.     if @item_max > 0
  44.       self.contents = Bitmap.new(width - 32, row_max * 56)
  45.       for i in 0...@item_max
  46.         draw_item(i)
  47.       end
  48.     end
  49.   end
  50.   #--------------------------------------------------------------------------
  51.   # ● 描绘项目
  52.   #     index : 项目编号
  53.   #--------------------------------------------------------------------------
  54.   def draw_item(index)
  55.     map = @data[index]
  56.     x = index % @column_max * 70+20
  57.     y = index / @column_max * 56
  58.     self.contents.font.size = 13
  59.     self.contents.draw_text(x - 88, y+32, 204, 13, @map_data[map].name, 1)
  60.   end
  61.   #--------------------------------------------------------------------------
  62.   # ● 更新光标举行
  63.   #--------------------------------------------------------------------------
  64.   def update_cursor_rect
  65.     # 光标位置不满 0 的情况下
  66.     if @index < 0
  67.       self.cursor_rect.empty
  68.       return
  69.     end
  70.     # 获取当前的行
  71.     row = @index / @column_max
  72.     # 当前行被显示开头行前面的情况下
  73.     if row < self.top_row
  74.       # 从当前行向开头行滚动
  75.       self.top_row = row
  76.     end
  77.     # 当前行被显示末尾行之后的情况下
  78.     if row > self.top_row + (self.page_row_max - 1)
  79.       # 从当前行向末尾滚动
  80.       self.top_row = row - (self.page_row_max - 1)
  81.     end
  82.     # 计算光标的宽
  83.     cursor_width = self.width / @column_max - 70#32
  84.     # 计算光标坐标
  85.     x = @index % @column_max * 70#(cursor_width + 32)
  86.     y = @index / @column_max * 56 - self.oy
  87.     # 更新国标矩形
  88.     self.cursor_rect.set(x, y, 70, 56)
  89.   end
  90.   #--------------------------------------------------------------------------
  91.   # ● 获取开头行
  92.   #--------------------------------------------------------------------------
  93.   def top_row
  94.     # 将窗口内容的传送源 Y 坐标、1 行的高 32 等分
  95.     return self.oy / 56
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 设置开头行
  99.   #     row : 显示开头的行
  100.   #--------------------------------------------------------------------------
  101.   def top_row=(row)
  102.     # row 未满 0 的场合更正为 0
  103.     if row < 0
  104.       row = 0
  105.     end
  106.     # row 超过 row_max - 1 的情况下更正为 row_max - 1
  107.     if row > row_max - 1
  108.       row = row_max - 1
  109.     end
  110.     # row 1 行高的 32 倍、窗口内容的传送源 Y 坐标
  111.     self.oy = row * 56
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ● 获取 1 页可以显示的行数
  115.   #--------------------------------------------------------------------------
  116.   def page_row_max
  117.     # 窗口的高度,设置画面的高度减去 32 ,除以 1 行的高度 32
  118.     return (self.height - 32) / 56
  119.   end
  120. end
  121. class Scene_Move_Map
  122.   #--------------------------------------------------------------------------
  123.   # ● 主处理
  124.   #--------------------------------------------------------------------------
  125.   def main
  126.     @map = Spriteset_Map.new
  127.     @map_window = Window_Map.new
  128.     # 执行过渡
  129.     Graphics.transition
  130.     # 主循环
  131.     loop do
  132.       # 刷新游戏画面
  133.       Graphics.update
  134.       # 刷新输入情报
  135.       Input.update
  136.       # 刷新画面
  137.       update
  138.       # 如果画面切换的话就中断循环
  139.       if $scene != self
  140.         break
  141.       end
  142.     end
  143.     # 准备过渡
  144.     Graphics.freeze
  145.     # 释放窗口
  146.     @map.dispose
  147.     @map_window.dispose
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ● 刷新画面
  151.   #--------------------------------------------------------------------------
  152.   def update
  153.     # 刷新命令窗口
  154.     @map_window.update
  155.     # 按下 B 键的情况下
  156.     if Input.trigger?(Input::B)
  157.       # 演奏取消 SE
  158.       $game_system.se_play($data_system.cancel_se)
  159.       # 切换到菜单画面
  160.       $scene = Scene_Map.new
  161.       return
  162.     end
  163.     # 按下 C 键的场合下
  164.     if Input.trigger?(Input::C)
  165.       id = @map_window.map_id
  166.       if id != nil
  167.       x = $game_system.save_map[id][0]
  168.       y = $game_system.save_map[id][1]
  169.       move(id,x,y)
  170.       $scene = Scene_Map.new
  171.       end
  172.       return
  173.     end
  174.   end
  175.   #--------------------------------------------------------------------------
  176.   # ● 主角的场所移动
  177.   #--------------------------------------------------------------------------
  178.   def move(id,x,y)
  179.     # 清除主角场所移动调试标志
  180.     $game_temp.player_transferring = false
  181.     if $game_map.map_id != id
  182.       $game_map.setup(id)
  183.     end
  184.     $game_player.moveto(x, y)
  185.     $game_player.turn_down
  186.     $game_player.straighten
  187.     $game_map.update
  188.     if $game_temp.transition_processing
  189.       # 清除过渡处理中标志
  190.       $game_temp.transition_processing = false
  191.       # 执行过渡
  192.       Graphics.transition(20)
  193.     end
  194.     # 执行地图设置的 BGM、BGS 的自动切换
  195.     $game_map.autoplay
  196.     # 设置画面
  197.     Graphics.frame_reset
  198.     # 刷新输入信息
  199.     Input.update
  200.   end
  201. end
复制代码

就是地图传送什么的````` [s:2] 越来越喜欢这种窗口的排版了```
这个只是显示了地图名字而已```
自己尝试把地图图标加进去吧``` [s:4]

要添加地图的话就这样
$game_system.map_push(id,x,y)
比如去到一个新的城镇或者某个地方的传送石什么的``````就可以这样添加
调用方法为
$scene = Scene_Move_Map.new
回复

使用道具 举报

好人卡的 该用户已被删除
发表于 2006-11-27 23:11:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2025-6-27 16:25 , Processed in 0.010015 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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