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

Project1

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

视野限制

[复制链接]

…あたしは天使なんかじゃないわ

梦石
0
星屑
2207
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

跳转到指定楼层
1
发表于 2015-2-2 20:52:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
RUBY 代码复制
  1. #==============================================================================
  2. # ● require Taroxd基础设置,位图扩展
  3. #    使用方法:在地图上备注 <sight x>,则该地图限制视野。x 为可见半径
  4. #    在角色、职业、装备、状态上备注 <sight x>,则可以设置角色周围 x 的视野补正
  5. #    在事件名称上备注 <sight x> 则可以在事件周围设置 x 的视野补正
  6. #==============================================================================
  7.  
  8. Taroxd::Sight = true
  9.  
  10. RPG::Map.note_i :sight, nil
  11. RPG::BaseItem.note_i :sight
  12. RPG::Event.note_i :sight
  13.  
  14. class Game_Map
  15.   def sight
  16.     @map.sight
  17.   end
  18. end
  19.  
  20. class Game_Actor < Game_Battler
  21.   def sight
  22.     note_objects.sum(&:sight)
  23.   end
  24. end
  25.  
  26. class Game_CharacterBase
  27.   def sight
  28.     0
  29.   end
  30. end
  31.  
  32. class Game_Event < Game_Character
  33.   def sight
  34.     @event.sight
  35.   end
  36. end
  37.  
  38. class Game_Player < Game_Character
  39.   def sight
  40.     return 0 unless $game_map.sight
  41.     $game_map.sight + $game_party.sum(&:sight)
  42.   end
  43. end
  44.  
  45. class Sprite_SightShadow < Sprite_Base
  46.  
  47.   # 阴影的位图。纯白色,越靠近中间透明度越大。
  48.   def self.shadow
  49.     return @shadow if @shadow
  50.     @shadow = Bitmap.new(128, 128)
  51.     @shadow.fill_rect(@shadow.rect, Color.new(255, 255, 255, 0))
  52.     @shadow.width.times do |x|
  53.       @shadow.height.times do |y|
  54.         bright = 4096 - (x - 64)**2 - (y - 64)**2
  55.         next if bright <= 0
  56.         @shadow.set_pixel(x, y, Color.new(255, 255, 255, bright / 16))
  57.       end
  58.     end
  59.     @shadow
  60.   end
  61.  
  62.   # sprites: Sprite_Character 实例的数组
  63.   def initialize(viewport, sprites)
  64.     super(viewport)
  65.     @sprites = sprites
  66.     self.z = 160
  67.     self.bitmap = Bitmap.new(Graphics.width, Graphics.height)
  68.   end
  69.  
  70.   def dispose
  71.     bitmap.dispose
  72.     super
  73.   end
  74.  
  75.   def update
  76.     self.visible = $game_map.sight
  77.     refresh if visible
  78.   end
  79.  
  80.   private
  81.  
  82.   def refresh
  83.     bitmap.fill_rect(bitmap.rect, Color.new(255, 255, 255, 0))
  84.     @sprites.each { |s| draw_shadow(s) }
  85.     bitmap.xor!(0xFFFFFFFF)
  86.   end
  87.  
  88.   def draw_shadow(sprite)
  89.     r = sprite.character.sight
  90.     x = sprite.x - sprite.ox + sprite.width / 2 - r
  91.     y = sprite.y - sprite.oy + sprite.height / 2 - r
  92.     bitmap.stretch_blt(Rect.new(x, y, r * 2, r * 2), shadow, shadow.rect)
  93.   end
  94.  
  95.   def shadow
  96.     Sprite_SightShadow.shadow
  97.   end
  98.  
  99. end
  100.  
  101. class Spriteset_Map
  102.  
  103.   def create_sight_shadow
  104.     sprites = @character_sprites.select { |s| s.character.sight > 0 }
  105.     @sight_shadow = Sprite_SightShadow.new(@viewport2, sprites)
  106.   end
  107.  
  108.   def dispose_sight_shadow
  109.     @sight_shadow.dispose
  110.   end
  111.  
  112.   def update_sight_shadow
  113.     @sight_shadow.update
  114.   end
  115.  
  116.   def refresh_sight_shadow
  117.     create_sight_shadow
  118.     dispose_sight_shadow
  119.   end
  120.  
  121.   %w(create dispose update refresh).each do |prefix|
  122.     def_after :"#{prefix}_characters", :"#{prefix}_sight_shadow"
  123.   end
  124. end
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-5-1 10:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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