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

Project1

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

恶魔城探索地图系统V0.30版(追加显示地图探索百分比)

 关闭 [复制链接]

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
跳转到指定楼层
1
发表于 2008-4-20 03:06:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
前言:
很久以前sizz123发过探索地图的教程(http://rpg.blue/web/htm/news903.htm)
我参考他数组的作法,透过数组是否有角色移动过的坐标,然后看看有没有重复的坐标,我就应用这些数据做出这样的成果。

★由於本系统对地图的制作要求很高,使用时请密切注意相关制作注意事项!

【恶魔城探索地图系统】地图绘制技巧图文教学:
http://rpg.blue/viewthread.php?tid=87441


■ RPG恶魔城探索地图V0.30版

适宜用户:
恶魔城RPG同人作品

使用效果:
"該张地图"有地图恶魔城探索的效果






使用注意事项:
地图的大小(高宽)设定时要按比例设定
探索地图格数大小是        宽:64格  ;高:48格
游戏基本地图单位大小是    宽:20    ;高:15
地图的大小(高宽)高宽设定范例 :
宽:40  => 20*2(倍)
高:30  => 15*2(倍)

宽:80  => 20*4(倍)
高:30  => 15*2(倍)

探索地图名字取決于"该地图ID***的名称"
查看探索地图时,要调用 $scene = Castlevania_Map.new

是否生成方格图片 由
SW_NUMBER = (true代表生成 / false代表不生成)  
方便控制

控制角色位置点表现方式(true代表闪光动画/false代表红点)
SW_Animation = true
如果SW_Animation设为true,动画的ID編號在这里设置
ID_Animation = 102

MAX_BLOCK 设置全部地图之探索的总和最大格数(地图显示百分比使用)
SW_MAXBLOCK 控制是否生显示百分比 (true代表显示 / false代表不显示)

建议:
纪录点最好设置在地图通道的端側 (不要放在路叉口处),要不然看起来怪怪的= =。
通道与通道之间最好不要设置的太靠近
(X方向最好相差20格以上;Y方向最好相差15格以上)。


如果想用闪光动画,下载"范例工程",
范例工程的动画数据库里有 (动画的ID編號102)光点动画
直接复制到你的动画数据库里即可。

TERRAIN 为纪录点区域地形(地面)标志设置
TERRAIN=1則代表只要经过地形标志为1的地方,就可生成纪录点紅色区域


(4/20)V0.02版(更新)
大大感谢禾西修改更新脚本
(1)突破 场所移动后记忆当前该张探索地图
(2)场所移动前不再需要每次调用$game_variables.ma.clear

(4/22)V0.05版(更新)
(3)显示该张探索地图名字

(4/24)V0.06版(无聊的更新)
(4)注解简体化

(4/25)V0.07版(更新)
(5)由 SW_NUMBER 方便控制是否生成方格图片

(4/26)V0.10版(更新)
(6)不需要再并行处理 $game_variables.blue

(4/27)V0.20版(更新)
感谢禾西的循环动画的脚本提供参考
(7)增加角色位置光点动画(如同 恶魔城-月下 角色位置光点效果)

(4/27)V0.21版(更新)
(8)光点动画位置矫正误差
(9)简化Scene_Map追加定义

(5/1)V0.25版(更新)
(10)可生成纪录点紅色区域

(5/2)V0.26版(更新)
感谢禾西脚本效率化
(11)脚本效率化

(5/10)V0.28版(更新)
(12)地图白色边缘拓展化,取消方格式图片地图拓展。

(5/18)V0.30版(更新)
(13)追加显示地图探索百分比功能。

把此脚本貼在Main前面

  1. #==============================================================================
  2. # ■ RPG恶魔城探索地图V0.30版  (By TERENCE龙皇)
  3. #------------------------------------------------------------------------------
  4. # 使用效果:
  5. # "該张地图"有地图恶魔城探索的效果
  6. #
  7. # 使用注意事项:
  8. # 地图的大小(高宽)设定时要按比例设定
  9. # 探索地图格数大小是            宽:64格;高:48格
  10. # 游戏基本地图单位大小是    宽:20    ;高:15
  11. # 地图的大小(高宽)高宽设定范例 :
  12. # 宽:40  => 20*2(倍)
  13. # 高:30  => 15*2(倍)

  14. # 宽:80  => 20*4(倍)
  15. # 高:30  => 15*2(倍)
  16. #
  17. # 探索地图名字取決于"该地图ID***的名称"
  18. # 查看探索地图时,要调用 $scene = Castlevania_Map.new
  19. #
  20. # 建议:
  21. # 纪录点最好设置在地图通道的端側 (不要放在路叉口处),要不然看起来怪怪的= =。
  22. # 通道与通道之间最好不要设置的太靠近
  23. # (X方向最好相差20格以上;Y方向最好相差15格以上)。
  24. #==============================================================================
  25. MAX_BLOCK = 126   #全部地图之探索的总和最大格数  (地图显示百分比使用)
  26. SW_MAXBLOCK = true  #控制是否生显示百分比 (true代表显示 / false代表不显示)

  27. STAR_X = 21       #探索该张地图左上起始X座标格
  28. STAR_Y = 15       #探索该张地图左上起始Y座标格

  29. WHITE_BOTTOM = "Graphics/Pictures/White"      #白底边图片
  30. BLUE_PLACE = "Graphics/Pictures/Blue"      #经过区域图片
  31. RED_PLACE  = "Graphics/Pictures/Red"       #纪录点区域图片
  32. RED_POINT  = "Graphics/Pictures/Point"     #角色红点图片
  33. SQUARE     = "Graphics/Pictures/未命名1"   #方格(OR背景)图片

  34. Castlename_X = 380       #探索该张地图名称矩形左上顶点X座标
  35. Castlename_Y = 20        #探索该张地图名称矩形左上顶点Y座标
  36. Castlename_W = 220       #探索该张地图名称矩形宽
  37. Castlename_H = 60        #探索该张地图名称矩形高

  38. Castle_OPACITY_1 = 244        #边框透明度
  39. Castle_OPACITY_2 = 144        #背景透明度
  40. Castle_OPACITY_3 = 255        #文字透明度

  41. # 地图名字的颜色
  42. Castle_TEXTCOLOR = Color.new(255, 255, 255, 255)

  43. SW_NUMBER = false     # 控制是否生成方格图片(true代表生成 / false代表不生成)

  44. SW_Animation = true   # 控制角色位置点表现方式(true代表闪光动画  / false代表红点)
  45. ID_Animation = 102    # 如果SW_Animation设为true,动画的ID編號在这里设置

  46. TERRAIN = 1    # 纪录点区域地形(地面)标志设置

  47. #==============================================================================
  48. # ■ Sprite_Animation
  49. #------------------------------------------------------------------------------
  50. #  循环动画 (角色位置闪光点)。(By 禾西)
  51. #==============================================================================
  52. class Sprite_Animation < RPG::Sprite
  53.   #--------------------------------------------------------------------------
  54.   # ● 取得动画ID
  55.   #--------------------------------------------------------------------------
  56.   attr_accessor :id
  57.   attr_accessor :pause
  58.   attr_accessor :visible
  59.   #--------------------------------------------------------------------------
  60.   # ● 初始化物件
  61.   #     viewport : 显示连接埠
  62.   #--------------------------------------------------------------------------
  63.   def initialize(x=0,y=0,z=1000)
  64.     @viewport = Viewport.new(0, 0, 640, 480)
  65.     super(@viewport)
  66.     self.id = 0
  67.     self.pause   = false
  68.     self.visible = true
  69.     # 设定活动区块的座标
  70.     self.x = x
  71.     self.y = y
  72.     self.z = z
  73.     update
  74.   end
  75.   #--------------------------------------------------------------------------
  76.   # ● 更新画面
  77.   #--------------------------------------------------------------------------
  78.   def update
  79.     return unless self.id > 0
  80.     if self.visible
  81.       return if self.pause
  82.       animation = $data_animations[self.id]
  83.       loop_animation(animation) unless animation == nil
  84.     else
  85.       dispose_loop_animation
  86.     end
  87.     super
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 释放
  91.   #--------------------------------------------------------------------------
  92.   def dispose
  93.     (self.bitmap.dispose) unless (self.bitmap == nil)
  94.     @viewport.dispose
  95.     super
  96.   end
  97. end
  98. #==============================================================================
  99. # ■ Game_Variables
  100. #------------------------------------------------------------------------------
  101. #  处理变数的类别。(追加定义)
  102. #==============================================================================
  103. class Game_Variables
  104.   attr_accessor:location
  105.   attr_accessor:savelocate
  106.   #--------------------------------------------------------------------------
  107.   # ● 初始化
  108.   #--------------------------------------------------------------------------
  109.   def initialize
  110.     @data = []
  111.     @location   = []
  112.     @savelocate = []
  113.     @cvpoint_x = STAR_X
  114.     @cvpoint_y = STAR_Y
  115.   end
  116.   def blue(map_id=$game_map.map_id)
  117.    # 规划探索地图方格及角色红点位置
  118.    save_x=(@cvpoint_x+$game_player.x*32/640)*10
  119.    save_y=(@cvpoint_y+$game_player.y*32/480)*10
  120.    
  121.    # 数组中是否有当前座标,没有则把座标推到数组中
  122.    @location[map_id]||=[]
  123.     unless @location[map_id].include?([save_x,save_y])
  124.       @location[map_id].push([save_x,save_y])
  125.     end
  126.    
  127.    # 数组中是否有当前"纪录点"座标,没有则把座标推到数组中
  128.    @savelocate[map_id]||=[]
  129.     unless (@savelocate[map_id].include?([save_x,save_y])) or
  130.            ($game_map.terrain_tag($game_player.x, $game_player.y) != TERRAIN)
  131.       @savelocate[map_id].push([save_x,save_y])
  132.     end
  133.   end
  134. end
  135. #==============================================================================
  136. # ■ Castlevania_Map
  137. #------------------------------------------------------------------------------
  138. #  处理探索地图画面的类别。
  139. #==============================================================================
  140. class Castlevania_Map
  141.   #--------------------------------------------------------------------------
  142.   # ● 初始化标志
  143.   #--------------------------------------------------------------------------
  144.   def initialize  
  145.    @cvpoint_x = STAR_X
  146.    @cvpoint_y = STAR_Y
  147.   end  
  148.   #--------------------------------------------------------------------------
  149.   # ● 主处理
  150.   #--------------------------------------------------------------------------
  151.   def main
  152.     blueback = []
  153.     whiteback = []
  154.     # 获取地图ID
  155.     id = $game_map.map_id
  156.    
  157.     # 生成方格(OR背景)图片
  158.     if SW_NUMBER
  159.       black = Sprite.new
  160.       black.bitmap = Bitmap.new(SQUARE)
  161.       black.x = 0
  162.       black.y = 0
  163.     end
  164.     x = (@cvpoint_x+$game_player.x*32/640)*10
  165.     y = (@cvpoint_y+$game_player.y*32/480)*10
  166.     $game_variables.location[id]||=[[x,y]]
  167.     $game_variables.savelocate[id]||=[]
  168.    
  169.     # 生成白底边图片
  170.     $game_variables.location[id].each do |loc|
  171.       whiteback << Sprite.new
  172.       whiteback[-1].bitmap = Bitmap.new(WHITE_BOTTOM)
  173.       whiteback[-1].x = loc[0]-1
  174.       whiteback[-1].y = loc[1]-1
  175.     end

  176.     # 生成蓝色到过的区域图片
  177.     $game_variables.location[id].each do |loc|
  178.       blueback << Sprite.new
  179.       # 判断该区是否是纪录点区域,改变生成紅色到过的区域图片
  180.       if $game_variables.savelocate[id].include?(loc)
  181.         blueback[-1].bitmap = Bitmap.new(RED_PLACE)
  182.       else
  183.         blueback[-1].bitmap = Bitmap.new(BLUE_PLACE)
  184.       end
  185.       blueback[-1].x = loc[0]
  186.       blueback[-1].y = loc[1]
  187.     end

  188.     if SW_Animation
  189.       # 生成角色闪光点循环动画
  190.       @point = Sprite_Animation.new
  191.       @point.id = ID_Animation
  192.       @point.x = 4 + x
  193.       @point.y = 3 + y
  194.     else
  195.       # 生成角色红点图片
  196.       @point = Sprite.new
  197.       @point.bitmap = Bitmap.new(RED_POINT)
  198.       @point.x = x
  199.       @point.y = y
  200.     end

  201.     # 生成探索区域地图名称视窗
  202.     cvname = Castlevania_Mapname.new
  203.     cvname.narrate
  204.    
  205.     if SW_MAXBLOCK
  206.     # 生成探索地图百分比
  207.       cvpercent = Castlevania_Percentage.new
  208.       cvpercent.recount
  209.     end

  210.     Graphics.transition
  211.     # 主循环
  212.     loop do
  213.       # 更新游戏画面
  214.       Graphics.update
  215.       # 更新输入讯息
  216.       Input.update
  217.       # 更新画面
  218.       update
  219.       # 如果切换画面就中断循环
  220.       break if $scene != self
  221.     end
  222.     # 准备过渡
  223.     Graphics.freeze
  224.     @point.bitmap.dispose unless SW_Animation
  225.     @point.dispose
  226.      cvname.dispose
  227.       
  228.     # 释放探索地图百分比   
  229.      cvpercent.dispose if SW_MAXBLOCK
  230.    
  231.     # 释放方格(OR背景)图片
  232.     if SW_NUMBER
  233.       black.bitmap.dispose
  234.       black.dispose
  235.     end
  236.    
  237.     blueback.each{|one|one.dispose;
  238.                        one.bitmap.dispose}
  239.     whiteback.each{|one|one.dispose;
  240.                          one.bitmap.dispose}
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● 更新画面
  244.   #--------------------------------------------------------------------------
  245.   def update
  246.     @point.update if SW_Animation
  247.     if Input.trigger?(Input::B)
  248.       # 演奏取消 SE
  249.       $game_system.se_play($data_system.cancel_se)
  250.       # 切换的地图画面
  251.       $scene = Scene_Map.new
  252.       # 释放标志图形
  253.       return
  254.     end
  255.   end
  256. end
  257. #==============================================================================
  258. # ■ Castlevania_Mapname
  259. #------------------------------------------------------------------------------
  260. #  显示该张探索地图名字(该地图ID的名称)的窗口。
  261. #==============================================================================
  262. class Castlevania_Mapname < Window_Base
  263.   def initialize
  264.     super(Castlename_X , Castlename_Y, Castlename_W, Castlename_H)
  265.     # 初始化窗口透明度
  266.     self.opacity = Castle_OPACITY_1
  267.     self.back_opacity = Castle_OPACITY_2
  268.     self.contents_opacity = Castle_OPACITY_3
  269.     self.contents = Bitmap.new(width - 32, height - 32)
  270.   end
  271.   def narrate
  272.     # 获取地图ID
  273.     id = $game_map.map_id
  274.     self.contents.clear
  275.     self.contents.font.color = Castle_TEXTCOLOR
  276.     # 描绘地图名
  277.     self.contents.draw_text(4, 0 , width - 40, 32, $data_mapinfos[id].name, 1)
  278.   end
  279. end
  280. #==============================================================================
  281. # ■ Castlevania_Percentage
  282. #------------------------------------------------------------------------------
  283. #  探索地图百分比的窗口。
  284. #==============================================================================
  285. class Castlevania_Percentage < Window_Base
  286.   def initialize
  287.     super(-70 , -5, 220, 60)
  288.     # 初始化窗口透明度
  289.     self.opacity = 0
  290.     self.back_opacity = 0
  291.     self.contents_opacity = 255
  292.     self.contents = Bitmap.new(width - 32, height - 32)
  293.   end
  294.   def recount
  295.    
  296.     # 运算探索过的格数
  297.     block=0
  298.     for i in 2..$game_variables.location.size
  299.        block+=$game_variables.location[i-1].size
  300.     end
  301.      
  302.     # 百分比运算
  303.     percent = block*100/MAX_BLOCK
  304.    
  305.     self.contents.clear
  306.     self.contents.font.color =Color.new(255, 255, 255, 255)
  307.     # 描绘地图名
  308.     self.contents.draw_text(4, 0 , width - 40, 32, percent.to_s+"%", 1)
  309.   end
  310. end
  311. #==============================================================================
  312. # ■ Scene_Title
  313. #------------------------------------------------------------------------------
  314. #  处理标题画面的类别。(追加定义)
  315. #==============================================================================
  316. class Scene_Title
  317.   alias smn_main main
  318.   def main
  319.     # 获取地图信息文件
  320.     $data_mapinfos = load_data("Data/MapInfos.rxdata")
  321.     smn_main
  322.   end
  323. end
  324. #==============================================================================
  325. # ■ Scene_Map
  326. #------------------------------------------------------------------------------
  327. #  处理地图画面的类别。(追加定义)
  328. #==============================================================================
  329. class Scene_Map
  330.   alias ori_up update
  331.   def update
  332.     # 追加处理 $game_variables.blue
  333.     $game_variables.blue if $game_player.moving?
  334.     ori_up
  335.   end
  336. end
复制代码

范例工程:
http://rpg.blue/UP_PIC/200801/� ... �图系统V0.30.rar
恶魔城探索地图素材包:
http://rpg.blue/UP_PIC/200801/恶魔城探索地图素材包.rar


{/gg}我忘了说明了~~索地图素材图片有更改,使用前请下载更新

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
头像被屏蔽

Lv1.梦旅人 (禁止发言)

帅无敌

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-7-23
帖子
1313
2
发表于 2008-4-20 06:19:15 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
3
 楼主| 发表于 2008-4-20 06:45:35 | 只看该作者
                                  自我屏蔽                                 

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

4
发表于 2008-4-20 13:42:24 | 只看该作者
用多維數組咩~
現在你的數組是:
ma = [[x,y],[x,y],[x,y]....]
變成:
ma = [ [[x,y],[x,y],[x,y]...] , [[x,y],[x,y],[x,y]...] , [[x,y],[x,y],[x,y]...]....]
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
5
 楼主| 发表于 2008-4-20 17:19:42 | 只看该作者
以下引用禾西于2008-4-20 5:42:24的发言:

用多維數組咩~
現在你的數組是:
ma = [[x,y],[x,y],[x,y]....]
變成:
ma = [ [[x,y],[x,y],[x,y]...] , [[x,y],[x,y],[x,y]...] , [[x,y],[x,y],[x,y]...]....]

恩~~~我大概知道了,谢谢禾西的思路,
大概用角色当前地图ID判断在哪个数组中,

但是另外一种情况是场所移动后不调用 $game_variables.ma.clear
仍是该张探索地图,只是起始座标格要变一下,

但要把这两种功能结合在一起就好像有点困难.....

(不过我还是先突破场所移动后记忆当前该张地图好了{/tp})

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

6
发表于 2008-4-20 17:26:24 | 只看该作者
其實用hash表可能更加方便。直接用
{0=>[[x,y],[x,y]...],1=>[[x,y],[x,y]...]...}
但是另外一种情况是场所移动后不调用 $game_variables.ma.clear
仍是该张探索地图,只是起始座标格要变一下,

不明白……
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
7
 楼主| 发表于 2008-4-20 18:16:59 | 只看该作者
以下引用禾西于2008-4-20 9:26:24的发言:

不明白……

场所移动后
不清除蓝色到过的区域图片

(也就是同一层楼的探索地图)

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

第1届Title华丽大赛新人奖

8
发表于 2008-4-20 19:51:03 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
9
 楼主| 发表于 2008-4-20 19:59:53 | 只看该作者
以下引用沉影不器于2008-4-20 11:51:03的发言:

用哈希,元素太多时效率可能会锐减...我猜的...哈希元素没顺序,在哈希中找元素估计是二分法遍历整个哈希

要是数组的话,可以直接用index定位,介个顺序储存的好处.

坐标是整数,二维不是可以用Table吗?

楼上几位啥时候转向vx算了,vx里似乎可以利用area更轻松实现

{/kuk}坚持RMXP

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
10
 楼主| 发表于 2008-4-20 22:34:22 | 只看该作者
{/gg}我囧了~~~
{/yun}利用 多維數組 做不出场所移动后记忆当前该张地图

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 04:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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