Описание:
Достаточно несложный скрипт позволяющий скрывать карту(полностью или часть),и,соответственно,раскрывать.Игрок может видеть лишь радиус в определённое количество тайлов вокруг своего персонажа и то что уже прошёл+определённые тайлы(координаты).
Скрипт:
#===============================================================================# TheoAllen - Fog of War# Requested by : Zero0018# Last edited : 15.01.2015# Переводчик: wind@ - перевод кривой,но достаточный для использования#-------------------------------------------------------------------------------# Использование :# Поместите скрипт между материалами и главным# Дополнительные ресурсы не требуются##------------------------------------------------------------------------------# ** MAP NOTETAG :#------------------------------------------------------------------------------# Для включения наберите <fog> в заметках карты# Для отключения наберите <no fog> в заметках карты## Настройте диаметр показа в конфигурации##------------------------------------------------------------------------------# ** SCRIPT CALL :#------------------------------------------------------------------------------## $game_map.reveal_tiles(x, y)# $game_map.reveal_tiles(x, y, distance)# Will reveal tiles in x,y within the distance. If distance is ommited, it will# be same as the VisiRange in script setting## $game_map.events[event_id].reveal_tiles# $game_map.events[event_id].reveal_tiles(distance)# Will reveal tiles from the event location within the distance. If distance is# ommited, it will be same as the VisiRange in script setting##-------------------------------------------------------------------------------# Конфигурация#===============================================================================module Theo
VisiRange = 4# Видимость игрока.Большее число - больше тайлов видно(число-радиус вокруг персонажа)
FogOpacity = 255# Прозрачность тумана.Установите 255 для непрозрачного(черного)тумана
DefaultFog = true# Если значение true, у каждой карты будет туман,пока вы не напишите <no fog># Если значение false, у каждой карты туман отсутствует,пока вы не укажете <fog>end#===============================================================================# End of config#===============================================================================#===============================================================================# ** Bitmap#===============================================================================class Bitmap
# Fill entire bitmap with colordef entire_fill(color = Color.new(0,0,0,150))
fill_rect(self.rect,color)endend#===============================================================================# ** Fog of War#===============================================================================class Fog_of_War < Plane
@@bitmap_cache = {}#----------------------------------------------------------------------------# * Initialize#----------------------------------------------------------------------------def initialize(vport)super(vport)@id = -1end#----------------------------------------------------------------------------# * Update#----------------------------------------------------------------------------def update
if$game_mapif@id != $game_map.map_id@id = $game_map.map_id@width = $game_map.width@height = $game_map.height
update_bitmap
endself.ox = $game_map.display_x*32self.oy = $game_map.display_y*32self.visible = !$game_map.no_fog?
endend#----------------------------------------------------------------------------# * Update bitmap#----------------------------------------------------------------------------def update_bitmap
bmp = @@bitmap_cache[@id]unless bmp && !bmp.disposed?
bmp = Bitmap.new(@width *32, @height*32)
@@bitmap_cache[@id] = bmp
endself.bitmap = bmp
returnif$game_map.no_fog?
bitmap.entire_fill(Color.new(0,0,0,Theo::FogOpacity))
reveal_tiles($game_system.revealed_tiles)
reveal_tiles($game_player.reveal_tiles)end#----------------------------------------------------------------------------# * Reveal Tiles#----------------------------------------------------------------------------def reveal_tiles(tiles)
tiles.eachdo|pos|
x = pos.x*32
y = pos.y*32
bitmap.clear_rect(x,y,32,32)endunless disposed?
endend#===============================================================================# ** Game_System#===============================================================================class Game_System
#----------------------------------------------------------------------------# * Revealed tiles#----------------------------------------------------------------------------def revealed_tiles
@revealed_map||= {}@revealed_map[$game_map.map_id]||= []@revealed_map[$game_map.map_id]end#----------------------------------------------------------------------------# * Revealed tiles =#----------------------------------------------------------------------------def revealed_tiles=(t)@revealed_map||= {}@revealed_map[$game_map.map_id] = t
endend#===============================================================================# ** Revealed Node#===============================================================================class Revealed_Node
#----------------------------------------------------------------------------# * Public attributes#----------------------------------------------------------------------------
attr_accessor :parent
attr_accessor :visited
attr_accessor :x
attr_accessor :y
attr_reader :expanded
attr_reader :nodes#----------------------------------------------------------------------------# * Initialize#----------------------------------------------------------------------------def initialize(x,y)@x ,@y = x, y
@nodes = {}@visited = false@expanded = falseend#----------------------------------------------------------------------------# * Expand node#----------------------------------------------------------------------------def expand_node(mapnodes, char)
dir = [2,4,6,8]
dir.eachdo|d|
xpos = $game_map.round_x_with_direction(@x, d)
ypos = $game_map.round_y_with_direction(@y, d)
key = [xpos, ypos]
next_node = mapnodes[key]if next_node.nil?
next_node = Revealed_Node.new(xpos, ypos)
mapnodes[key] = next_node
elsif next_node.visitednextend
next_node.parent = selfself.nodes[d] = next_node
end@expanded = trueend#----------------------------------------------------------------------------# * Get Parent Direction#----------------------------------------------------------------------------def get_parent_dir
parent.nodes.index(self)endend#===============================================================================# ** Game_Map#===============================================================================class Game_Map
#----------------------------------------------------------------------------# * No fog?#----------------------------------------------------------------------------def no_fog?
returnfalseunless@mapreturntrueif@map.note[/<no[\s_]+fog>/i]returnfalseif@map.note[/<fog>/i]return !Theo::DefaultFogend#----------------------------------------------------------------------------# * Reveal tiles#----------------------------------------------------------------------------def reveal_tiles(x, y, distance = Theo::VisiRange, reveal = true)returnif no_fog?
# Initialize@revealed_nodes = {}@max_distance = distance -1@init_x = x
@init_y = y
# Make first node to check
first_node = Revealed_Node.new(x, y)
first_node.expand_node(@revealed_nodes, self)
first_node.visited = true@revealed_nodes[[x, y]] = first_node
@reveal_queue = []@reveal_queue.push(first_node)# spread search using BFSuntil@reveal_queue.empty?
spread_search(@reveal_queue.shift)end
node_to_reveal = @revealed_nodes.values-$game_system.revealed_tiles
sprset = SceneManager.scene.spriteset
sprset.fogofwar.reveal_tiles(node_to_reveal)if sprset
$game_system.revealed_tiles+= @revealed_nodes.valuesend#----------------------------------------------------------------------------# * Spread search#----------------------------------------------------------------------------def spread_search(node)
dir = [2,4,6,8]
dir.shuffle.eachdo|d|
next_node = node.nodes[d]nextunless next_node
nextif next_node.visitednextif get_distance(next_node)>@max_distance
next_node.expand_node(@revealed_nodes, self)unless next_node.expanded
next_node.visited = true@reveal_queue.push(next_node, node)endend#----------------------------------------------------------------------------# * Get distance#----------------------------------------------------------------------------def get_distance(node)
range_x = node.x-@init_x
range_y = node.y-@init_y
result = Math.sqrt((range_x**2)+(range_y**2))return result
endend#===============================================================================# ** Game_Character#===============================================================================class Game_Character
#----------------------------------------------------------------------------# * Reveal tiles#----------------------------------------------------------------------------def reveal_tiles(distance = Theo::VisiRange)$game_map.reveal_tiles(x, y, distance)endend#===============================================================================# ** Game_Player#===============================================================================class Game_Player
#----------------------------------------------------------------------------# * Increase step#----------------------------------------------------------------------------alias theo_fogofwar_increase_steps increase_steps
def increase_steps
theo_fogofwar_increase_steps
reveal_tiles
endend#===============================================================================# ** Spriteset_Map#===============================================================================class Spriteset_Map
#----------------------------------------------------------------------------# * Attribute Reader#----------------------------------------------------------------------------
attr_reader :fogofwar#----------------------------------------------------------------------------# * Create viewports (alias)#----------------------------------------------------------------------------alias theo_fogofwar_create_viewports create_viewports
def create_viewports
theo_fogofwar_create_viewports
create_fogofwar
end#----------------------------------------------------------------------------# * Create fog of war#----------------------------------------------------------------------------def create_fogofwar
@fogofwar = Fog_of_War.new(@viewport1)@fogofwar.z = 210end#----------------------------------------------------------------------------# * Update (alias)#----------------------------------------------------------------------------alias theo_fogofwar_update update
def update
theo_fogofwar_update
@fogofwar.updateend#----------------------------------------------------------------------------# * Dispose (alias)#----------------------------------------------------------------------------alias theo_fogofwar_dispose dispose
def dispose
theo_fogofwar_dispose
@fogofwar.disposeendend#===============================================================================# ** Scene_Base#===============================================================================class Scene_Base
attr_reader :spritesetend
Im back.
Последнее редактирование: 9 года 3 мес. назад от Wind@.