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

Project1

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

[已经解决] 三层远景图 错误。

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
57 小时
注册时间
2011-9-23
帖子
65
跳转到指定楼层
1
发表于 2011-11-17 09:38:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 bb2132960 于 2011-11-17 09:47 编辑

我用三层远景图脚本 做了一个地图  是“大地图”(类似世界地图)

三个图都没有问题 把主角放在这个地图里 一切正常

但是把主角放到 元件做的地图里测试的时候 一走动 就会出现下面的错误





说的是 脚本里的这行





bb2132960于2011-11-17 09:44补充以下内容:

是不是我用的这个脚本对游戏里所有地图都进行了某种定义?

必须所有地图都用三层远景才可以正常?

如果是的话,有没有什么方法可以让 三层地图 和 游戏自带元件做的地图兼容?




所使用的三层远景脚本如下:
  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. #==============================================================================
复制代码

Lv2.观梦者

梦石
0
星屑
508
在线时间
1478 小时
注册时间
2011-9-17
帖子
1316

开拓者贵宾

2
发表于 2011-11-17 10:12:44 | 只看该作者
本帖最后由 iisnow 于 2011-11-17 10:14 编辑

LZ要复制我的几行代码,还要改一点东西:
1.在脚本的201行之前(即def passable?(……)的上一行)加上
  1. alias :no_p3_passable? passable?
复制代码
2.将
  1. def passable?(x, y, d, self_event = nil)
复制代码
这一行改为:
  1. def passable?(x, y, d, self_event)
复制代码
3.在脚本最后一个end的上一行添加以下内容:
  1.   alias :yes_p3_passable? :passable?
  2.   def passable?(x, y, d, self_event = nil)
  3.     if $panorama3 == nil
  4.       return no_p3_passable?(x, y, d, self_event)
  5.     else
  6.       return yes_p3_passable?(x, y, d, self_event)
  7.     end
  8.   end
复制代码
我没有试验,不知道对不对,LZ试试,错了的话,我可能要工程了(因为我还没有3层远景)

点评

刚才少了两个“?”,已经改过来了…  发表于 2011-11-17 10:15
我帖子中要有是不HX的空白,请Ctrl + A
回复

使用道具 举报

Lv3.寻梦者

虚空人形

梦石
0
星屑
4604
在线时间
2037 小时
注册时间
2011-8-11
帖子
3398

贵宾

3
发表于 2011-11-17 13:29:02 手机端发表。 | 只看该作者
是否可求其次,用PS或其他制图工具把大地图合为一远景图,在其上用透明地图元件填充.不用那脚本.
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
57 小时
注册时间
2011-9-23
帖子
65
4
 楼主| 发表于 2011-11-17 13:39:34 | 只看该作者
iisnow 发表于 2011-11-17 10:12
LZ要复制我的几行代码,还要改一点东西:
1.在脚本的201行之前(即def passable?(……)的上一行)加上2. ...

感激不尽。

已经改好了 完全可行 目前没有发现其他错误。

更改这段脚本会不会造成其他不兼容?

点评

我只是重定义了那个passable?方法; 若存在远景图3就用远景图3的判定脚本, 没有远景图3就不调用后来加上的脚本,应该不会冲突,要是有就就联系我吧   发表于 2011-11-17 13:52
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 21:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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