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

Project1

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

RPGXP地图问题

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-9-21
帖子
179
跳转到指定楼层
1
发表于 2008-9-24 03:28:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-9-21
帖子
179
2
 楼主| 发表于 2008-9-24 03:31:09 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

穿越一季:朔

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

贵宾

3
发表于 2008-9-24 03:31:22 | 只看该作者
{/gg}{/gg}{/gg}{/gg}
  1. #==============================================================================
  2. # 本脚本来自www.66rpg.com,使用前请参考制作录像
  3. # 作者:柳柳
  4. #
  5. # 脚本的功能:
  6. #
  7. # 1、设置第二层远景,做遮挡
  8. # 2、设置第三层远景,做通行判定
  9. #    这个通行判定,以图的判定为最高,如果要求某地通行,请把那个地方擦白。
  10. #    本通行判定和录像中讲的方法并不冲突
  11. #==============================================================================
  12. # ■ Spriteset_Map
  13. #------------------------------------------------------------------------------
  14. #  处理地图画面活动块和元件的类。本类在
  15. # Scene_Map 类的内部使用。
  16. #==============================================================================

  17. class Spriteset_Map
  18. #--------------------------------------------------------------------------
  19. # ● 初始化对像
  20. #--------------------------------------------------------------------------
  21. def initialize
  22.    # 生成显示端口
  23.    @viewport1 = Viewport.new(0, 0, 640, 480)
  24.    @viewport2 = Viewport.new(0, 0, 640, 480)
  25.    @viewport3 = Viewport.new(0, 0, 640, 480)
  26.    @viewport2.z = 200
  27.    @viewport3.z = 5000
  28.    # 生成元件地图
  29.    @tilemap = Tilemap.new(@viewport1)
  30.    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  31.    for i in 0..6
  32.      autotile_name = $game_map.autotile_names[i]
  33.      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  34.    end
  35.    @tilemap.map_data = $game_map.data
  36.    @tilemap.priorities = $game_map.priorities
  37.    # 生成远景平面
  38.    @panorama = Plane.new(@viewport1)
  39.    @panorama.z = -1000
  40.    @panorama2 = Plane.new(@viewport1)
  41.    @panorama2.z = 3000
  42.    # 生成雾平面
  43.    @fog = Plane.new(@viewport1)
  44.    @fog.z = 3000
  45.    # 生成角色活动块
  46.    @character_sprites = []
  47.    for i in $game_map.events.keys.sort
  48.      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  49.      @character_sprites.push(sprite)
  50.    end
  51.    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  52.    # 生成天气
  53.    @weather = RPG::Weather.new(@viewport1)
  54.    # 生成图片
  55.    @picture_sprites = []
  56.    for i in 1..50
  57.      @picture_sprites.push(Sprite_Picture.new(@viewport2,
  58.        $game_screen.pictures[i]))
  59.    end
  60.    # 生成计时器块
  61.    @timer_sprite = Sprite_Timer.new
  62.    # 刷新画面
  63.    update
  64. end
  65. #--------------------------------------------------------------------------
  66. # ● 释放
  67. #--------------------------------------------------------------------------
  68. def dispose
  69.    # 释放元件地图
  70.    @tilemap.tileset.dispose
  71.    for i in 0..6
  72.      @tilemap.autotiles[i].dispose
  73.    end
  74.    @tilemap.dispose
  75.    # 释放远景平面
  76.    @panorama.dispose
  77.    @panorama2.dispose
  78.    # 释放雾平面
  79.    @fog.dispose
  80.    # 释放角色活动块
  81.    for sprite in @character_sprites
  82.      sprite.dispose
  83.    end
  84.    # 释放天候
  85.    @weather.dispose
  86.    # 释放图片
  87.    for sprite in @picture_sprites
  88.      sprite.dispose
  89.    end
  90.    # 释放计时器块
  91.    @timer_sprite.dispose
  92.    # 释放显示端口
  93.    @viewport1.dispose
  94.    @viewport2.dispose
  95.    @viewport3.dispose
  96. end
  97. #--------------------------------------------------------------------------
  98. # ● 刷新画面
  99. #--------------------------------------------------------------------------
  100. def update
  101.    # 远景与现在的情况有差异发情况下
  102.    if @panorama_name != $game_map.panorama_name or
  103.       @panorama_hue != $game_map.panorama_hue
  104.      @panorama_name = $game_map.panorama_name
  105.      @panorama_hue = $game_map.panorama_hue
  106.      if @panorama.bitmap != nil        
  107.        @panorama.bitmap.dispose
  108.        @panarama2.bitmap.dispose
  109.        @panorama2.bitmap = nil
  110.        @panarama.bitmap = nil
  111.      end
  112.      if @panorama_name != ""
  113.        if $panorama3 != nil
  114.         $panorama3.dispose
  115.       end
  116.        $panorama3 = Sprite.new
  117.        $panorama3.bitmap = RPG::Cache.panorama(@panorama_name+"_3", @panorama_hue)
  118.        $panorama3.visible = false
  119.        @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  120.        @panorama2.bitmap = RPG::Cache.panorama(@panorama_name+"_2", @panorama_hue)
  121.      end
  122.      Graphics.frame_reset
  123.    end
  124.    # 雾与现在的情况有差异的情况下
  125.    if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  126.      @fog_name = $game_map.fog_name
  127.      @fog_hue = $game_map.fog_hue
  128.      if @fog.bitmap != nil
  129.        @fog.bitmap.dispose
  130.        @fog.bitmap = nil
  131.      end
  132.      if @fog_name != ""
  133.        @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  134.      end
  135.      Graphics.frame_reset
  136.    end
  137.    # 刷新元件地图
  138.    @tilemap.ox = $game_map.display_x / 4
  139.    @tilemap.oy = $game_map.display_y / 4
  140.    @tilemap.update
  141.    # 刷新远景平面
  142.    @panorama.ox = $game_map.display_x / 4
  143.    @panorama.oy = $game_map.display_y / 4
  144.    @panorama2.ox = @panorama.ox
  145.    @panorama2.oy = @panorama.oy
  146.    # 刷新雾平面
  147.    @fog.zoom_x = $game_map.fog_zoom / 100.0
  148.    @fog.zoom_y = $game_map.fog_zoom / 100.0
  149.    @fog.opacity = $game_map.fog_opacity
  150.    @fog.blend_type = $game_map.fog_blend_type
  151.    @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  152.    @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  153.    @fog.tone = $game_map.fog_tone
  154.    # 刷新角色活动块
  155.    for sprite in @character_sprites
  156.      sprite.update
  157.    end
  158.    # 刷新天候图形
  159.    @weather.type = $game_screen.weather_type
  160.    @weather.max = $game_screen.weather_max
  161.    @weather.ox = $game_map.display_x / 4
  162.    @weather.oy = $game_map.display_y / 4
  163.    @weather.update
  164.    # 刷新图片
  165.    for sprite in @picture_sprites
  166.      sprite.update
  167.    end
  168.    # 刷新计时器块
  169.    @timer_sprite.update
  170.    # 设置画面的色调与震动位置
  171.    @viewport1.tone = $game_screen.tone
  172.    @viewport1.ox = $game_screen.shake
  173.    # 设置画面的闪烁色
  174.    @viewport3.color = $game_screen.flash_color
  175.    # 刷新显示端口
  176.    @viewport1.update
  177.    @viewport3.update
  178. end
  179. end
  180. #==============================================================================
  181. # 本脚本来自www.66rpg.com,使用前请参考制作录像
  182. #==============================================================================
  183. #==============================================================================
  184. # ■ Game_Map
  185. #------------------------------------------------------------------------------
  186. #  处理地图的类。包含卷动以及可以通行的判断功能。
  187. # 本类的实例请参考 $game_map 。
  188. #==============================================================================
  189. class Game_Map
  190. attr_accessor :map
  191. attr_accessor :map_id
  192.    #--------------------------------------------------------------------------
  193. # ● 可以通行判定
  194. #     x          : X 坐标
  195. #     y          : Y 坐标
  196. #     d          : 方向 (0,2,4,6,8,10)
  197. #                  ※ 0,10 = 全方向不能通行的情况的判定 (跳跃等)
  198. #     self_event : 自己 (判定事件可以通行的情况下)
  199. #--------------------------------------------------------------------------
  200. def passable?(x, y, d, self_event = nil)
  201.    # 被给予的坐标地图外的情况下
  202.    unless valid?(x, y)
  203.      # 不能通行
  204.      return false
  205.    end
  206.    martix = [false,false,false,false,false,false,false,false,false]
  207.    for panorama_x in 32*x..32*x+10
  208.      next if panorama_x %2 == 0
  209.      for panorama_y in 32*y..32*y+10
  210.        next if panorama_y %2 == 0
  211.        color = $panorama3.bitmap.get_pixel(panorama_x,panorama_y)
  212.        if color.green.to_i==0
  213.          martix[0] = true
  214.          break
  215.        end
  216.      end
  217.      break if martix[0]
  218.    end
  219.    for panorama_x in 32*x+10..32*x+22
  220.      next if panorama_x %2 == 0
  221.      for panorama_y in 32*y..32*y+10
  222.      next if panorama_y %2 == 0
  223.        color = $panorama3.bitmap.get_pixel(panorama_x,panorama_y)
  224.        if color.green.to_i==0
  225.          martix[1] = true
  226.          break
  227.        end
  228.      end
  229.      break if martix[1]
  230.    end
  231.    for panorama_x in 32*x+23..32*x+32
  232.      next if panorama_x %2 == 0
  233.      for panorama_y in 32*y..32*y+10
  234.      next if panorama_x %y == 0
  235.        color = $panorama3.bitmap.get_pixel(panorama_x,panorama_y)
  236.        if color.green.to_i==0
  237.          martix[2] = true
  238.          break
  239.        end
  240.      end
  241.      break if martix[2]
  242.    end
  243.    for panorama_x in 32*x..32*x+10
  244.      next if panorama_x %2 == 0
  245.      for panorama_y in 32*y+10..32*y+22
  246.        next if panorama_y %2 == 0
  247.        color = $panorama3.bitmap.get_pixel(panorama_x,panorama_y)
  248.        if color.green.to_i==0
  249.          martix[3] = true
  250.          break
  251.        end
  252.      end
  253.      break if martix[3]
  254.    end
  255.    for panorama_x in 32*x+10..32*x+22
  256.      next if panorama_x %2 == 0
  257.      for panorama_y in 32*y+10..32*y+22
  258.      next if panorama_y %2 == 0
  259.        color = $panorama3.bitmap.get_pixel(panorama_x,panorama_y)
  260.        if color.green.to_i==0
  261.          martix[4] = true
  262.          break
  263.        end
  264.      end
  265.      break if martix[4]
  266.    end
  267.    for panorama_x in 32*x+23..32*x+32
  268.      next if panorama_x %2 == 0
  269.      for panorama_y in 32*y+10..32*y+22
  270.      next if panorama_x %y == 0
  271.        color = $panorama3.bitmap.get_pixel(panorama_x,panorama_y)
  272.        if color.green.to_i==0
  273.          martix[5] = true
  274.          break
  275.        end
  276.      end
  277.      break if martix[5]
  278.    end
  279.    for panorama_x in 32*x..32*x+10
  280.      next if panorama_x %2 == 0
  281.      for panorama_y in 32*y+23..32*y+32
  282.        next if panorama_y %2 == 0
  283.        color = $panorama3.bitmap.get_pixel(panorama_x,panorama_y)
  284.        if color.green.to_i==0
  285.          martix[6] = true
  286.          break
  287.        end
  288.      end
  289.      break if martix[6]
  290.    end
  291.    for panorama_x in 32*x+10..32*x+22
  292.      next if panorama_x %2 == 0
  293.      for panorama_y in 32*y+23..32*y+32
  294.      next if panorama_y %2 == 0
  295.        color = $panorama3.bitmap.get_pixel(panorama_x,panorama_y)
  296.        if color.green.to_i==0
  297.          martix[7] = true
  298.          break
  299.        end
  300.      end
  301.      break if martix[7]
  302.    end
  303.    for panorama_x in 32*x+23..32*x+32
  304.      next if panorama_x %2 == 0
  305.      for panorama_y in 32*y+23..32*y+32
  306.      next if panorama_x %y == 0
  307.        color = $panorama3.bitmap.get_pixel(panorama_x,panorama_y)
  308.        if color.green.to_i==0
  309.          martix[8] = true
  310.          break
  311.        end
  312.      end
  313.      break if martix[8]
  314.    end
  315.    pass_up = true
  316.    pass_down = true
  317.    pass_left = true
  318.    pass_right = true
  319.    #---------------------------------------------------------------------
  320.    # 注意,如果打算严格要求,则把and前加井号。我测试感觉放松似乎更自然一些,看情况吧。
  321.    # 这种算法是把一个小格分为9个格(参考小键盘)
  322.    #
  323.    # 放松要求是2,4,6,8格决定能否通行
  324.    # 而严格要求则是2,4,6,8格并且要求至少附带临近旁一格才能通行
  325.    #---------------------------------------------------------------------
  326.    if martix[1] and (martix[0] or martix[2])
  327.      pass_up = false
  328.    end
  329.    if martix[3] and (martix[0] or martix[6])
  330.      pass_left = false
  331.    end
  332.    if martix[7] and (martix[6] or martix[8])
  333.      pass_down = false
  334.    end
  335.    if martix[5] and (martix[2] or martix[8])
  336.      pass_right = false
  337.    end
  338.    if martix[4]
  339.      pass_up = false
  340.      pass_down = false
  341.      pass_left = false
  342.      pass_right = false
  343.    end
  344.    pass_up = pass_up== false ? 0 : 1
  345.    pass_left = pass_left== false ? 0 : 1
  346.    pass_right = pass_right== false ? 0 : 1
  347.    pass_down = pass_down== false ? 0 : 1
  348.    pass = pass_down * 1 + pass_left * 2 + pass_right * 4 + pass_up * 8
  349.    pass = 15-pass
  350.    
  351.    # 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
  352.    bit = (1 << (d / 2 - 1)) & 0x0f
  353.    # 循环全部的事件
  354.    for event in events.values
  355.      # 自己以外的元件与坐标相同的情况
  356.      if event.tile_id >= 0 and event != self_event and
  357.         event.x == x and event.y == y and not event.through
  358.        # 如果障碍物的接触被设置的情况下
  359.        if @passages[event.tile_id] & bit != 0
  360.          # 不能通行
  361.          return false
  362.        # 如果全方向的障碍物的接触被设置的情况下
  363.        elsif @passages[event.tile_id] & 0x0f == 0x0f
  364.          # 不能通行
  365.          return false
  366.        # 这以外的优先度为 0 的情况下
  367.        elsif @priorities[event.tile_id] == 0
  368.          # 可以通行
  369.          return true
  370.        end
  371.      end
  372.    end
  373.    # 从层按从上到下的顺序调查循环
  374.    for i in [2, 1, 0]
  375.      # 取得元件 ID
  376.      tile_id = data[x, y, i]            
  377.      # 取得元件 ID 失败
  378.      if tile_id == nil
  379.        # 不能通行
  380.        return false
  381.      # 如果障碍物的接触被设置的情况下
  382.      elsif @passages[tile_id] & bit != 0
  383.        # 不能通行
  384.        return false
  385.      # 如果全方向的障碍物的接触被设置的情况下
  386.      elsif @passages[tile_id] & 0x0f == 0x0f
  387.        # 不能通行
  388.        return false
  389.      # 这以外的优先度为 0 的情况下
  390.      elsif @priorities[tile_id] == 0
  391.        # 可以通行
  392.        #p pass
  393.        if pass & bit != 0
  394.          return false
  395.        elsif pass & 0x0f == 0x0f
  396.          return false
  397.        end
  398.      end
  399.    end
  400.    # 可以通行
  401.    return true
  402. end
  403. end
  404. #==============================================================================
  405. # 本脚本的用途请参考制作录像
  406. #==============================================================================
复制代码

使用方法:这种方法相对于数据库的设置方法,应该说是更加简便了。只要制作远景图_3,所有能通行的地方涂上白色,不能通行的地方涂上黑色,就可以了。并且此方法可以和录像中讲的方法并用。


除了简便的方法,通行也可以制作得更加复杂(比如那个椅子边缘,左边一格只能下左,右边一格只能下右,类似于屏风或者小沟什么的)。

算法原理:
把一个32×32的格子分成3×3总共9个格,往每一个方向通行的话,至少要求:
1、5号格是白色
2、相邻方向至少要有中间一格和旁边一格两个通行(必须向左,则要求1、4格通行或者4、7格通行)。
上面说的数字参考小键盘。


其实这些算法不用管他,最好的当然就是制作简便多了,而且精确多了。那个商业素材使用方法的录像3可以删除了……

建议先看看范例:http://rpg.blue/web/dlftp/200602/panorama3.rar
这个是录象:http://rpg.blue/web/news.asp?class=14
{/gg}{/gg}还不会??LZ你PIA死我吧
系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
6R复活?别扯淡了.

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

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-9-21
帖子
179
4
 楼主| 发表于 2008-9-24 03:36:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-7-9
帖子
823
5
发表于 2008-9-24 03:38:29 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-9-21
帖子
179
6
 楼主| 发表于 2008-9-24 03:39:31 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-9-21
帖子
179
7
 楼主| 发表于 2008-9-24 03:41:46 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

8
发表于 2008-9-24 03:42:36 | 只看该作者
自己去试试就知道了。 试过还不知道的话,再上来问好了。

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-9-21
帖子
179
9
 楼主| 发表于 2008-9-24 03:46:07 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-9-21
帖子
179
10
 楼主| 发表于 2008-9-24 03:54:54 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-23 22:35

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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