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

Project1

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

不完美的3远景

 关闭 [复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

跳转到指定楼层
1
发表于 2008-1-17 21:26:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
因为和站上的方法不同,有人希望DEBUG
大家回下FPS
我这里28
设置:
***为远景
则***_1为遮挡
***_3为通行
现在就是效率问题,你回发现角色走起来奇卡无比
要想角色正常走路要:
1、设置移动路线
2、更改移动速度:2倍
2、更改移动频率:高
而且要公共事件,并行执行
覆盖同名脚本!!!
Spriteset_Map

  1. #==============================================================================
  2. # ■ Spriteset_Map
  3. #------------------------------------------------------------------------------
  4. #  处理地图画面活动块和元件的类。本类在
  5. # Scene_Map 类的内部使用。
  6. #==============================================================================

  7. class Spriteset_Map
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     create_viewports
  13.     create_tilemap
  14.     create_parallax
  15.     create_characters
  16.     create_shadow
  17.     create_weather
  18.     create_pictures
  19.     create_timer
  20.     update
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   # ● 生成视口
  24.   #--------------------------------------------------------------------------
  25.   def create_viewports
  26.     @viewport1 = Viewport.new(0, 0, 544, 416)
  27.     @viewport2 = Viewport.new(0, 0, 544, 416)
  28.     @viewport3 = Viewport.new(0, 0, 544, 416)
  29.     @viewport2.z = 50
  30.     @viewport3.z = 100
  31.   end
  32.   #--------------------------------------------------------------------------
  33.   # ● 生成地图元件
  34.   #--------------------------------------------------------------------------
  35.   def create_tilemap
  36.     @tilemap = Tilemap.new(@viewport1)
  37.     @tilemap.bitmaps[0] = Cache.system("TileA1")
  38.     @tilemap.bitmaps[1] = Cache.system("TileA2")
  39.     @tilemap.bitmaps[2] = Cache.system("TileA3")
  40.     @tilemap.bitmaps[3] = Cache.system("TileA4")
  41.     @tilemap.bitmaps[4] = Cache.system("TileA5")
  42.     @tilemap.bitmaps[5] = Cache.system("TileB")
  43.     @tilemap.bitmaps[6] = Cache.system("TileC")
  44.     @tilemap.bitmaps[7] = Cache.system("TileD")
  45.     @tilemap.bitmaps[8] = Cache.system("TileE")
  46.     @tilemap.map_data = $game_map.data
  47.     @tilemap.passages = $game_map.passages
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # ● 生成远景
  51.   #--------------------------------------------------------------------------
  52.   def create_parallax
  53.     @parallax = Plane.new(@viewport1)
  54.     @parallax.z = -100
  55.     #远景1遮挡
  56.     @parallax1 = Plane.new(@viewport1)
  57.     @parallax1.z = 300
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # ● 生成角色活动块
  61.   #--------------------------------------------------------------------------
  62.   def create_characters
  63.     @character_sprites = []
  64.     for i in $game_map.events.keys.sort
  65.       sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  66.       @character_sprites.push(sprite)
  67.     end
  68.     for vehicle in $game_map.vehicles
  69.       sprite = Sprite_Character.new(@viewport1, vehicle)
  70.       @character_sprites.push(sprite)
  71.     end
  72.     @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  73.   end
  74.   #--------------------------------------------------------------------------
  75.   # ● 生成飞行船影子活动块
  76.   #--------------------------------------------------------------------------
  77.   def create_shadow
  78.     @shadow_sprite = Sprite.new(@viewport1)
  79.     @shadow_sprite.bitmap = Cache.system("Shadow")
  80.     @shadow_sprite.ox = @shadow_sprite.bitmap.width / 2
  81.     @shadow_sprite.oy = @shadow_sprite.bitmap.height
  82.     @shadow_sprite.z = 180
  83.   end
  84.   #--------------------------------------------------------------------------
  85.   # ● 生成天气
  86.   #--------------------------------------------------------------------------
  87.   def create_weather
  88.     @weather = Spriteset_Weather.new(@viewport2)
  89.   end
  90.   #--------------------------------------------------------------------------
  91.   # ● 生成图片活动块
  92.   #--------------------------------------------------------------------------
  93.   def create_pictures
  94.     @picture_sprites = []
  95.     for i in 1..20
  96.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  97.         $game_map.screen.pictures[i]))
  98.     end
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● 生成计时器活动块
  102.   #--------------------------------------------------------------------------
  103.   def create_timer
  104.     @timer_sprite = Sprite_Timer.new(@viewport2)
  105.   end
  106.   #--------------------------------------------------------------------------
  107.   # ● 释放
  108.   #--------------------------------------------------------------------------
  109.   def dispose
  110.     dispose_tilemap
  111.     dispose_parallax
  112.     dispose_characters
  113.     dispose_shadow
  114.     dispose_weather
  115.     dispose_pictures
  116.     dispose_timer
  117.     dispose_viewports
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● 地图元件释放
  121.   #--------------------------------------------------------------------------
  122.   def dispose_tilemap
  123.     @tilemap.dispose
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 远景释放
  127.   #--------------------------------------------------------------------------
  128.   def dispose_parallax
  129.     @parallax.dispose
  130.     @parallax1.dispose
  131.   end
  132.   #--------------------------------------------------------------------------
  133.   # ● 角色活动块释放
  134.   #--------------------------------------------------------------------------
  135.   def dispose_characters
  136.     for sprite in @character_sprites
  137.       sprite.dispose
  138.     end
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   # ● 飞行船影子活动块释放
  142.   #--------------------------------------------------------------------------
  143.   def dispose_shadow
  144.     @shadow_sprite.dispose
  145.   end
  146.   #--------------------------------------------------------------------------
  147.   # ● 天气释放
  148.   #--------------------------------------------------------------------------
  149.   def dispose_weather
  150.     @weather.dispose
  151.   end
  152.   #--------------------------------------------------------------------------
  153.   # ● 图片活动块释放
  154.   #--------------------------------------------------------------------------
  155.   def dispose_pictures
  156.     for sprite in @picture_sprites
  157.       sprite.dispose
  158.     end
  159.   end
  160.   #--------------------------------------------------------------------------
  161.   # ● 计时器活动块释放
  162.   #--------------------------------------------------------------------------
  163.   def dispose_timer
  164.     @timer_sprite.dispose
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   # ● 视口释放
  168.   #--------------------------------------------------------------------------
  169.   def dispose_viewports
  170.     @viewport1.dispose
  171.     @viewport2.dispose
  172.     @viewport3.dispose
  173.   end
  174.   #--------------------------------------------------------------------------
  175.   # ● 刷新画面
  176.   #--------------------------------------------------------------------------
  177.   def update
  178.     update_tilemap
  179.     update_parallax
  180.     update_characters
  181.     update_shadow
  182.     update_weather
  183.     update_pictures
  184.     update_timer
  185.     update_viewports
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   # ● 刷新地图元件
  189.   #--------------------------------------------------------------------------
  190.   def update_tilemap
  191.     @tilemap.ox = $game_map.display_x / 8
  192.     @tilemap.oy = $game_map.display_y / 8
  193.     @tilemap.update
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   # ● 刷新远景
  197.   #--------------------------------------------------------------------------
  198.   def update_parallax
  199.     if @parallax_name != $game_map.parallax_name
  200.       @parallax_name = $game_map.parallax_name
  201.       if @parallax.bitmap != nil
  202.         @parallax.bitmap.dispose
  203.         @parallax.bitmap = nil
  204.       end
  205.       if @parallax_name != ""
  206.         @parallax.bitmap = Cache.parallax(@parallax_name)
  207.       end
  208.       
  209.      if @parallax_name != ""
  210.        if $panorama3 != nil
  211.         $panorama3.dispose
  212.       end
  213.       end
  214.        $panorama3 = Sprite.new
  215.        $panorama3.bitmap = Cache.parallax(@parallax_name+"_3")
  216.        $panorama3.visible = false
  217.       Graphics.frame_reset
  218.     end
  219.    
  220.    
  221.     ##########################################################
  222.     if @parallax_name1 != $game_map.parallax_name
  223.       @parallax_name1 = $game_map.parallax_name + "_1"
  224.       if @parallax1.bitmap != nil
  225.         @parallax1.bitmap.dispose
  226.         @parallax1.bitmap = nil
  227.       end
  228.       if @parallax_name1 != ""
  229.         @parallax1.bitmap = Cache.parallax(@parallax_name1.to_s)
  230.       end
  231.       Graphics.frame_reset
  232.     end
  233.     ###########################################################
  234.     @parallax1.ox = $game_map.calc_parallax_x(@parallax.bitmap)
  235.     @parallax1.oy = $game_map.calc_parallax_y(@parallax.bitmap)
  236.     ###########################################################
  237.     @parallax.ox =  @parallax1.ox#$game_map.calc_parallax_x(@parallax.bitmap)
  238.     @parallax.oy =  @parallax1.oy#$game_map.calc_parallax_y(@parallax.bitmap)
  239.   end
  240.   #--------------------------------------------------------------------------
  241.   # ● 刷新角色活动块
  242.   #--------------------------------------------------------------------------
  243.   def update_characters
  244.     for sprite in @character_sprites
  245.       sprite.update
  246.     end
  247.   end
  248.   #--------------------------------------------------------------------------
  249.   # ● 刷新飞行船影子活动块
  250.   #--------------------------------------------------------------------------
  251.   def update_shadow
  252.     airship = $game_map.airship
  253.     @shadow_sprite.x = airship.screen_x
  254.     @shadow_sprite.y = airship.screen_y + airship.altitude
  255.     @shadow_sprite.opacity = airship.altitude * 8
  256.     @shadow_sprite.update
  257.   end
  258.   #--------------------------------------------------------------------------
  259.   # ● 刷新天气
  260.   #--------------------------------------------------------------------------
  261.   def update_weather
  262.     @weather.type = $game_map.screen.weather_type
  263.     @weather.max = $game_map.screen.weather_max
  264.     @weather.ox = $game_map.display_x / 8
  265.     @weather.oy = $game_map.display_y / 8
  266.     @weather.update
  267.   end
  268.   #--------------------------------------------------------------------------
  269.   # ● 刷新图片活动块
  270.   #--------------------------------------------------------------------------
  271.   def update_pictures
  272.     for sprite in @picture_sprites
  273.       sprite.update
  274.     end
  275.   end
  276.   #--------------------------------------------------------------------------
  277.   # ● 刷新计时器活动块
  278.   #--------------------------------------------------------------------------
  279.   def update_timer
  280.     @timer_sprite.update
  281.   end
  282.   #--------------------------------------------------------------------------
  283.   # ● 刷新视口
  284.   #--------------------------------------------------------------------------
  285.   def update_viewports
  286.     @viewport1.tone = $game_map.screen.tone
  287.     @viewport1.ox = $game_map.screen.shake
  288.     @viewport2.color = $game_map.screen.flash_color
  289.     @viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness)
  290.     @viewport1.update
  291.     @viewport2.update
  292.     @viewport3.update
  293.   end
  294. end
复制代码



Game_Map
  1. #==============================================================================
  2. # ■ Game_Map
  3. #------------------------------------------------------------------------------
  4. #  处理地图的类。包含卷动以及可以通行的判断功能。
  5. # 本类的实例请参考 $game_map 。
  6. #==============================================================================

  7. class Game_Map
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_reader   :screen                   # 地图画面状态
  12.   attr_reader   :interpreter              # 地图事件用解释器
  13.   attr_reader   :display_x                # 显示 X 坐标 * 256
  14.   attr_reader   :display_y                # 显示 Y 坐标 * 256
  15.   attr_reader   :parallax_name            # 远景 文件名
  16.   attr_reader   :passages                 # 通行表
  17.   attr_reader   :events                   # 事件
  18.   attr_reader   :vehicles                 # 交通工具
  19.   attr_accessor :need_refresh             # 刷新要求标志
  20.   #--------------------------------------------------------------------------
  21.   # ● 初始化对象
  22.   #--------------------------------------------------------------------------
  23.   def initialize
  24.     @screen = Game_Screen.new
  25.     @interpreter = Game_Interpreter.new(0, true)
  26.     @map_id = 0
  27.     @display_x = 0
  28.     @display_y = 0
  29.     create_vehicles
  30.   end
  31.   #--------------------------------------------------------------------------
  32.   # ● 设置
  33.   #     map_id : 地图 ID
  34.   #--------------------------------------------------------------------------
  35.   def setup(map_id)
  36.     @map_id = map_id
  37.     @map = load_data(sprintf("Data/Map%03d.rvdata", @map_id))
  38.     @display_x = 0
  39.     @display_y = 0
  40.     @passages = $data_system.passages
  41.     referesh_vehicles
  42.     setup_events
  43.     setup_scroll
  44.     setup_parallax
  45.     @need_refresh = false
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 生成交通工具
  49.   #--------------------------------------------------------------------------
  50.   def create_vehicles
  51.     @vehicles = []
  52.     @vehicles[0] = Game_Vehicle.new(0)    # 小型船
  53.     @vehicles[1] = Game_Vehicle.new(1)    # 大型船
  54.     @vehicles[2] = Game_Vehicle.new(2)    # 飛行船
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 刷新交通工具
  58.   #--------------------------------------------------------------------------
  59.   def referesh_vehicles
  60.     for vehicle in @vehicles
  61.       vehicle.refresh
  62.     end
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # ● 获取小型船
  66.   #--------------------------------------------------------------------------
  67.   def boat
  68.     return @vehicles[0]
  69.   end
  70.   #--------------------------------------------------------------------------
  71.   # ● 获取大型船
  72.   #--------------------------------------------------------------------------
  73.   def ship
  74.     return @vehicles[1]
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ● 获取飞行船
  78.   #--------------------------------------------------------------------------
  79.   def airship
  80.     return @vehicles[2]
  81.   end
  82.   #--------------------------------------------------------------------------
  83.   # ● 设置事件
  84.   #--------------------------------------------------------------------------
  85.   def setup_events
  86.     @events = {}          # 地图事件
  87.     for i in @map.events.keys
  88.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  89.     end
  90.     @common_events = {}   # 公共事件
  91.     for i in 1...$data_common_events.size
  92.       @common_events[i] = Game_CommonEvent.new(i)
  93.     end
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 设置滚动
  97.   #--------------------------------------------------------------------------
  98.   def setup_scroll
  99.     @scroll_direction = 2
  100.     @scroll_rest = 0
  101.     @scroll_speed = 4
  102.     @margin_x = (width - 17) * 256 / 2      # 画面不显示的地方宽 / 2
  103.     @margin_y = (height - 13) * 256 / 2     # 画面不显示的地方高 / 2
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ● 设置远景
  107.   #--------------------------------------------------------------------------
  108.   def setup_parallax
  109.     @parallax_name = @map.parallax_name
  110.     @parallax_loop_x = @map.parallax_loop_x
  111.     @parallax_loop_y = @map.parallax_loop_y
  112.     @parallax_sx = @map.parallax_sx
  113.     @parallax_sy = @map.parallax_sy
  114.     @parallax_x = 0
  115.     @parallax_y = 0
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 设置显示位置
  119.   #     x : 新显示 X 坐标 (*256)
  120.   #     y : 新显示 Y 坐标 (*256)
  121.   #--------------------------------------------------------------------------
  122.   def set_display_pos(x, y)
  123.     @display_x = (x + @map.width * 256) % (@map.width * 256)
  124.     @display_y = (y + @map.height * 256) % (@map.height * 256)
  125.     @parallax_x = x
  126.     @parallax_y = y
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 计算远景显示 X 坐标
  130.   #     bitmap : 远景位图
  131.   #--------------------------------------------------------------------------
  132.   def calc_parallax_x(bitmap)
  133.     if bitmap == nil
  134.       return 0
  135.     elsif @parallax_loop_x
  136.       return @parallax_x / 16
  137.     elsif loop_horizontal?
  138.       return 0
  139.     else
  140.       w1 = bitmap.width - 544
  141.       w2 = @map.width * 32 - 544
  142.       if w1 <= 0 or w2 <= 0
  143.         return 0
  144.       else
  145.         return @parallax_x * w1 / w2 / 8
  146.       end
  147.     end
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ● 计算远景显示 Y 坐标
  151.   #     bitmap : 远景位图
  152.   #--------------------------------------------------------------------------
  153.   def calc_parallax_y(bitmap)
  154.     if bitmap == nil
  155.       return 0
  156.     elsif @parallax_loop_y
  157.       return @parallax_y / 16
  158.     elsif loop_vertical?
  159.       return 0
  160.     else
  161.       h1 = bitmap.height - 416
  162.       h2 = @map.height * 32 - 416
  163.       if h1 <= 0 or h2 <= 0
  164.         return 0
  165.       else
  166.         return @parallax_y * h1 / h2 / 8
  167.       end
  168.     end
  169.   end
  170.   #--------------------------------------------------------------------------
  171.   # ● 获取地图 ID
  172.   #--------------------------------------------------------------------------
  173.   def map_id
  174.     return @map_id
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # ● 获取宽度
  178.   #--------------------------------------------------------------------------
  179.   def width
  180.     return @map.width
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● 获取高度
  184.   #--------------------------------------------------------------------------
  185.   def height
  186.     return @map.height
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # ● 横方向循环吗?
  190.   #--------------------------------------------------------------------------
  191.   def loop_horizontal?
  192.     return (@map.scroll_type == 2 or @map.scroll_type == 3)
  193.   end
  194.   #--------------------------------------------------------------------------
  195.   # ● 纵方向循环吗?
  196.   #--------------------------------------------------------------------------
  197.   def loop_vertical?
  198.     return (@map.scroll_type == 1 or @map.scroll_type == 3)
  199.   end
  200.   #--------------------------------------------------------------------------
  201.   # ● 获取跑动与否?
  202.   #--------------------------------------------------------------------------
  203.   def disable_dash?
  204.     return @map.disable_dashing
  205.   end
  206.   #--------------------------------------------------------------------------
  207.   # ● 获取遇敌列表
  208.   #--------------------------------------------------------------------------
  209.   def encounter_list
  210.     return @map.encounter_list
  211.   end
  212.   #--------------------------------------------------------------------------
  213.   # ● 获取遇敌步数
  214.   #--------------------------------------------------------------------------
  215.   def encounter_step
  216.     return @map.encounter_step
  217.   end
  218.   #--------------------------------------------------------------------------
  219.   # ● 获取地图数据
  220.   #--------------------------------------------------------------------------
  221.   def data
  222.     return @map.data
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ● 计算扣除显示坐标的 X 坐标
  226.   #     x : X 坐标
  227.   #--------------------------------------------------------------------------
  228.   def adjust_x(x)
  229.     if loop_horizontal? and x < @display_x - @margin_x
  230.       return x - @display_x + @map.width * 256
  231.     else
  232.       return x - @display_x
  233.     end
  234.   end
  235.   #--------------------------------------------------------------------------
  236.   # ● 计算扣除显示坐标的 Y 坐标
  237.   #     y : Y 坐标
  238.   #--------------------------------------------------------------------------
  239.   def adjust_y(y)
  240.     if loop_vertical? and y < @display_y - @margin_y
  241.       return y - @display_y + @map.height * 256
  242.     else
  243.       return y - @display_y
  244.     end
  245.   end
  246.   #--------------------------------------------------------------------------
  247.   # ● 计算循环修正后的 X 坐标
  248.   #     x : X 坐标
  249.   #--------------------------------------------------------------------------
  250.   def round_x(x)
  251.     if loop_horizontal?
  252.       return (x + width) % width
  253.     else
  254.       return x
  255.     end
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   # ● 计算循环修正后的 Y坐标
  259.   #     y : Y 坐标
  260.   #--------------------------------------------------------------------------
  261.   def round_y(y)
  262.     if loop_vertical?
  263.       return (y + height) % height
  264.     else
  265.       return y
  266.     end
  267.   end
  268.   #--------------------------------------------------------------------------
  269.   # ● 计算特定方向移动 1 マス X 坐标
  270.   #     x         : X 坐标
  271.   #     direction : 方向 (2,4,6,8)
  272.   #--------------------------------------------------------------------------
  273.   def x_with_direction(x, direction)
  274.     return round_x(x + (direction == 6 ? 1 : direction == 4 ? -1 : 0))
  275.   end
  276.   #--------------------------------------------------------------------------
  277.   # ● 计算特定方向移动 1 マス Y 坐标
  278.   #     y         : Y 坐标
  279.   #     direction : 方向 (2,4,6,8)
  280.   #--------------------------------------------------------------------------
  281.   def y_with_direction(y, direction)
  282.     return round_y(y + (direction == 2 ? 1 : direction == 8 ? -1 : 0))
  283.   end
  284.   #--------------------------------------------------------------------------
  285.   # ● 获取指定坐标存在的事件排列
  286.   #     x : X 坐标
  287.   #     y : Y 坐标
  288.   #--------------------------------------------------------------------------
  289.   def events_xy(x, y)
  290.     result = []
  291.     for event in $game_map.events.values
  292.       result.push(event) if event.pos?(x, y)
  293.     end
  294.     return result
  295.   end
  296.   #--------------------------------------------------------------------------
  297.   # ● BGM / BGS 自动切换
  298.   #--------------------------------------------------------------------------
  299.   def autoplay
  300.     @map.bgm.play if @map.autoplay_bgm
  301.     @map.bgs.play if @map.autoplay_bgs
  302.   end
  303.   #--------------------------------------------------------------------------
  304.   # ● 刷新
  305.   #--------------------------------------------------------------------------
  306.   def refresh
  307.     if @map_id > 0
  308.       for event in @events.values
  309.         event.refresh
  310.       end
  311.       for common_event in @common_events.values
  312.         common_event.refresh
  313.       end
  314.     end
  315.     @need_refresh = false
  316.   end
  317.   #--------------------------------------------------------------------------
  318.   # ● 向下滚动
  319.   #     distance : 滚动距离
  320.   #--------------------------------------------------------------------------
  321.   def scroll_down(distance)
  322.     if loop_vertical?
  323.       @display_y += distance
  324.       @display_y %= @map.height * 256
  325.       @parallax_y += distance
  326.     else
  327.       last_y = @display_y
  328.       @display_y = [@display_y + distance, (height - 13) * 256].min
  329.       @parallax_y += @display_y - last_y
  330.     end
  331.   end
  332.   #--------------------------------------------------------------------------
  333.   # ● 向左滚动
  334.   #     distance : 滚动距离
  335.   #--------------------------------------------------------------------------
  336.   def scroll_left(distance)
  337.     if loop_horizontal?
  338.       @display_x += @map.width * 256 - distance
  339.       @display_x %= @map.width * 256
  340.       @parallax_x -= distance
  341.     else
  342.       last_x = @display_x
  343.       @display_x = [@display_x - distance, 0].max
  344.       @parallax_x += @display_x - last_x
  345.     end
  346.   end
  347.   #--------------------------------------------------------------------------
  348.   # ● 向右滚动
  349.   #     distance : 滚动距离
  350.   #--------------------------------------------------------------------------
  351.   def scroll_right(distance)
  352.     if loop_horizontal?
  353.       @display_x += distance
  354.       @display_x %= @map.width * 256
  355.       @parallax_x += distance
  356.     else
  357.       last_x = @display_x
  358.       @display_x = [@display_x + distance, (width - 17) * 256].min
  359.       @parallax_x += @display_x - last_x
  360.     end
  361.   end
  362.   #--------------------------------------------------------------------------
  363.   # ● 向上滚动
  364.   #     distance : 滚动距离
  365.   #--------------------------------------------------------------------------
  366.   def scroll_up(distance)
  367.     if loop_vertical?
  368.       @display_y += @map.height * 256 - distance
  369.       @display_y %= @map.height * 256
  370.       @parallax_y -= distance
  371.     else
  372.       last_y = @display_y
  373.       @display_y = [@display_y - distance, 0].max
  374.       @parallax_y += @display_y - last_y
  375.     end
  376.   end
  377.   #--------------------------------------------------------------------------
  378.   # ● 有效坐标判定
  379.   #     x          : X 坐标
  380.   #     y          : Y 坐标
  381.   #--------------------------------------------------------------------------
  382.   def valid?(x, y)
  383.     return (x >= 0 and x < width and y >= 0 and y < height)
  384.   end
  385.   #--------------------------------------------------------------------------
  386.   # ● 可以通行判定
  387.   #     x    : X 坐标
  388.   #     y    : Y 坐标  
  389.   #     flag : 检查通行禁止数据 (通常 0x01、交通工具的情况下变更)
  390.   #--------------------------------------------------------------------------
  391. # def passable?(x, y, flag = 0x01)
  392. #   for event in events_xy(x, y)            # 检查坐标相同的事件
  393. #     next if event.tile_id == 0            # 地图没有图块的情况下
  394. #     next if event.priority_type > 0       # 不是[通常形式下]
  395. #     next if event.through                 # 穿透状态
  396. #     pass = @passages[event.tile_id]       # 获取通行属性
  397. #     next if pass & 0x10 == 0x10           # [☆] : 不影响通行
  398. #     return true if pass & flag == 0x00    # [○] : 可通行
  399. #     return false if pass & flag == flag   # [×] : 不可通行
  400. #   end
  401. #   for i in [2, 1, 0]                      # 从层按从上到下的顺序调查循环
  402. #     tile_id = @map.data[x, y, i]          # 获取元件 ID
  403. #     return false if tile_id == nil        # 取得元件 ID 失败 : 不能通行
  404. #     pass = @passages[tile_id]             # 获取通行属性
  405. #     next if pass & 0x10 == 0x10           # [☆] : 不影响通行
  406. #     return true if pass & flag == 0x00    # [○] : 可通行
  407. #     return false if pass & flag == flag   # [×] : 不可通行
  408. #   end
  409. #   return false                            # 通行不可
  410. # end

  411.   def passable?(x, y, flag = 0x01,self_event = nil)
  412.    a = Color.new(255, 255, 255)
  413.    q = 0
  414.    for z in 0..30
  415.    for i in 0..30
  416.    if $panorama3.bitmap.get_pixel(x*32+i,y*32+z) != a
  417.       q += 1
  418.    else
  419.      ok = true
  420.    end
  421. end
  422. end
  423. if q >= 32 * 20
  424.   return false
  425. end


  426. for event in events_xy(x, y)            # 检查坐标相同的事件
  427.       next if event.tile_id == 0            # 地图没有图块的情况下
  428.       next if event.priority_type > 0       # 不是[通常形式下]
  429.       next if event.through                 # 穿透状态
  430.       pass = @passages[event.tile_id]       # 获取通行属性
  431.       next if pass & 0x10 == 0x10           # [☆] : 不影响通行
  432.       return true if pass & flag == 0x00    # [○] : 可通行
  433.       return false if pass & flag == flag   # [×] : 不可通行
  434.     end
  435.     for i in [2, 1, 0]                      # 从层按从上到下的顺序调查循环
  436.       tile_id = @map.data[x, y, i]          # 获取元件 ID
  437.    #   return false if tile_id == nil        # 取得元件 ID 失败 : 不能通行
  438.       pass = @passages[tile_id]             # 获取通行属性
  439.       next if pass & 0x10 == 0x10           # [☆] : 不影响通行
  440.       return true if pass & flag == 0x00    # [○] : 可通行
  441.       return false if pass & flag == flag   # [×] : 不可通行
  442.     end
  443.     return ok                          # 通行不可
  444.   end
  445.   #--------------------------------------------------------------------------
  446.   # ● 小型船通行判定
  447.   #     x : X 坐标
  448.   #     y : Y 坐标
  449.   #--------------------------------------------------------------------------
  450.   def boat_passable?(x, y)
  451.     return passable?(x, y, 0x02)
  452.   end
  453.   #--------------------------------------------------------------------------
  454.   # ● 大型船通行判定
  455.   #     x : X 坐标
  456.   #     y : Y 坐标
  457.   #--------------------------------------------------------------------------
  458.   def ship_passable?(x, y)
  459.     return passable?(x, y, 0x04)
  460.   end
  461.   #--------------------------------------------------------------------------
  462.   # ● 飞行船着陆可能判定
  463.   #     x : X 坐标
  464.   #     y : Y 坐标
  465.   #--------------------------------------------------------------------------
  466.   def airship_land_ok?(x, y)
  467.     return passable?(x, y, 0x08)
  468.   end
  469.   #--------------------------------------------------------------------------
  470.   # ● 茂密判定
  471.   #     x : X 坐标
  472.   #     y : Y 坐标
  473.   #--------------------------------------------------------------------------
  474.   def bush?(x, y)
  475.     return false unless valid?(x, y)
  476.     return @passages[@map.data[x, y, 1]] & 0x40 == 0x40
  477.   end
  478.   #--------------------------------------------------------------------------
  479.   # ● 反击判定
  480.   #     x : X 坐标
  481.   #     y : Y 坐标
  482.   #--------------------------------------------------------------------------
  483.   def counter?(x, y)
  484.     return false unless valid?(x, y)
  485.     return @passages[@map.data[x, y, 0]] & 0x80 == 0x80
  486.   end
  487.   #--------------------------------------------------------------------------
  488.   # ● 滚动开始
  489.   #     direction : 滚动方向
  490.   #     distance  : 滚动距离
  491.   #     speed     : 滚动速度
  492.   #--------------------------------------------------------------------------
  493.   def start_scroll(direction, distance, speed)
  494.     @scroll_direction = direction
  495.     @scroll_rest = distance * 256
  496.     @scroll_speed = speed
  497.   end
  498.   #--------------------------------------------------------------------------
  499.   # ● 滚动中中判定
  500.   #--------------------------------------------------------------------------
  501.   def scrolling?
  502.     return @scroll_rest > 0
  503.   end
  504.   #--------------------------------------------------------------------------
  505.   # ● 画面刷新
  506.   #--------------------------------------------------------------------------
  507.   def update
  508.     refresh if $game_map.need_refresh
  509.     update_scroll
  510.     update_events
  511.     update_vehicles
  512.     update_parallax
  513.     @screen.update
  514.   end
  515.   #--------------------------------------------------------------------------
  516.   # ● 滚动刷新
  517.   #--------------------------------------------------------------------------
  518.   def update_scroll
  519.     if @scroll_rest > 0                 # 滚动中的情况下
  520.       distance = 2 ** @scroll_speed     # 滚动速度变化为地图坐标系的距离
  521.       case @scroll_direction
  522.       when 2  # 下
  523.         scroll_down(distance)
  524.       when 4  # 左
  525.         scroll_left(distance)
  526.       when 6  # 右
  527.         scroll_right(distance)
  528.       when 8  # 上
  529.         scroll_up(distance)
  530.       end
  531.       @scroll_rest -= distance          # 滚动距离的减法运算
  532.     end
  533.   end
  534.   #--------------------------------------------------------------------------
  535.   # ● 刷新事件
  536.   #--------------------------------------------------------------------------
  537.   def update_events
  538.     for event in @events.values
  539.       event.update
  540.     end
  541.     for common_event in @common_events.values
  542.       common_event.update
  543.     end
  544.   end
  545.   #--------------------------------------------------------------------------
  546.   # ● 刷新交通工具
  547.   #--------------------------------------------------------------------------
  548.   def update_vehicles
  549.     for vehicle in @vehicles
  550.       vehicle.update
  551.     end
  552.   end
  553.   #--------------------------------------------------------------------------
  554.   # ● 刷新远景
  555.   #--------------------------------------------------------------------------
  556.   def update_parallax
  557.     @parallax_x += @parallax_sx * 4 if @parallax_loop_x
  558.     @parallax_y += @parallax_sy * 4 if @parallax_loop_y
  559.   end
  560. end
复制代码


              [本贴由 御灵 于 2008-1-17 23:34:30 进行了编辑]
哎呀,蛋疼什么的最有爱了

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

2
发表于 2008-1-18 00:28:09 | 只看该作者
站上那个是哪个笨蛋写的算法啊……{/gg}
...................................................................不会是我吧
回复 支持 反对

使用道具 举报

Lv1.梦旅人

史上最强弟子

梦石
0
星屑
105
在线时间
29 小时
注册时间
2006-1-31
帖子
2907
3
发表于 2008-1-18 00:40:37 | 只看该作者
这么快出来了??我最期待就是这个啊!
我要进化!
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

4
 楼主| 发表于 2008-1-18 01:38:40 | 只看该作者
走起来。。。。。
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

5
 楼主| 发表于 2008-1-18 01:45:29 | 只看该作者
我这里FPS28
其中双远景+行走判断占有 5
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

6
 楼主| 发表于 2008-1-18 04:17:51 | 只看该作者
现在还有问题就是交通工具
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

7
发表于 2008-1-18 04:22:02 | 只看该作者
理论上远景行走的判断比正常行走只多了四次if的运算量,LZ好好改改吧。
纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

8
 楼主| 发表于 2008-1-18 04:52:30 | 只看该作者
以下引用美兽于2008-1-17 20:22:02的发言:

理论上远景行走的判断比正常行走只多了四次if的运算量,LZ好好改改吧。

NO!XY是32*32的所以32*32次IF
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

9
发表于 2008-1-18 04:56:07 | 只看该作者
以下引用yangff于2008-1-17 20:52:30的发言:


以下引用美兽于2008-1-17 20:22:02的发言:

理论上远景行走的判断比正常行走只多了四次if的运算量,LZ好好改改吧。


NO!XY是32*32的所以32*32次IF


算了,32*32就一定是32*32?
若只想判断矩阵内是否存在一个数,只需要一次进制转换,一次除法+一个if,信不信由你.
纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

10
 楼主| 发表于 2008-1-18 06:29:13 | 只看该作者
算了,32*32就一定是32*32?
若只想判断矩阵内是否存在一个数,只需要一次进制转换,一次除法+一个if,信不信由你.
怎么做?
---------------
我算的是32*32里返回白色是否大于70%
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-22 10:52

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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