查看: 4285|回复: 4

[原创发布] 另一种小地图显示 ver 1

[复制链接]

○赛

梦石
0
星屑
1254
在线时间
1276 小时
注册时间
2013-1-22
回帖
2078

贵宾

发表于 2015-9-13 13:49:37 | 显示全部楼层 |阅读模式

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

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

×
先附上效果图。
jietu.png
就是这个样子,虽然这张图片里面NPC和蓝点不一致,但是是截图的原因,实际上没有问题……
脚本
  1. class Window_MiniMap < Window_Base
  2.   def initialize
  3.     super(0,0,$game_map.width * 8+32 ,$game_map.height * 8+32)
  4.     self.contents = Bitmap.new(width - 32, height - 32)
  5.     self.x = 640 - self.width
  6.     self.opacity = 120
  7.     refresh
  8.   end
  9.   def update
  10.     super
  11.     refresh
  12.   end
  13.   def refresh
  14.     self.contents.clear
  15.     self.contents.fill_rect(0,0,self.width,self.height,Color.new(100,100,100,200))
  16.     for i in 0..$game_map.width
  17.       for j in 0..$game_map.height
  18.         if $game_map.passable?(i,j,0)
  19.           self.contents.fill_rect(i*8,j*8,8,8,Color.new(200,200,200,200))
  20.         end
  21.         if (i == $game_player.x)and(j == $game_player.y)
  22.           self.contents.fill_rect(i*8,j*8,8,8,Color.new(230,180,10,200))
  23.         end
  24.         for l in 0..$game_map.events.size
  25.           if not $game_map.events[l].nil? and $game_map.events[l].x == i and $game_map.events[l].y == j
  26.             unless $game_map.events[l].name =~ /无视我/
  27.               self.contents.fill_rect(i*8,j*8,8,8,Color.new(10,150,200,200))
  28.             end
  29.           end
  30.         end
  31.       end
  32.     end
  33.   end
  34. end

  35. class Game_Event < Game_Character
  36.   def name
  37.     return @event.name
  38.   end
  39. end

  40. class Scene_Map
  41.   alias mini_map_main main
  42.   def main
  43.     @mini_map = Window_MiniMap.new
  44.     mini_map_main
  45.     @mini_map.dispose
  46.   end
  47.   alias mini_map_update update
  48.   def update
  49.     @mini_map.update
  50.     if $game_switches[1]
  51.       @mini_map.visible = false
  52.     else
  53.       @mini_map.visible = true
  54.     end
  55.     mini_map_update
  56.   end
  57. end
复制代码

可以说是完全没有优化,而且alias有F12报错的危险……暂时还没有发现bug
然后说下用法。
1.插入脚本到Main前即可生效
2.背景的不透明度在一开始的 self.opacity = 后面改
3.默认1号开关打开时,此窗口消失,1号在$game_switches[1]这里改
4.颜色在Color.new后面的参数里改
5.如果想让事件不显示在小地图上,事件名里面加上“无视我”这三个字

最后说一下,如果有bug我尽量第一时间修复,现在的效果还不是很美观,如果有强力美工能够贡献一些素材就好了~

点评

这么久没人回帖咱也是很伤心啊  发表于 2015-9-13 16:44

无限の剣制

梦石
0
星屑
10445
在线时间
5019 小时
注册时间
2013-2-28
回帖
4942

开拓者贵宾

发表于 2015-9-14 15:20:03 | 显示全部楼层
每帧都在刷新重绘整个小地图=。=
我觉得可以把整个地图的通行度画的比特抹布先缓存下来,小地图上只显示需要的那部分矩形的比特抹布
事件点和需要显示的点再每帧刷新它的位置比较好
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2015-9-14 15:33:19 | 显示全部楼层
感觉这个小地图脚本有点简陋。首先它把地图上所有的东西都用方块代替了,看起来很不是美观的样子。虽然把它换成真正图块差别并不大,但是最好做一下为好。

虽然显示在右上角,但是这个小地图并没有滚动的功能,所以在地图非常大的情况下,小地图窗口会铺满整个界面。小地图的作用是起到缩略和预览的功能,因此显示的区域肯定比屏幕上的要大(20*15)。但是如果太大了挡住屏幕也不太好,总之还是推荐加上自动滚屏功能。

每一步刷新小地图非常的浪费时间,考虑到地图上的前三层都是静止的,只有事件层是变化的,因此可以考虑单独绘制事件层。或者按照AC所说,仅仅绘制需要显示的部分。

这个小地图显示的原理和原有的小地图脚本不太一样。原有小地图脚本是先按照1:1的比例绘制地图的bitmap,然后再使用Bitmap#stretch_blt缩放,这种方法是有一定的风险。因为地图可以很大,直接再绘制一个1:1的bitmap容易发生RGSS停止工作的严重错误。虽然最后的小地图比较节省内存,但是绘制的过程需要的内存还是很多的。但是这个小地图脚本是直接绘制,所以能减少发生上面错误的风险,但是还是需要进一步改进才行。

综上,外观上和性能上都有很大的提升空间,希望楼主能及时更新。
回复

使用道具 举报

梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2015-11-20 20:17:43 | 显示全部楼层
我添加到我的攻城里后,小地图一闪而过就没了

点评

已经能用了。但是好糟糕。地图既不是全图的缩略,也不能卷动。超出的就看不到  发表于 2015-11-20 20:44
我有个initialize的窗口在界面了,所以一闪就没了  发表于 2015-11-20 20:29
还是这种简单的小地图好。不能从小地图上直接看出什么地方有什么,要走过去看  发表于 2015-11-20 20:26
回复

使用道具 举报

梦石
0
星屑
451
在线时间
228 小时
注册时间
2015-2-23
回帖
233
发表于 2015-12-8 16:56:46 | 显示全部楼层
好像很早之前在哪儿见过这样的小地图,但他的刷新方式不一样,只有更换地图后才重新绘制
整个地图的通行,你这样不断的刷新肯定会爆表。
我看到的那个脚本只刷新角色和事件,只是增加了角色和事件移动前坐标的两个变量,角色或事件移动时,把移动前
的坐标位置绘制成能通行的颜色,把现在的坐标绘制成角色和事件对应的颜色,然后移动前的坐标变量等于现在坐标。
制作XP特效,找我。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部