ГлавнаяФорумRPG MakerСкрипты/ПлагиныRPG Maker VX ACEУлучшающие или добавляющее новое скриптыКартинка в картинке - вид на другую карту
Войти на сайт
×
ТЕМА: Картинка в картинке - вид на другую карту
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74770
|
Картинка в картинке [VX Ace]
Информация: Автор: EvilCat Версия мейкера: VX ACE. Тип: Новый элемент Описание: Пока игрок ходит по карте, он может видеть события другой карты в небольшом прямоугольнике. События другой карты также работают - персонажи ходят, меняются в соответствии с переключателями, выполняют команды... Можно применять в различных механиках, когда стоишь в одном месте и влияешь на события совершенно в другом (или подсматриваешь). Особенности: - Вид включается и отключается кнопкой F5 - При переходе между локациями сохраняется состояние видимости вида, а в битвах и меню он скрывается. Установка: 1. Добавить в список скриптов новую страницу с названием PiP и кодом, находящимся под спойлером. 2. К сожалению, чтобы научить Мейкер обрабатывать две карты сразу, необходимо было перевести несколько стандартных классов и модулей с глобальной переменной $game_map на локальную @game_map, содержащую контекстную карту, а также изменить некоторые методы, чтобы они работали с ограниченной областью, а не всем экраном сразу. Поэтому следует также заменить содержимое нескольких стандартных страниц с кодом в соответствии со спойлерами ниже. 3. Необязательная настройка. 3.1. В строчках №№ 62-63 страницы "PiP" находятся настройки числа фреймов для появления и отключения дополнительного интерфейса и адрес графического файла, использующегося в качестве интерфейса. 3.2. В строчках №№ 65-69 той же страницы находятся параметры прямоугольной области, выделенной под вид на другую карту. 3.3. В строчке № 71 находится изначальное состояние интерфейса: видим или скрыт; а в строчек № 72 - код кнопки, которая переключает. 4. Готово! Код: страница PiP [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] # PiP: картинка в картинке, автор EvilCat
module SceneManager
class << self
alias :piphud_super_run :run
end
def self.run
# инициализируется разово при запуске симулятора как такового.
PiPHud.init
piphud_super_run
end
end
class Scene_Map
alias :piphud_super_start :start
alias :piphud_super_update :update
alias :piphud_super_terminate :terminate
def expose_overlay_viewport
# необходимо для получения актуального пространства
@spriteset.expose_overlay_viewport
end
def start
# запускается вместе с картой (включая запуск после возвращения с паузы)
piphud_super_start
PiPHud.scene_started
end
def update
# обновляется вместе со всем на карте.
PiPHud.update
piphud_super_update
end
def terminate
piphud_super_terminate
PiPHud.scene_terminated
end
end
class Game_Map
alias :piphud_super_refresh :refresh
def refresh
PiPHud.map_refresh unless self.kind_of?(Game_Submap)
piphud_super_refresh
end
end
class Spriteset_Map
def expose_overlay_viewport
# необходимо для получения актуального пространства
@viewport3
end
end
module PiPHud
DEFAULT_FRAMES=10 # число кадров по умолчанию, за которые появляется HUD
HUD_FILE='Graphics/Titles2/Fire'
SUBMAP_ID=2
SUBVIEW_X=10
SUBVIEW_Y=10
SUBVIEW_WIDTH=200
SUBVIEW_HEIGHT=200
INITIALLY_VISIBLE=true
TOGGLE_KEY=:F5
@sprite=nil;
@opacity_animation=false; # также :appear или :disappear
@opacity_frames_passed=0;
@opacity_frames_total=0;
def self.init
init_sprite
@visible=INITIALLY_VISIBLE;
# по умолчанию допинтерфейс скрыт
end
def self.init_sprite
@sprite=Sprite.new
@sprite.opacity=0
@sprite.bitmap=Bitmap.new(HUD_FILE)
end
def self.scene_started
if !@submap
@submap=Game_Submap.new(Rect.new(SUBVIEW_X, SUBVIEW_Y, SUBVIEW_WIDTH, SUBVIEW_HEIGHT))
@submap.setup(SUBMAP_ID) # номер карты
@submap_view=Spriteset_Submap.new(@submap)
end
refresh
end
def self.scene_terminated
hide_now
# важно: настройка видимости сохраняется, чтобы при возобновлении сцены
# интерфейс был в том же состоянии. если не скрывать, то возникает какая-то
# проблема с вьюпортами, из-за чего интерфейс может не появляться.
end
def self.update
toggle if Input.trigger?(TOGGLE_KEY)
refresh
@submap.update(true)
@submap_view.update
end
def self.map_refresh
@submap.refresh if $game_map.need_refresh
end
def self.refresh
if @opacity_animation
update_opacity_animation
elsif @visible!=shown?
if @visible then show_now else hide_now end
end
if !@opacity_animation && @visible!=@submap_view.visible
@submap_view.visible=@visible
end
end
def self.update_opacity_animation
@opacity_frames_passed+=1
if @opacity_animation==:appear
@sprite.opacity=(255*(@opacity_frames_passed.to_f/@opacity_frames_total)).floor
else
@sprite.opacity=255*(1-@opacity_frames_passed.to_f/@opacity_frames_total)
end
clear_opacity_animation if @sprite.opacity==canonical_opacity
end
def self.toggle(frames=DEFAULT_FRAMES)
@visible=!@visible
setup_opacity_animation(frames)
end
def self.set_visible(frames=DEFAULT_FRAMES)
@visible=true
setup_opacity_animation(frames)
end
def self.set_invisible(frames=DEFAULT_FRAMES)
@visible=false
setup_opacity_animation(frames)
end
def self.setup_opacity_animation(frames)
@sprite.viewport=nil
@sprite.viewport=current_viewport
@opacity_frames_total=frames;
return if frames==0 # само обновится во время refresh
previous_animation=@opacity_animation
if @visible then @opacity_animation=:appear else @opacity_animation=:disappear end
return if @sprite.opacity==canonical_opacity
if !previous_animation
@opacity_frames_passed=0
elsif @opacity_animation==:appear
@opacity_frames_passed=((255-@sprite.opacity)/255.0*frames).floor
elsif @opacity_animation==:disappear
@opacity_frames_passed=((1-@sprite.opacity/255.0)*frames).floor
end
end
def self.canonical_opacity
return 255 if @visible
return 0
end
def self.clear_opacity_animation
@opacity_animation=false
@opacity_frames_passed=0;
@opacity_frames_total=0;
end
def self.shown?
@sprite.opacity==255 && @sprite.viewport===current_viewport
end
def self.show_now
clear_opacity_animation
@sprite.viewport=current_viewport
@sprite.opacity=255
@submap_view.visible=true
end
def self.hide_now
clear_opacity_animation
# почему-то без очистки вьюпорта спрайт
# иногда перестаёт появляться после битвы.
@sprite.viewport=nil
@sprite.opacity=0
@submap_view.visible=false
end
def self.current_viewport
# именно этот вьюпорт учитывается при создании фона для паузы.
SceneManager.scene.expose_overlay_viewport if SceneManager.scene.kind_of?(Scene_Map)
end
end
class Game_Submap < Game_Map
attr_reader :rect
def initialize(rect)
super()
@rect=rect
end
def graphics_width
Graphics.width
end
def graphics_height
Graphics.height
end
end
class Spriteset_Submap < Spriteset_Map
def initialize(game_map)
@game_map=game_map
@rect=game_map.rect
@visible=false
super()
end
def update
super
end
def create_characters
super
player_index=@character_sprites.each do |sprite|
break sprite if sprite.character==$game_player
end
@character_sprites.delete(player_index) if player_index
end
def create_viewports
@viewport1 = Viewport.new(@rect)
@viewport2 = Viewport.new(@rect)
@viewport3 = Viewport.new(@rect)
@viewport1.z = 200
@viewport2.z = 250
@viewport3.z = 300
sync_viewports_visibility
end
def sync_viewports_visibility
@viewport1.visible=@visible
@viewport2.visible=@visible
@viewport3.visible=@visible
end
def game_map
@game_map
end
def visible
@visible
end
def visible=(val)
@visible=val
sync_viewports_visibility
end
end страница Game_Map [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
# This class handles maps. It includes scrolling and passage determination
# functions. The instance of this class is referenced by $game_map.
#==============================================================================
# modified by EvilCat; adapted for extension by Game_Submap which uses Viewport.
class Game_Map
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :screen # map screen state
attr_reader :interpreter # map event interpreter
attr_reader :events # events
attr_reader :display_x # display X coordinate
attr_reader :display_y # display Y coordinate
attr_reader :parallax_name # parallax background filename
attr_reader :vehicles # vehicle
attr_reader :battleback1_name # battle background (floor) filename
attr_reader :battleback2_name # battle background (wall) filename
attr_accessor :name_display # map name display flag
attr_accessor :need_refresh # refresh request flag
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
@screen = Game_Screen.new
@interpreter = Game_Interpreter.new
@map_id = 0
@events = {}
@display_x = 0
@display_y = 0
create_vehicles
@name_display = true
end
#--------------------------------------------------------------------------
# * Setup
#--------------------------------------------------------------------------
def setup(map_id)
@map_id = map_id
@map = load_data(sprintf("Data/Map%03d.rvdata2", @map_id))
@tileset_id = @map.tileset_id
@display_x = 0
@display_y = 0
referesh_vehicles
setup_events
setup_scroll
setup_parallax
setup_battleback
@need_refresh = false
end
#--------------------------------------------------------------------------
# * Create Vehicles
#--------------------------------------------------------------------------
def create_vehicles
@vehicles = []
@vehicles[0] = Game_Vehicle.new(:boat, self)
@vehicles[1] = Game_Vehicle.new(:ship, self)
@vehicles[2] = Game_Vehicle.new(:airship, self)
end
#--------------------------------------------------------------------------
# * Refresh Vehicles
#--------------------------------------------------------------------------
def referesh_vehicles
@vehicles.each {|vehicle| vehicle.refresh }
end
#--------------------------------------------------------------------------
# * Get Vehicle
#--------------------------------------------------------------------------
def vehicle(type)
return @vehicles[0] if type == :boat
return @vehicles[1] if type == :ship
return @vehicles[2] if type == :airship
return nil
end
#--------------------------------------------------------------------------
# * Get Boat
#--------------------------------------------------------------------------
def boat
@vehicles[0]
end
#--------------------------------------------------------------------------
# * Get Ship
#--------------------------------------------------------------------------
def ship
@vehicles[1]
end
#--------------------------------------------------------------------------
# * Get Airship
#--------------------------------------------------------------------------
def airship
@vehicles[2]
end
#--------------------------------------------------------------------------
# * Event Setup
#--------------------------------------------------------------------------
def setup_events
@events = {}
@map.events.each do |i, event|
@events[i] = Game_Event.new(@map_id, event, self)
end
@common_events = parallel_common_events.collect do |common_event|
Game_CommonEvent.new(common_event.id)
end
refresh_tile_events
end
#--------------------------------------------------------------------------
# * Get Array of Parallel Common Events
#--------------------------------------------------------------------------
def parallel_common_events
$data_common_events.select {|event| event && event.parallel? }
end
#--------------------------------------------------------------------------
# * Scroll Setup
#--------------------------------------------------------------------------
def setup_scroll
@scroll_direction = 2
@scroll_rest = 0
@scroll_speed = 4
end
#--------------------------------------------------------------------------
# * Parallax Background Setup
#--------------------------------------------------------------------------
def setup_parallax
@parallax_name = @map.parallax_name
@parallax_loop_x = @map.parallax_loop_x
@parallax_loop_y = @map.parallax_loop_y
@parallax_sx = @map.parallax_sx
@parallax_sy = @map.parallax_sy
@parallax_x = 0
@parallax_y = 0
end
#--------------------------------------------------------------------------
# * Set Up Battle Background
#--------------------------------------------------------------------------
def setup_battleback
if @map.specify_battleback
@battleback1_name = @map.battleback1_name
@battleback2_name = @map.battleback2_name
else
@battleback1_name = nil
@battleback2_name = nil
end
end
#--------------------------------------------------------------------------
# * Set Display Position
#--------------------------------------------------------------------------
def set_display_pos(x, y)
x = [0, [x, width - screen_tile_x].min].max unless loop_horizontal?
y = [0, [y, height - screen_tile_y].min].max unless loop_vertical?
@display_x = (x + width) % width
@display_y = (y + height) % height
@parallax_x = x
@parallax_y = y
end
#--------------------------------------------------------------------------
# * Calculate X Coordinate of Parallax Display Origin
#--------------------------------------------------------------------------
def parallax_ox(bitmap)
if @parallax_loop_x
@parallax_x * 16
else
w1 = [bitmap.width - graphics_width, 0].max
w2 = [width * 32 - graphics_width, 1].max
@parallax_x * 16 * w1 / w2
end
end
#--------------------------------------------------------------------------
# * Calculate Y Coordinate of Parallax Display Origin
#--------------------------------------------------------------------------
def parallax_oy(bitmap)
if @parallax_loop_y
@parallax_y * 16
else
h1 = [bitmap.height - graphics_height, 0].max
h2 = [height * 32 - graphics_height, 1].max
@parallax_y * 16 * h1 / h2
end
end
#--------------------------------------------------------------------------
# * Get Map ID
#--------------------------------------------------------------------------
def map_id
@map_id
end
#--------------------------------------------------------------------------
# * Get Tileset
#--------------------------------------------------------------------------
def tileset
$data_tilesets[@tileset_id]
end
#--------------------------------------------------------------------------
# * Get Display Name
#--------------------------------------------------------------------------
def display_name
@map.display_name
end
#--------------------------------------------------------------------------
# * Get Width
#--------------------------------------------------------------------------
def width
@map.width
end
#--------------------------------------------------------------------------
# * Get Height
#--------------------------------------------------------------------------
def height
@map.height
end
#--------------------------------------------------------------------------
# * Loop Horizontally?
#--------------------------------------------------------------------------
def loop_horizontal?
@map.scroll_type == 2 || @map.scroll_type == 3
end
#--------------------------------------------------------------------------
# * Loop Vertically?
#--------------------------------------------------------------------------
def loop_vertical?
@map.scroll_type == 1 || @map.scroll_type == 3
end
#--------------------------------------------------------------------------
# * Get Whether Dash is Disabled
#--------------------------------------------------------------------------
def disable_dash?
@map.disable_dashing
end
#--------------------------------------------------------------------------
# * Get Encounter List
#--------------------------------------------------------------------------
def encounter_list
@map.encounter_list
end
#--------------------------------------------------------------------------
# * Get Encounter Steps
#--------------------------------------------------------------------------
def encounter_step
@map.encounter_step
end
#--------------------------------------------------------------------------
# * Get Map Data
#--------------------------------------------------------------------------
def data
@map.data
end
#--------------------------------------------------------------------------
# * Determine if Field Type
#--------------------------------------------------------------------------
def overworld?
tileset.mode == 0
end
#--------------------------------------------------------------------------
# * Number of Horizontal Tiles on Screen
#--------------------------------------------------------------------------
def screen_tile_x
graphics_width / 32
end
#--------------------------------------------------------------------------
# * Number of Vertical Tiles on Screen
#--------------------------------------------------------------------------
def screen_tile_y
graphics_height / 32
end
#--------------------------------------------------------------------------
# * Calculate X Coordinate, Minus Display Coordinate
#--------------------------------------------------------------------------
def adjust_x(x)
if loop_horizontal? && x < @display_x - (width - screen_tile_x) / 2
x - @display_x + @map.width
else
x - @display_x
end
end
#--------------------------------------------------------------------------
# * Calculate Y Coordinate, Minus Display Coordinate
#--------------------------------------------------------------------------
def adjust_y(y)
if loop_vertical? && y < @display_y - (height - screen_tile_y) / 2
y - @display_y + @map.height
else
y - @display_y
end
end
#--------------------------------------------------------------------------
# * Calculate X Coordinate After Loop Adjustment
#--------------------------------------------------------------------------
def round_x(x)
loop_horizontal? ? (x + width) % width : x
end
#--------------------------------------------------------------------------
# * Calculate Y Coordinate After Loop Adjustment
#--------------------------------------------------------------------------
def round_y(y)
loop_vertical? ? (y + height) % height : y
end
#--------------------------------------------------------------------------
# * Calculate X Coordinate Shifted One Tile in Specific Direction
# (No Loop Adjustment)
#--------------------------------------------------------------------------
def x_with_direction(x, d)
x + (d == 6 ? 1 : d == 4 ? -1 : 0)
end
#--------------------------------------------------------------------------
# * Calculate Y Coordinate Shifted One Tile in Specific Direction
# (No Loop Adjustment)
#--------------------------------------------------------------------------
def y_with_direction(y, d)
y + (d == 2 ? 1 : d == 8 ? -1 : 0)
end
#--------------------------------------------------------------------------
# * Calculate X Coordinate Shifted One Tile in Specific Direction
# (With Loop Adjustment)
#--------------------------------------------------------------------------
def round_x_with_direction(x, d)
round_x(x + (d == 6 ? 1 : d == 4 ? -1 : 0))
end
#--------------------------------------------------------------------------
# * Calculate Y Coordinate Shifted One Tile in Specific Direction
# (With Loop Adjustment)
#--------------------------------------------------------------------------
def round_y_with_direction(y, d)
round_y(y + (d == 2 ? 1 : d == 8 ? -1 : 0))
end
#--------------------------------------------------------------------------
# * Automatically Switch BGM and BGS
#--------------------------------------------------------------------------
def autoplay
@map.bgm.play if @map.autoplay_bgm
@map.bgs.play if @map.autoplay_bgs
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
@events.each_value {|event| event.refresh }
@common_events.each {|event| event.refresh }
refresh_tile_events
@need_refresh = false
end
#--------------------------------------------------------------------------
# * Refresh Array of Tile-Handling Events
#--------------------------------------------------------------------------
def refresh_tile_events
@tile_events = @events.values.select {|event| event.tile? }
end
#--------------------------------------------------------------------------
# * Get Array of Events at Designated Coordinates
#--------------------------------------------------------------------------
def events_xy(x, y)
@events.values.select {|event| event.pos?(x, y) }
end
#--------------------------------------------------------------------------
# * Get Array of Events at Designated Coordinates (Except Pass-Through)
#--------------------------------------------------------------------------
def events_xy_nt(x, y)
@events.values.select {|event| event.pos_nt?(x, y) }
end
#--------------------------------------------------------------------------
# * Get Array of Tile-Handling Events at Designated Coordinates
# (Except Pass-Through)
#--------------------------------------------------------------------------
def tile_events_xy(x, y)
@tile_events.select {|event| event.pos_nt?(x, y) }
end
#--------------------------------------------------------------------------
# * Get ID of Events at Designated Coordinates (One Only)
#--------------------------------------------------------------------------
def event_id_xy(x, y)
list = events_xy(x, y)
list.empty? ? 0 : list[0].id
end
#--------------------------------------------------------------------------
# * Scroll Down
#--------------------------------------------------------------------------
def scroll_down(distance)
if loop_vertical?
@display_y += distance
@display_y %= @map.height
@parallax_y += distance if @parallax_loop_y
else
last_y = @display_y
@display_y = [@display_y + distance, height - screen_tile_y].min
@parallax_y += @display_y - last_y
end
end
#--------------------------------------------------------------------------
# * Scroll Left
#--------------------------------------------------------------------------
def scroll_left(distance)
if loop_horizontal?
@display_x += @map.width - distance
@display_x %= @map.width
@parallax_x -= distance if @parallax_loop_x
else
last_x = @display_x
@display_x = [@display_x - distance, 0].max
@parallax_x += @display_x - last_x
end
end
#--------------------------------------------------------------------------
# * Scroll Right
#--------------------------------------------------------------------------
def scroll_right(distance)
if loop_horizontal?
@display_x += distance
@display_x %= @map.width
@parallax_x += distance if @parallax_loop_x
else
last_x = @display_x
@display_x = [@display_x + distance, (width - screen_tile_x)].min
@parallax_x += @display_x - last_x
end
end
#--------------------------------------------------------------------------
# * Scroll Up
#--------------------------------------------------------------------------
def scroll_up(distance)
if loop_vertical?
@display_y += @map.height - distance
@display_y %= @map.height
@parallax_y -= distance if @parallax_loop_y
else
last_y = @display_y
@display_y = [@display_y - distance, 0].max
@parallax_y += @display_y - last_y
end
end
#--------------------------------------------------------------------------
# * Determine Valid Coordinates
#--------------------------------------------------------------------------
def valid?(x, y)
x >= 0 && x < width && y >= 0 && y < height
end
#--------------------------------------------------------------------------
# * Check Passage
# bit: Inhibit passage check bit
#--------------------------------------------------------------------------
def check_passage(x, y, bit)
all_tiles(x, y).each do |tile_id|
flag = tileset.flags[tile_id]
next if flag & 0x10 != 0 # [☆]: No effect on passage
return true if flag & bit == 0 # [○] : Passable
return false if flag & bit == bit # [×] : Impassable
end
return false # Impassable
end
#--------------------------------------------------------------------------
# * Get Tile ID at Specified Coordinates
#--------------------------------------------------------------------------
def tile_id(x, y, z)
@map.data[x, y, z] || 0
end
#--------------------------------------------------------------------------
# * Get Array of All Layer Tiles (Top to Bottom) at Specified Coordinates
#--------------------------------------------------------------------------
def layered_tiles(x, y)
[2, 1, 0].collect {|z| tile_id(x, y, z) }
end
#--------------------------------------------------------------------------
# * Get Array of All Tiles (Including Events) at Specified Coordinates
#--------------------------------------------------------------------------
def all_tiles(x, y)
tile_events_xy(x, y).collect {|ev| ev.tile_id } + layered_tiles(x, y)
end
#--------------------------------------------------------------------------
# * Get Type of Auto Tile at Specified Coordinates
#--------------------------------------------------------------------------
def autotile_type(x, y, z)
tile_id(x, y, z) >= 2048 ? (tile_id(x, y, z) - 2048) / 48 : -1
end
#--------------------------------------------------------------------------
# * Determine Passability of Normal Character
# d: direction (2,4,6,8)
# Determines whether the tile at the specified coordinates is passable
# in the specified direction.
#--------------------------------------------------------------------------
def passable?(x, y, d)
check_passage(x, y, (1 << (d / 2 - 1)) & 0x0f)
end
#--------------------------------------------------------------------------
# * Determine if Passable by Boat
#--------------------------------------------------------------------------
def boat_passable?(x, y)
check_passage(x, y, 0x0200)
end
#--------------------------------------------------------------------------
# * Determine if Passable by Ship
#--------------------------------------------------------------------------
def ship_passable?(x, y)
check_passage(x, y, 0x0400)
end
#--------------------------------------------------------------------------
# * Determine if Airship can Land
#--------------------------------------------------------------------------
def airship_land_ok?(x, y)
check_passage(x, y, 0x0800) && check_passage(x, y, 0x0f)
end
#--------------------------------------------------------------------------
# * Determine Flag for All Layers at Specified Coordinates
#--------------------------------------------------------------------------
def layered_tiles_flag?(x, y, bit)
layered_tiles(x, y).any? {|tile_id| tileset.flags[tile_id] & bit != 0 }
end
#--------------------------------------------------------------------------
# * Determine if Ladder
#--------------------------------------------------------------------------
def ladder?(x, y)
valid?(x, y) && layered_tiles_flag?(x, y, 0x20)
end
#--------------------------------------------------------------------------
# * Determine if Bush
#--------------------------------------------------------------------------
def bush?(x, y)
valid?(x, y) && layered_tiles_flag?(x, y, 0x40)
end
#--------------------------------------------------------------------------
# * Determine if Counter
#--------------------------------------------------------------------------
def counter?(x, y)
valid?(x, y) && layered_tiles_flag?(x, y, 0x80)
end
#--------------------------------------------------------------------------
# * Determine if Damage Floor
#--------------------------------------------------------------------------
def damage_floor?(x, y)
valid?(x, y) && layered_tiles_flag?(x, y, 0x100)
end
#--------------------------------------------------------------------------
# * Get Terrain Tag
#--------------------------------------------------------------------------
def terrain_tag(x, y)
return 0 unless valid?(x, y)
layered_tiles(x, y).each do |tile_id|
tag = tileset.flags[tile_id] >> 12
return tag if tag > 0
end
return 0
end
#--------------------------------------------------------------------------
# * Get Region ID
#--------------------------------------------------------------------------
def region_id(x, y)
valid?(x, y) ? @map.data[x, y, 3] >> 8 : 0
end
#--------------------------------------------------------------------------
# * Start Scroll
#--------------------------------------------------------------------------
def start_scroll(direction, distance, speed)
@scroll_direction = direction
@scroll_rest = distance
@scroll_speed = speed
end
#--------------------------------------------------------------------------
# * Determine if Scrolling
#--------------------------------------------------------------------------
def scrolling?
@scroll_rest > 0
end
#--------------------------------------------------------------------------
# * Frame Update
# main: Interpreter update flag
#--------------------------------------------------------------------------
def update(main = false)
refresh if @need_refresh
update_interpreter if main
update_scroll
update_events
update_vehicles
update_parallax
@screen.update
end
#--------------------------------------------------------------------------
# * Update Scroll
#--------------------------------------------------------------------------
def update_scroll
return unless scrolling?
last_x = @display_x
last_y = @display_y
do_scroll(@scroll_direction, scroll_distance)
if @display_x == last_x && @display_y == last_y
@scroll_rest = 0
else
@scroll_rest -= scroll_distance
end
end
#--------------------------------------------------------------------------
# * Calculate Scroll Distance
#--------------------------------------------------------------------------
def scroll_distance
2 ** @scroll_speed / 256.0
end
#--------------------------------------------------------------------------
# * Execute Scroll
#--------------------------------------------------------------------------
def do_scroll(direction, distance)
case direction
when 2; scroll_down (distance)
when 4; scroll_left (distance)
when 6; scroll_right(distance)
when 8; scroll_up (distance)
end
end
#--------------------------------------------------------------------------
# * Update Events
#--------------------------------------------------------------------------
def update_events
@events.each_value {|event| event.update }
@common_events.each {|event| event.update }
end
#--------------------------------------------------------------------------
# * Update Vehicles
#--------------------------------------------------------------------------
def update_vehicles
@vehicles.each {|vehicle| vehicle.update }
end
#--------------------------------------------------------------------------
# * Update Parallax
#--------------------------------------------------------------------------
def update_parallax
@parallax_x += @parallax_sx / 64.0 if @parallax_loop_x
@parallax_y += @parallax_sy / 64.0 if @parallax_loop_y
end
#--------------------------------------------------------------------------
# * Change Tileset
#--------------------------------------------------------------------------
def change_tileset(tileset_id)
@tileset_id = tileset_id
refresh
end
#--------------------------------------------------------------------------
# * Change Battle Background
#--------------------------------------------------------------------------
def change_battleback(battleback1_name, battleback2_name)
@battleback1_name = battleback1_name
@battleback2_name = battleback2_name
end
#--------------------------------------------------------------------------
# * Change Parallax Background
#--------------------------------------------------------------------------
def change_parallax(name, loop_x, loop_y, sx, sy)
@parallax_name = name
@parallax_x = 0 if @parallax_loop_x && !loop_x
@parallax_y = 0 if @parallax_loop_y && !loop_y
@parallax_loop_x = loop_x
@parallax_loop_y = loop_y
@parallax_sx = sx
@parallax_sy = sy
end
#--------------------------------------------------------------------------
# * Update Interpreter
#--------------------------------------------------------------------------
def update_interpreter
loop do
@interpreter.update
return if @interpreter.running?
if @interpreter.event_id > 0
unlock_event(@interpreter.event_id)
@interpreter.clear
end
return unless setup_starting_event
end
end
#--------------------------------------------------------------------------
# * Unlock Event
#--------------------------------------------------------------------------
def unlock_event(event_id)
@events[event_id].unlock if @events[event_id]
end
#--------------------------------------------------------------------------
# * Starting Event Setup
#--------------------------------------------------------------------------
def setup_starting_event
refresh if @need_refresh
return true if @interpreter.setup_reserved_common_event
return true if setup_starting_map_event
return true if setup_autorun_common_event
return false
end
#--------------------------------------------------------------------------
# * Determine Existence of Starting Map Event
#--------------------------------------------------------------------------
def any_event_starting?
@events.values.any? {|event| event.starting }
end
#--------------------------------------------------------------------------
# * Detect/Set Up Starting Map Event
#--------------------------------------------------------------------------
def setup_starting_map_event
event = @events.values.find {|event| event.starting }
event.clear_starting_flag if event
@interpreter.setup(event.list, event.id) if event
event
end
#--------------------------------------------------------------------------
# * Detect/Set Up Autorun Common Event
#--------------------------------------------------------------------------
def setup_autorun_common_event
event = $data_common_events.find do |event|
event && event.autorun? && $game_switches[event.switch_id]
end
@interpreter.setup(event.list) if event
event
end
def graphics_width
Graphics.width
end
def graphics_height
Graphics.height
end
end (остальные страницы см. в следующих сообщениях) Что хотелось бы улучшить: Что хотелось бы сделать, но сейчас нет времени, так что помочь принимается: - Удобство использования с другими скриптами, например, не константные значения файла интерфейса и субкарты. - Перемещение вида в другой угол экрана, если персонаж оказывается под ним и перестаёт быть виден. - Возможность нескольких разных видов одновременно и по отдельности. - Возможность отключить обработку карты в виде, чтобы её события не действовали, пока не видны (или пока не нужно, чтобы они действовали). - Лучшая презентация: огонь явно не подходит как пример рамки интерфейса %) - Более адекватное скрывание вида в бою. - Возможность, чтобы вид не скрывался в бою и на других экранах. - Возможность убрать отключение-включение вида по кнопки. - Возможность управляемому персонажу находиться на субкарте, а также правильно показывать на субкарте другие действия (транспорт, ходящая гуськом партия). Что хотелось бы сделать, но скорее всего невозможно: - Такое же постепенное появление Вьюпорта с видом, как и появление интерфейса. Но похоже, что Вьюпорты не поддерживают прозрачность. - Чтобы все скрипты дополнения были на одной компактной страницы, а не нуждались в замене стандартных страниц. Но, кажется, необходимые изменения в них слишком точечные и разбросанные, чтобы это было возможно.
Вложения:
|
Последнее редактирование: 10 года 1 мес. назад от EvilCat.
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74771
|
страница Game_CharacterBase [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #==============================================================================
# ** Game_CharacterBase
#------------------------------------------------------------------------------
# This base class handles characters. It retains basic information, such as
# coordinates and graphics, shared by all characters.
#==============================================================================
# modified by EvilCat: $game_map references replaced with local @game_map var
class Game_CharacterBase
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :id # ID
attr_reader :x # map X coordinate (logical)
attr_reader :y # map Y coordinate (logical)
attr_reader :real_x # map X coordinate (real)
attr_reader :real_y # map Y coordinate (real)
attr_reader :tile_id # tile ID (invalid if 0)
attr_reader :character_name # character graphic filename
attr_reader :character_index # character graphic index
attr_reader :move_speed # movement speed
attr_reader :move_frequency # movement frequency
attr_reader :walk_anime # walking animation
attr_reader :step_anime # stepping animation
attr_reader :direction_fix # direction fix
attr_reader :opacity # opacity level
attr_reader :blend_type # blending method
attr_reader :direction # direction
attr_reader :pattern # pattern
attr_reader :priority_type # priority type
attr_reader :through # pass-through
attr_reader :bush_depth # bush depth
attr_accessor :animation_id # animation ID
attr_accessor :balloon_id # balloon icon ID
attr_accessor :transparent # transparency flag
attr_reader :game_map # added by EvilCat
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(game_map=$game_map)
@game_map=game_map
init_public_members
init_private_members
end
#--------------------------------------------------------------------------
# * Initialize Public Member Variables
#--------------------------------------------------------------------------
def init_public_members
@id = 0
@x = 0
@y = 0
@real_x = 0
@real_y = 0
@tile_id = 0
@character_name = ""
@character_index = 0
@move_speed = 4
@move_frequency = 6
@walk_anime = true
@step_anime = false
@direction_fix = false
@opacity = 255
@blend_type = 0
@direction = 2
@pattern = 1
@priority_type = 1
@through = false
@bush_depth = 0
@animation_id = 0
@balloon_id = 0
@transparent = false
end
#--------------------------------------------------------------------------
# * Initialize Private Member Variables
#--------------------------------------------------------------------------
def init_private_members
@original_direction = 2 # Original direction
@original_pattern = 1 # Original pattern
@anime_count = 0 # Animation count
@stop_count = 0 # Stop count
@jump_count = 0 # Jump count
@jump_peak = 0 # Jump peak count
@locked = false # Locked flag
@prelock_direction = 0 # Direction before lock
@move_succeed = true # Move success flag
end
#--------------------------------------------------------------------------
# * Determine Coordinate Match
#--------------------------------------------------------------------------
def pos?(x, y)
@x == x && @y == y
end
#--------------------------------------------------------------------------
# * Determine if Coordinates Match and Pass-Through Is Off (nt = No Through)
#--------------------------------------------------------------------------
def pos_nt?(x, y)
pos?(x, y) && !@through
end
#--------------------------------------------------------------------------
# * Determine if [Same as Characters] Priority
#--------------------------------------------------------------------------
def normal_priority?
@priority_type == 1
end
#--------------------------------------------------------------------------
# * Determine if Moving
#--------------------------------------------------------------------------
def moving?
@real_x != @x || @real_y != @y
end
#--------------------------------------------------------------------------
# * Determine if Jumping
#--------------------------------------------------------------------------
def jumping?
@jump_count > 0
end
#--------------------------------------------------------------------------
# * Calculate Jump Height
#--------------------------------------------------------------------------
def jump_height
(@jump_peak * @jump_peak - (@jump_count - @jump_peak).abs ** 2) / 2
end
#--------------------------------------------------------------------------
# * Determine if Stopping
#--------------------------------------------------------------------------
def stopping?
!moving? && !jumping?
end
#--------------------------------------------------------------------------
# * Get Move Speed (Account for Dash)
#--------------------------------------------------------------------------
def real_move_speed
@move_speed + (dash? ? 1 : 0)
end
#--------------------------------------------------------------------------
# * Calculate Move Distance per Frame
#--------------------------------------------------------------------------
def distance_per_frame
2 ** real_move_speed / 256.0
end
#--------------------------------------------------------------------------
# * Determine if Dashing
#--------------------------------------------------------------------------
def dash?
return false
end
#--------------------------------------------------------------------------
# * Determine if Debug Pass-Through State
#--------------------------------------------------------------------------
def debug_through?
return false
end
#--------------------------------------------------------------------------
# * Straighten Position
#--------------------------------------------------------------------------
def straighten
@pattern = 1 if @walk_anime || @step_anime
@anime_count = 0
end
#--------------------------------------------------------------------------
# * Get Opposite Direction
# d : Direction (2,4,6,8)
#--------------------------------------------------------------------------
def reverse_dir(d)
return 10 - d
end
#--------------------------------------------------------------------------
# * Determine if Passable
# d : Direction (2,4,6,8)
#--------------------------------------------------------------------------
def passable?(x, y, d)
x2 = @game_map.round_x_with_direction(x, d)
y2 = @game_map.round_y_with_direction(y, d)
return false unless @game_map.valid?(x2, y2)
return true if @through || debug_through?
return false unless map_passable?(x, y, d)
return false unless map_passable?(x2, y2, reverse_dir(d))
return false if collide_with_characters?(x2, y2)
return true
end
#--------------------------------------------------------------------------
# * Determine Diagonal Passability
# horz : Horizontal (4 or 6)
# vert : Vertical (2 or 8)
#--------------------------------------------------------------------------
def diagonal_passable?(x, y, horz, vert)
x2 = @game_map.round_x_with_direction(x, horz)
y2 = @game_map.round_y_with_direction(y, vert)
(passable?(x, y, vert) && passable?(x, y2, horz)) ||
(passable?(x, y, horz) && passable?(x2, y, vert))
end
#--------------------------------------------------------------------------
# * Determine if Map is Passable
# d : Direction (2,4,6,8)
#--------------------------------------------------------------------------
def map_passable?(x, y, d)
@game_map.passable?(x, y, d)
end
#--------------------------------------------------------------------------
# * Detect Collision with Character
#--------------------------------------------------------------------------
def collide_with_characters?(x, y)
collide_with_events?(x, y) || collide_with_vehicles?(x, y)
end
#--------------------------------------------------------------------------
# * Detect Collision with Event
#--------------------------------------------------------------------------
def collide_with_events?(x, y)
@game_map.events_xy_nt(x, y).any? do |event|
event.normal_priority? || self.is_a?(Game_Event)
end
end
#--------------------------------------------------------------------------
# * Detect Collision with Vehicle
#--------------------------------------------------------------------------
def collide_with_vehicles?(x, y)
@game_map.boat.pos_nt?(x, y) || @game_map.ship.pos_nt?(x, y)
end
#--------------------------------------------------------------------------
# * Move to Designated Position
#--------------------------------------------------------------------------
def moveto(x, y)
@x = x % @game_map.width
@y = y % @game_map.height
@real_x = @x
@real_y = @y
@prelock_direction = 0
straighten
update_bush_depth
end
#--------------------------------------------------------------------------
# * Change Direction to Designated Direction
# d : Direction (2,4,6,8)
#--------------------------------------------------------------------------
def set_direction(d)
@direction = d if !@direction_fix && d != 0
@stop_count = 0
end
#--------------------------------------------------------------------------
# * Determine Tile
#--------------------------------------------------------------------------
def tile?
@tile_id > 0 && @priority_type == 0
end
#--------------------------------------------------------------------------
# * Determine Object Character
#--------------------------------------------------------------------------
def object_character?
@tile_id > 0 || @character_name[0, 1] == '!'
end
#--------------------------------------------------------------------------
# * Get Number of Pixels to Shift Up from Tile Position
#--------------------------------------------------------------------------
def shift_y
object_character? ? 0 : 4
end
#--------------------------------------------------------------------------
# * Get Screen X-Coordinates
#--------------------------------------------------------------------------
def screen_x
@game_map.adjust_x(@real_x) * 32 + 16
end
#--------------------------------------------------------------------------
# * Get Screen Y-Coordinates
#--------------------------------------------------------------------------
def screen_y
@game_map.adjust_y(@real_y) * 32 + 32 - shift_y - jump_height
end
#--------------------------------------------------------------------------
# * Get Screen Z-Coordinates
#--------------------------------------------------------------------------
def screen_z
@priority_type * 100
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
update_animation
return update_jump if jumping?
return update_move if moving?
return update_stop
end
#--------------------------------------------------------------------------
# * Update While Jumping
#--------------------------------------------------------------------------
def update_jump
@jump_count -= 1
@real_x = (@real_x * @jump_count + @x) / (@jump_count + 1.0)
@real_y = (@real_y * @jump_count + @y) / (@jump_count + 1.0)
update_bush_depth
if @jump_count == 0
@real_x = @x = @game_map.round_x(@x)
@real_y = @y = @game_map.round_y(@y)
end
end
#--------------------------------------------------------------------------
# * Update While Moving
#--------------------------------------------------------------------------
def update_move
@real_x = [@real_x - distance_per_frame, @x].max if @x < @real_x
@real_x = [@real_x + distance_per_frame, @x].min if @x > @real_x
@real_y = [@real_y - distance_per_frame, @y].max if @y < @real_y
@real_y = [@real_y + distance_per_frame, @y].min if @y > @real_y
update_bush_depth unless moving?
end
#--------------------------------------------------------------------------
# * Update While Stopped
#--------------------------------------------------------------------------
def update_stop
@stop_count += 1 unless @locked
end
#--------------------------------------------------------------------------
# * Update Walking/Stepping Animation
#--------------------------------------------------------------------------
def update_animation
update_anime_count
if @anime_count > 18 - real_move_speed * 2
update_anime_pattern
@anime_count = 0
end
end
#--------------------------------------------------------------------------
# * Update Animation Count
#--------------------------------------------------------------------------
def update_anime_count
if moving? && @walk_anime
@anime_count += 1.5
elsif @step_anime || @pattern != @original_pattern
@anime_count += 1
end
end
#--------------------------------------------------------------------------
# * Update Animation Pattern
#--------------------------------------------------------------------------
def update_anime_pattern
if !@step_anime && @stop_count > 0
@pattern = @original_pattern
else
@pattern = (@pattern + 1) % 4
end
end
#--------------------------------------------------------------------------
# * Determine if Ladder
#--------------------------------------------------------------------------
def ladder?
@game_map.ladder?(@x, @y)
end
#--------------------------------------------------------------------------
# * Update Bush Depth
#--------------------------------------------------------------------------
def update_bush_depth
if normal_priority? && !object_character? && bush? && !jumping?
@bush_depth = 8 unless moving?
else
@bush_depth = 0
end
end
#--------------------------------------------------------------------------
# * Determine if Bush
#--------------------------------------------------------------------------
def bush?
@game_map.bush?(@x, @y)
end
#--------------------------------------------------------------------------
# * Get Terrain Tag
#--------------------------------------------------------------------------
def terrain_tag
@game_map.terrain_tag(@x, @y)
end
#--------------------------------------------------------------------------
# * Get Region ID
#--------------------------------------------------------------------------
def region_id
@game_map.region_id(@x, @y)
end
#--------------------------------------------------------------------------
# * Increase Steps
#--------------------------------------------------------------------------
def increase_steps
set_direction(8) if ladder?
@stop_count = 0
update_bush_depth
end
#--------------------------------------------------------------------------
# * Change Graphics
# character_name : new character graphic filename
# character_index : new character graphic index
#--------------------------------------------------------------------------
def set_graphic(character_name, character_index)
@tile_id = 0
@character_name = character_name
@character_index = character_index
@original_pattern = 1
end
#--------------------------------------------------------------------------
# * Determine Triggering of Frontal Touch Event
#--------------------------------------------------------------------------
def check_event_trigger_touch_front
x2 = @game_map.round_x_with_direction(@x, @direction)
y2 = @game_map.round_y_with_direction(@y, @direction)
check_event_trigger_touch(x2, y2)
end
#--------------------------------------------------------------------------
# * Determine if Touch Event is Triggered
#--------------------------------------------------------------------------
def check_event_trigger_touch(x, y)
return false
end
#--------------------------------------------------------------------------
# * Move Straight
# d: Direction (2,4,6,8)
# turn_ok : Allows change of direction on the spot
#--------------------------------------------------------------------------
def move_straight(d, turn_ok = true)
@move_succeed = passable?(@x, @y, d)
if @move_succeed
set_direction(d)
@x = @game_map.round_x_with_direction(@x, d)
@y = @game_map.round_y_with_direction(@y, d)
@real_x = @game_map.x_with_direction(@x, reverse_dir(d))
@real_y = @game_map.y_with_direction(@y, reverse_dir(d))
increase_steps
elsif turn_ok
set_direction(d)
check_event_trigger_touch_front
end
end
#--------------------------------------------------------------------------
# * Move Diagonally
# horz: Horizontal (4 or 6)
# vert: Vertical (2 or 8)
#--------------------------------------------------------------------------
def move_diagonal(horz, vert)
@move_succeed = diagonal_passable?(x, y, horz, vert)
if @move_succeed
@x = @game_map.round_x_with_direction(@x, horz)
@y = @game_map.round_y_with_direction(@y, vert)
@real_x = @game_map.x_with_direction(@x, reverse_dir(horz))
@real_y = @game_map.y_with_direction(@y, reverse_dir(vert))
increase_steps
end
set_direction(horz) if @direction == reverse_dir(horz)
set_direction(vert) if @direction == reverse_dir(vert)
end
end страница Game_Character [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #==============================================================================
# ** Game_Character
#------------------------------------------------------------------------------
# A character class with mainly movement route and other such processing
# added. It is used as a super class of Game_Player, Game_Follower,
# GameVehicle, and Game_Event.
#==============================================================================
# modified by EvilCat: $game_map references replaced with local @game_map var
class Game_Character < Game_CharacterBase
#--------------------------------------------------------------------------
# * Constants
#--------------------------------------------------------------------------
ROUTE_END = 0 # End of Move Route
ROUTE_MOVE_DOWN = 1 # Move Down
ROUTE_MOVE_LEFT = 2 # Move Left
ROUTE_MOVE_RIGHT = 3 # Move Right
ROUTE_MOVE_UP = 4 # Move Up
ROUTE_MOVE_LOWER_L = 5 # Move Lower Left
ROUTE_MOVE_LOWER_R = 6 # Move Lower Right
ROUTE_MOVE_UPPER_L = 7 # Move Upper Left
ROUTE_MOVE_UPPER_R = 8 # Move Upper Right
ROUTE_MOVE_RANDOM = 9 # Move at Random
ROUTE_MOVE_TOWARD = 10 # Move toward Player
ROUTE_MOVE_AWAY = 11 # Move away from Player
ROUTE_MOVE_FORWARD = 12 # 1 Step Forward
ROUTE_MOVE_BACKWARD = 13 # 1 Step Backward
ROUTE_JUMP = 14 # Jump
ROUTE_WAIT = 15 # Wait
ROUTE_TURN_DOWN = 16 # Turn Down
ROUTE_TURN_LEFT = 17 # Turn Left
ROUTE_TURN_RIGHT = 18 # Turn Right
ROUTE_TURN_UP = 19 # Turn Up
ROUTE_TURN_90D_R = 20 # Turn 90 Degrees Right
ROUTE_TURN_90D_L = 21 # Turn 90 Degrees Left
ROUTE_TURN_180D = 22 # Turn 180 Degrees
ROUTE_TURN_90D_R_L = 23 # Turn 90 Degrees Right/Left
ROUTE_TURN_RANDOM = 24 # Turn at Random
ROUTE_TURN_TOWARD = 25 # Turn toward player
ROUTE_TURN_AWAY = 26 # Turn away from Player
ROUTE_SWITCH_ON = 27 # Switch ON
ROUTE_SWITCH_OFF = 28 # Switch OFF
ROUTE_CHANGE_SPEED = 29 # Change Speed
ROUTE_CHANGE_FREQ = 30 # Change Frequency
ROUTE_WALK_ANIME_ON = 31 # Walking Animation ON
ROUTE_WALK_ANIME_OFF = 32 # Walking Animation OFF
ROUTE_STEP_ANIME_ON = 33 # Stepping Animation ON
ROUTE_STEP_ANIME_OFF = 34 # Stepping Animation OFF
ROUTE_DIR_FIX_ON = 35 # Direction Fix ON
ROUTE_DIR_FIX_OFF = 36 # Direction Fix OFF
ROUTE_THROUGH_ON = 37 # Pass-Through ON
ROUTE_THROUGH_OFF = 38 # Pass-Through OFF
ROUTE_TRANSPARENT_ON = 39 # Transparent ON
ROUTE_TRANSPARENT_OFF = 40 # Transparent OFF
ROUTE_CHANGE_GRAPHIC = 41 # Change Graphic
ROUTE_CHANGE_OPACITY = 42 # Change Opacity
ROUTE_CHANGE_BLENDING = 43 # Change Blending
ROUTE_PLAY_SE = 44 # Play SE
ROUTE_SCRIPT = 45 # Script
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :move_route_forcing # forced move route flag
#--------------------------------------------------------------------------
# * Initialize Public Member Variables
#--------------------------------------------------------------------------
def init_public_members
super
@move_route_forcing = false
end
#--------------------------------------------------------------------------
# * Initialize Private Member Variables
#--------------------------------------------------------------------------
def init_private_members
super
@move_route = nil # Move route
@move_route_index = 0 # Move route execution position
@original_move_route = nil # Original move route
@original_move_route_index = 0 # Original move route execution position
@wait_count = 0 # Wait count
end
#--------------------------------------------------------------------------
# * Memorize Move Route
#--------------------------------------------------------------------------
def memorize_move_route
@original_move_route = @move_route
@original_move_route_index = @move_route_index
end
#--------------------------------------------------------------------------
# * Restore Move Route
#--------------------------------------------------------------------------
def restore_move_route
@move_route = @original_move_route
@move_route_index = @original_move_route_index
@original_move_route = nil
end
#--------------------------------------------------------------------------
# * Force Move Route
#--------------------------------------------------------------------------
def force_move_route(move_route)
memorize_move_route unless @original_move_route
@move_route = move_route
@move_route_index = 0
@move_route_forcing = true
@prelock_direction = 0
@wait_count = 0
end
#--------------------------------------------------------------------------
# * Update While Stopped
#--------------------------------------------------------------------------
def update_stop
super
update_routine_move if @move_route_forcing
end
#--------------------------------------------------------------------------
# * Update Move Along Route
#--------------------------------------------------------------------------
def update_routine_move
if @wait_count > 0
@wait_count -= 1
else
@move_succeed = true
command = @move_route.list[@move_route_index]
if command
process_move_command(command)
advance_move_route_index
end
end
end
#--------------------------------------------------------------------------
# * Process Move Command
#--------------------------------------------------------------------------
def process_move_command(command)
params = command.parameters
case command.code
when ROUTE_END; process_route_end
when ROUTE_MOVE_DOWN; move_straight(2)
when ROUTE_MOVE_LEFT; move_straight(4)
when ROUTE_MOVE_RIGHT; move_straight(6)
when ROUTE_MOVE_UP; move_straight(8)
when ROUTE_MOVE_LOWER_L; move_diagonal(4, 2)
when ROUTE_MOVE_LOWER_R; move_diagonal(6, 2)
when ROUTE_MOVE_UPPER_L; move_diagonal(4, 8)
when ROUTE_MOVE_UPPER_R; move_diagonal(6, 8)
when ROUTE_MOVE_RANDOM; move_random
when ROUTE_MOVE_TOWARD; move_toward_player
when ROUTE_MOVE_AWAY; move_away_from_player
when ROUTE_MOVE_FORWARD; move_forward
when ROUTE_MOVE_BACKWARD; move_backward
when ROUTE_JUMP; jump(params[0], params[1])
when ROUTE_WAIT; @wait_count = params[0] - 1
when ROUTE_TURN_DOWN; set_direction(2)
when ROUTE_TURN_LEFT; set_direction(4)
when ROUTE_TURN_RIGHT; set_direction(6)
when ROUTE_TURN_UP; set_direction(8)
when ROUTE_TURN_90D_R; turn_right_90
when ROUTE_TURN_90D_L; turn_left_90
when ROUTE_TURN_180D; turn_180
when ROUTE_TURN_90D_R_L; turn_right_or_left_90
when ROUTE_TURN_RANDOM; turn_random
when ROUTE_TURN_TOWARD; turn_toward_player
when ROUTE_TURN_AWAY; turn_away_from_player
when ROUTE_SWITCH_ON; $game_switches[params[0]] = true
when ROUTE_SWITCH_OFF; $game_switches[params[0]] = false
when ROUTE_CHANGE_SPEED; @move_speed = params[0]
when ROUTE_CHANGE_FREQ; @move_frequency = params[0]
when ROUTE_WALK_ANIME_ON; @walk_anime = true
when ROUTE_WALK_ANIME_OFF; @walk_anime = false
when ROUTE_STEP_ANIME_ON; @step_anime = true
when ROUTE_STEP_ANIME_OFF; @step_anime = false
when ROUTE_DIR_FIX_ON; @direction_fix = true
when ROUTE_DIR_FIX_OFF; @direction_fix = false
when ROUTE_THROUGH_ON; @through = true
when ROUTE_THROUGH_OFF; @through = false
when ROUTE_TRANSPARENT_ON; @transparent = true
when ROUTE_TRANSPARENT_OFF; @transparent = false
when ROUTE_CHANGE_GRAPHIC; set_graphic(params[0], params[1])
when ROUTE_CHANGE_OPACITY; @opacity = params[0]
when ROUTE_CHANGE_BLENDING; @blend_type = params[0]
when ROUTE_PLAY_SE; params[0].play
when ROUTE_SCRIPT; eval(params[0])
end
end
#--------------------------------------------------------------------------
# * Calculate Distance in X Axis Direction
#--------------------------------------------------------------------------
def distance_x_from(x)
result = @x - x
if @game_map.loop_horizontal? && result.abs > @game_map.width / 2
if result < 0
result += @game_map.width
else
result -= @game_map.width
end
end
result
end
#--------------------------------------------------------------------------
# * Calculate Distance in Y Axis Direction
#--------------------------------------------------------------------------
def distance_y_from(y)
result = @y - y
if @game_map.loop_vertical? && result.abs > @game_map.height / 2
if result < 0
result += @game_map.height
else
result -= @game_map.height
end
end
result
end
#--------------------------------------------------------------------------
# * Move at Random
#--------------------------------------------------------------------------
def move_random
move_straight(2 + rand(4) * 2, false)
end
#--------------------------------------------------------------------------
# * Move Toward Character
#--------------------------------------------------------------------------
def move_toward_character(character)
sx = distance_x_from(character.x)
sy = distance_y_from(character.y)
if sx.abs > sy.abs
move_straight(sx > 0 ? 4 : 6)
move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0
elsif sy != 0
move_straight(sy > 0 ? 8 : 2)
move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0
end
end
#--------------------------------------------------------------------------
# * Move Away from Character
#--------------------------------------------------------------------------
def move_away_from_character(character)
sx = distance_x_from(character.x)
sy = distance_y_from(character.y)
if sx.abs > sy.abs
move_straight(sx > 0 ? 6 : 4)
move_straight(sy > 0 ? 2 : 8) if !@move_succeed && sy != 0
elsif sy != 0
move_straight(sy > 0 ? 2 : 8)
move_straight(sx > 0 ? 6 : 4) if !@move_succeed && sx != 0
end
end
#--------------------------------------------------------------------------
# * Turn Toward Character
#--------------------------------------------------------------------------
def turn_toward_character(character)
sx = distance_x_from(character.x)
sy = distance_y_from(character.y)
if sx.abs > sy.abs
set_direction(sx > 0 ? 4 : 6)
elsif sy != 0
set_direction(sy > 0 ? 8 : 2)
end
end
#--------------------------------------------------------------------------
# * Turn Away from Character
#--------------------------------------------------------------------------
def turn_away_from_character(character)
sx = distance_x_from(character.x)
sy = distance_y_from(character.y)
if sx.abs > sy.abs
set_direction(sx > 0 ? 6 : 4)
elsif sy != 0
set_direction(sy > 0 ? 2 : 8)
end
end
#--------------------------------------------------------------------------
# * Turn toward Player
#--------------------------------------------------------------------------
def turn_toward_player
turn_toward_character($game_player)
end
#--------------------------------------------------------------------------
# * Turn away from Player
#--------------------------------------------------------------------------
def turn_away_from_player
turn_away_from_character($game_player)
end
#--------------------------------------------------------------------------
# * Move toward Player
#--------------------------------------------------------------------------
def move_toward_player
move_toward_character($game_player)
end
#--------------------------------------------------------------------------
# * Move away from Player
#--------------------------------------------------------------------------
def move_away_from_player
move_away_from_character($game_player)
end
#--------------------------------------------------------------------------
# * 1 Step Forward
#--------------------------------------------------------------------------
def move_forward
move_straight(@direction)
end
#--------------------------------------------------------------------------
# * 1 Step Backward
#--------------------------------------------------------------------------
def move_backward
last_direction_fix = @direction_fix
@direction_fix = true
move_straight(reverse_dir(@direction), false)
@direction_fix = last_direction_fix
end
#--------------------------------------------------------------------------
# * Jump
# x_plus : x-coordinate plus value
# y_plus : y-coordinate plus value
#--------------------------------------------------------------------------
def jump(x_plus, y_plus)
if x_plus.abs > y_plus.abs
set_direction(x_plus < 0 ? 4 : 6) if x_plus != 0
else
set_direction(y_plus < 0 ? 8 : 2) if y_plus != 0
end
@x += x_plus
@y += y_plus
distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round
@jump_peak = 10 + distance - @move_speed
@jump_count = @jump_peak * 2
@stop_count = 0
straighten
end
#--------------------------------------------------------------------------
# * Process Move Route End
#--------------------------------------------------------------------------
def process_route_end
if @move_route.repeat
@move_route_index = -1
elsif @move_route_forcing
@move_route_forcing = false
restore_move_route
end
end
#--------------------------------------------------------------------------
# * Advance Execution Position of Move Route
#--------------------------------------------------------------------------
def advance_move_route_index
@move_route_index += 1 if @move_succeed || @move_route.skippable
end
#--------------------------------------------------------------------------
# * Turn 90° Right
#--------------------------------------------------------------------------
def turn_right_90
case @direction
when 2; set_direction(4)
when 4; set_direction(8)
when 6; set_direction(2)
when 8; set_direction(6)
end
end
#--------------------------------------------------------------------------
# * Turn 90° Left
#--------------------------------------------------------------------------
def turn_left_90
case @direction
when 2; set_direction(6)
when 4; set_direction(2)
when 6; set_direction(8)
when 8; set_direction(4)
end
end
#--------------------------------------------------------------------------
# * Turn 180°
#--------------------------------------------------------------------------
def turn_180
set_direction(reverse_dir(@direction))
end
#--------------------------------------------------------------------------
# * Turn 90° Right or Left
#--------------------------------------------------------------------------
def turn_right_or_left_90
case rand(2)
when 0; turn_right_90
when 1; turn_left_90
end
end
#--------------------------------------------------------------------------
# * Turn at Random
#--------------------------------------------------------------------------
def turn_random
set_direction(2 + rand(4) * 2)
end
#--------------------------------------------------------------------------
# * Swap Character Positions
#--------------------------------------------------------------------------
def swap(character)
new_x = character.x
new_y = character.y
character.moveto(x, y)
moveto(new_x, new_y)
end
end страница Game_Vehicle [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #==============================================================================
# ** Game_Vehicle
#------------------------------------------------------------------------------
# This class handles vehicles. It's used within the @game_map class. If there
# are no vehicles on the current map, the coordinates are set to (-1,-1).
#==============================================================================
# modified by EvilCat: $game_map references replaced with local @game_map var
class Game_Vehicle < Game_Character
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :altitude # altitude (for airships)
attr_reader :driving # driving flag
#--------------------------------------------------------------------------
# * Object Initialization
# type: vehicle type (:boat, :ship, :airship)
#--------------------------------------------------------------------------
def initialize(type, game_map=$game_map)
super(game_map)
@type = type
@altitude = 0
@driving = false
@direction = 4
@walk_anime = false
@step_anime = false
@walking_bgm = nil
init_move_speed
load_system_settings
end
#--------------------------------------------------------------------------
# * Initialize Move Speed
#--------------------------------------------------------------------------
def init_move_speed
@move_speed = 4 if @type == :boat
@move_speed = 5 if @type == :ship
@move_speed = 6 if @type == :airship
end
#--------------------------------------------------------------------------
# * Get System Settings
#--------------------------------------------------------------------------
def system_vehicle
return $data_system.boat if @type == :boat
return $data_system.ship if @type == :ship
return $data_system.airship if @type == :airship
return nil
end
#--------------------------------------------------------------------------
# * Load System Settings
#--------------------------------------------------------------------------
def load_system_settings
@map_id = system_vehicle.start_map_id
@x = system_vehicle.start_x
@y = system_vehicle.start_y
@character_name = system_vehicle.character_name
@character_index = system_vehicle.character_index
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
if @driving
@map_id = @game_map.map_id
sync_with_player
elsif @map_id == @game_map.map_id
moveto(@x, @y)
end
if @type == :airship
@priority_type = @driving ? 2 : 0
else
@priority_type = 1
end
@walk_anime = @step_anime = @driving
end
#--------------------------------------------------------------------------
# * Change Position
#--------------------------------------------------------------------------
def set_location(map_id, x, y)
@map_id = map_id
@x = x
@y = y
refresh
end
#--------------------------------------------------------------------------
# * Determine Coordinate Match
#--------------------------------------------------------------------------
def pos?(x, y)
@map_id == @game_map.map_id && super(x, y)
end
#--------------------------------------------------------------------------
# * Determine Transparency
#--------------------------------------------------------------------------
def transparent
@map_id != @game_map.map_id || super
end
#--------------------------------------------------------------------------
# * Board Vehicle
#--------------------------------------------------------------------------
def get_on
@driving = true
@walk_anime = true
@step_anime = true
@walking_bgm = RPG::BGM.last
system_vehicle.bgm.play
end
#--------------------------------------------------------------------------
# * Get Off Vehicle
#--------------------------------------------------------------------------
def get_off
@driving = false
@walk_anime = false
@step_anime = false
@direction = 4
@walking_bgm.play
end
#--------------------------------------------------------------------------
# * Synchronize With Player
#--------------------------------------------------------------------------
def sync_with_player
@x = $game_player.x
@y = $game_player.y
@real_x = $game_player.real_x
@real_y = $game_player.real_y
@direction = $game_player.direction
update_bush_depth
end
#--------------------------------------------------------------------------
# * Get Move Speed
#--------------------------------------------------------------------------
def speed
@move_speed
end
#--------------------------------------------------------------------------
# * Get Screen Y-Coordinates
#--------------------------------------------------------------------------
def screen_y
super - altitude
end
#--------------------------------------------------------------------------
# * Determine if Movement is Possible
#--------------------------------------------------------------------------
def movable?
!moving? && !(@type == :airship && @altitude < max_altitude)
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_airship_altitude if @type == :airship
end
#--------------------------------------------------------------------------
# * Update Airship Altitude
#--------------------------------------------------------------------------
def update_airship_altitude
if @driving
@altitude += 1 if @altitude < max_altitude && takeoff_ok?
elsif @altitude > 0
@altitude -= 1
@priority_type = 0 if @altitude == 0
end
@step_anime = (@altitude == max_altitude)
@priority_type = 2 if @altitude > 0
end
#--------------------------------------------------------------------------
# * Get Maximum Altitude of Airship
#--------------------------------------------------------------------------
def max_altitude
return 32
end
#--------------------------------------------------------------------------
# * Determine if Takeoff Is Possible
#--------------------------------------------------------------------------
def takeoff_ok?
$game_player.followers.gather?
end
#--------------------------------------------------------------------------
# * Determine if Docking/Landing Is Possible
# d: Direction (2,4,6,8)
#--------------------------------------------------------------------------
def land_ok?(x, y, d)
if @type == :airship
return false unless @game_map.airship_land_ok?(x, y)
return false unless @game_map.events_xy(x, y).empty?
else
x2 = @game_map.round_x_with_direction(x, d)
y2 = @game_map.round_y_with_direction(y, d)
return false unless @game_map.valid?(x2, y2)
return false unless @game_map.passable?(x2, y2, reverse_dir(d))
return false if collide_with_characters?(x2, y2)
end
return true
end
end страница Game_Event [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
# This class handles events. Functions include event page switching via
# condition determinants and running parallel process events. Used within the
# Game_Map class.
#==============================================================================
# modified by EvilCat: $game_map references replaced with local @game_map var
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :trigger # trigger
attr_reader :list # list of event commands
attr_reader :starting # starting flag
#--------------------------------------------------------------------------
# * Object Initialization
# event: RPG::Event
#--------------------------------------------------------------------------
def initialize(map_id, event, game_map=$game_map)
super(game_map)
@map_id = map_id
@event = event
@id = @event.id
moveto(@event.x, @event.y)
refresh
end
#--------------------------------------------------------------------------
# * Initialize Public Member Variables
#--------------------------------------------------------------------------
def init_public_members
super
@trigger = 0
@list = nil
@starting = false
end
#--------------------------------------------------------------------------
# * Initialize Private Member Variables
#--------------------------------------------------------------------------
def init_private_members
super
@move_type = 0 # Movement type
@erased = false # Temporary erase flag
@page = nil # Event page
end
#--------------------------------------------------------------------------
# * Detect Collision with Character
#--------------------------------------------------------------------------
def collide_with_characters?(x, y)
super || collide_with_player_characters?(x, y)
end
#--------------------------------------------------------------------------
# * Detect Collision with Player (Including Followers)
#--------------------------------------------------------------------------
def collide_with_player_characters?(x, y)
normal_priority? && $game_player.collide?(x, y)
end
#--------------------------------------------------------------------------
# * Lock (Processing in Which Executing Events Stop)
#--------------------------------------------------------------------------
def lock
unless @locked
@prelock_direction = @direction
turn_toward_player
@locked = true
end
end
#--------------------------------------------------------------------------
# * Unlock
#--------------------------------------------------------------------------
def unlock
if @locked
@locked = false
set_direction(@prelock_direction)
end
end
#--------------------------------------------------------------------------
# * Update While Stopped
#--------------------------------------------------------------------------
def update_stop
super
update_self_movement unless @move_route_forcing
end
#--------------------------------------------------------------------------
# * Update During Autonomous Movement
#--------------------------------------------------------------------------
def update_self_movement
if near_the_screen? && @stop_count > stop_count_threshold
case @move_type
when 1; move_type_random
when 2; move_type_toward_player
when 3; move_type_custom
end
end
end
#--------------------------------------------------------------------------
# * Determine if Near Visible Area of Screen
# dx: A certain number of tiles left/right of screen's center
# dy: A certain number of tiles above/below screen's center
#--------------------------------------------------------------------------
def near_the_screen?(dx = 12, dy = 8)
ax = @game_map.adjust_x(@real_x) - @game_map.graphics_width / 2 / 32
ay = @game_map.adjust_y(@real_y) - @game_map.graphics_height / 2 / 32
ax >= -dx && ax <= dx && ay >= -dy && ay <= dy
end
#--------------------------------------------------------------------------
# * Calculate Threshold of Counter for Stopping Autonomous Movement Startup
#--------------------------------------------------------------------------
def stop_count_threshold
30 * (5 - @move_frequency)
end
#--------------------------------------------------------------------------
# * Move Type : Random
#--------------------------------------------------------------------------
def move_type_random
case rand(6)
when 0..1; move_random
when 2..4; move_forward
when 5; @stop_count = 0
end
end
#--------------------------------------------------------------------------
# * Move Type : Approach
#--------------------------------------------------------------------------
def move_type_toward_player
if near_the_player?
case rand(6)
when 0..3; move_toward_player
when 4; move_random
when 5; move_forward
end
else
move_random
end
end
#--------------------------------------------------------------------------
# * Determine if Near Player
#--------------------------------------------------------------------------
def near_the_player?
sx = distance_x_from($game_player.x).abs
sy = distance_y_from($game_player.y).abs
sx + sy < 20
end
#--------------------------------------------------------------------------
# * Move Type : Custom
#--------------------------------------------------------------------------
def move_type_custom
update_routine_move
end
#--------------------------------------------------------------------------
# * Clear Starting Flag
#--------------------------------------------------------------------------
def clear_starting_flag
@starting = false
end
#--------------------------------------------------------------------------
# * Determine if Contents Are Empty
#--------------------------------------------------------------------------
def empty?
!@list || @list.size <= 1
end
#--------------------------------------------------------------------------
# * Determine if One of Specified Triggers
# triggers : Trigger array
#--------------------------------------------------------------------------
def trigger_in?(triggers)
triggers.include?(@trigger)
end
#--------------------------------------------------------------------------
# * Start Event
#--------------------------------------------------------------------------
def start
return if empty?
@starting = true
lock if trigger_in?([0,1,2])
end
#--------------------------------------------------------------------------
# * Temporarily Erase
#--------------------------------------------------------------------------
def erase
@erased = true
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
new_page = @erased ? nil : find_proper_page
setup_page(new_page) if !new_page || new_page != @page
end
#--------------------------------------------------------------------------
# * Find Event Page Meeting Conditions
#--------------------------------------------------------------------------
def find_proper_page
@event.pages.reverse.find {|page| conditions_met?(page) }
end
#--------------------------------------------------------------------------
# * Determine if Event Page Conditions Are Met
#--------------------------------------------------------------------------
def conditions_met?(page)
c = page.condition
if c.switch1_valid
return false unless $game_switches[c.switch1_id]
end
if c.switch2_valid
return false unless $game_switches[c.switch2_id]
end
if c.variable_valid
return false if $game_variables[c.variable_id] < c.variable_value
end
if c.self_switch_valid
key = [@map_id, @event.id, c.self_switch_ch]
return false if $game_self_switches[key] != true
end
if c.item_valid
item = $data_items[c.item_id]
return false unless $game_party.has_item?(item)
end
if c.actor_valid
actor = $game_actors[c.actor_id]
return false unless $game_party.members.include?(actor)
end
return true
end
#--------------------------------------------------------------------------
# * Event Page Setup
#--------------------------------------------------------------------------
def setup_page(new_page)
@page = new_page
if @page
setup_page_settings
else
clear_page_settings
end
update_bush_depth
clear_starting_flag
check_event_trigger_auto
end
#--------------------------------------------------------------------------
# * Clear Event Page Settings
#--------------------------------------------------------------------------
def clear_page_settings
@tile_id = 0
@character_name = ""
@character_index = 0
@move_type = 0
@through = true
@trigger = nil
@list = nil
@interpreter = nil
end
#--------------------------------------------------------------------------
# * Set Up Event Page Settings
#--------------------------------------------------------------------------
def setup_page_settings
@tile_id = @page.graphic.tile_id
@character_name = @page.graphic.character_name
@character_index = @page.graphic.character_index
if @original_direction != @page.graphic.direction
@direction = @page.graphic.direction
@original_direction = @direction
@prelock_direction = 0
end
if @original_pattern != @page.graphic.pattern
@pattern = @page.graphic.pattern
@original_pattern = @pattern
end
@move_type = @page.move_type
@move_speed = @page.move_speed
@move_frequency = @page.move_frequency
@move_route = @page.move_route
@move_route_index = 0
@move_route_forcing = false
@walk_anime = @page.walk_anime
@step_anime = @page.step_anime
@direction_fix = @page.direction_fix
@through = @page.through
@priority_type = @page.priority_type
@trigger = @page.trigger
@list = @page.list
@interpreter = @trigger == 4 ? Game_Interpreter.new : nil
end
#--------------------------------------------------------------------------
# * Determine if Touch Event is Triggered
#--------------------------------------------------------------------------
def check_event_trigger_touch(x, y)
return if @game_map.interpreter.running?
if @trigger == 2 && $game_player.pos?(x, y) && $game_player.game_map===@game_map
start if !jumping? && normal_priority?
end
end
#--------------------------------------------------------------------------
# * Determine if Autorun Event is Triggered
#--------------------------------------------------------------------------
def check_event_trigger_auto
start if @trigger == 3
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
check_event_trigger_auto
return unless @interpreter
@interpreter.setup(@list, @event.id, @game_map) unless @interpreter.running?
@interpreter.update
end
end |
Последнее редактирование: 10 года 1 мес. назад от EvilCat.
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74772
|
страница Spriteset_Map [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
# This class brings together map screen sprites, tilemaps, etc. It's used
# within the Scene_Map class.
#==============================================================================
# modified by EvilCat: $game_map references replaced with local game_map method
# call, which for the standard implementation returns $game_map.
class Spriteset_Map
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
create_viewports
create_tilemap
create_parallax
create_characters
create_shadow
create_weather
create_pictures
create_timer
update
end
#--------------------------------------------------------------------------
# * Create Viewport
#--------------------------------------------------------------------------
def create_viewports
@viewport1 = Viewport.new
@viewport2 = Viewport.new
@viewport3 = Viewport.new
@viewport2.z = 50
@viewport3.z = 100
end
#--------------------------------------------------------------------------
# * Create Tilemap
#--------------------------------------------------------------------------
def create_tilemap
@tilemap = Tilemap.new(@viewport1)
@tilemap.map_data = game_map.data
load_tileset
end
#--------------------------------------------------------------------------
# * Load Tileset
#--------------------------------------------------------------------------
def load_tileset
@tileset = game_map.tileset
@tileset.tileset_names.each_with_index do |name, i|
@tilemap.bitmaps[i] = Cache.tileset(name)
end
@tilemap.flags = @tileset.flags
end
#--------------------------------------------------------------------------
# * Create Parallax
#--------------------------------------------------------------------------
def create_parallax
@parallax = Plane.new(@viewport1)
@parallax.z = -100
end
#--------------------------------------------------------------------------
# * Create Character Sprite
#--------------------------------------------------------------------------
def create_characters
@character_sprites = []
game_map.events.values.each do |event|
@character_sprites.push(Sprite_Character.new(@viewport1, event))
end
game_map.vehicles.each do |vehicle|
@character_sprites.push(Sprite_Character.new(@viewport1, vehicle))
end
$game_player.followers.reverse_each do |follower|
@character_sprites.push(Sprite_Character.new(@viewport1, follower))
end
@character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
@map_id = game_map.map_id
end
#--------------------------------------------------------------------------
# * Create Airship Shadow Sprite
#--------------------------------------------------------------------------
def create_shadow
@shadow_sprite = Sprite.new(@viewport1)
@shadow_sprite.bitmap = Cache.system("Shadow")
@shadow_sprite.ox = @shadow_sprite.bitmap.width / 2
@shadow_sprite.oy = @shadow_sprite.bitmap.height
@shadow_sprite.z = 180
end
#--------------------------------------------------------------------------
# * Create Weather
#--------------------------------------------------------------------------
def create_weather
@weather = Spriteset_Weather.new(@viewport2)
end
#--------------------------------------------------------------------------
# * Create Picture Sprite
#--------------------------------------------------------------------------
def create_pictures
@picture_sprites = []
end
#--------------------------------------------------------------------------
# * Create Timer Sprite
#--------------------------------------------------------------------------
def create_timer
@timer_sprite = Sprite_Timer.new(@viewport2)
end
#--------------------------------------------------------------------------
# * Free
#--------------------------------------------------------------------------
def dispose
dispose_tilemap
dispose_parallax
dispose_characters
dispose_shadow
dispose_weather
dispose_pictures
dispose_timer
dispose_viewports
end
#--------------------------------------------------------------------------
# * Free Tilemap
#--------------------------------------------------------------------------
def dispose_tilemap
@tilemap.dispose
end
#--------------------------------------------------------------------------
# * Free Parallax
#--------------------------------------------------------------------------
def dispose_parallax
@parallax.bitmap.dispose if @parallax.bitmap
@parallax.dispose
end
#--------------------------------------------------------------------------
# * Free Character Sprite
#--------------------------------------------------------------------------
def dispose_characters
@character_sprites.each {|sprite| sprite.dispose }
end
#--------------------------------------------------------------------------
# * Free Airship Shadow Sprite
#--------------------------------------------------------------------------
def dispose_shadow
@shadow_sprite.dispose
end
#--------------------------------------------------------------------------
# * Free Weather
#--------------------------------------------------------------------------
def dispose_weather
@weather.dispose
end
#--------------------------------------------------------------------------
# * Free Picture Sprite
#--------------------------------------------------------------------------
def dispose_pictures
@picture_sprites.compact.each {|sprite| sprite.dispose }
end
#--------------------------------------------------------------------------
# * Free Timer Sprite
#--------------------------------------------------------------------------
def dispose_timer
@timer_sprite.dispose
end
#--------------------------------------------------------------------------
# * Free Viewport
#--------------------------------------------------------------------------
def dispose_viewports
@viewport1.dispose
@viewport2.dispose
@viewport3.dispose
end
#--------------------------------------------------------------------------
# * Refresh Characters
#--------------------------------------------------------------------------
def refresh_characters
dispose_characters
create_characters
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
update_tileset
update_tilemap
update_parallax
update_characters
update_shadow
update_weather
update_pictures
update_timer
update_viewports
end
#--------------------------------------------------------------------------
# * Update Tileset
#--------------------------------------------------------------------------
def update_tileset
if @tileset != game_map.tileset
load_tileset
refresh_characters
end
end
#--------------------------------------------------------------------------
# * Update Tilemap
#--------------------------------------------------------------------------
def update_tilemap
@tilemap.map_data = game_map.data
@tilemap.ox = game_map.display_x * 32
@tilemap.oy = game_map.display_y * 32
@tilemap.update
end
#--------------------------------------------------------------------------
# * Update Parallax
#--------------------------------------------------------------------------
def update_parallax
if @parallax_name != game_map.parallax_name
@parallax_name = game_map.parallax_name
@parallax.bitmap.dispose if @parallax.bitmap
@parallax.bitmap = Cache.parallax(@parallax_name)
Graphics.frame_reset
end
@parallax.ox = game_map.parallax_ox(@parallax.bitmap)
@parallax.oy = game_map.parallax_oy(@parallax.bitmap)
end
#--------------------------------------------------------------------------
# * Update Character Sprite
#--------------------------------------------------------------------------
def update_characters
refresh_characters if @map_id != game_map.map_id
@character_sprites.each {|sprite| sprite.update }
end
#--------------------------------------------------------------------------
# * Update Airship Shadow Sprite
#--------------------------------------------------------------------------
def update_shadow
airship = game_map.airship
@shadow_sprite.x = airship.screen_x
@shadow_sprite.y = airship.screen_y + airship.altitude
@shadow_sprite.opacity = airship.altitude * 8
@shadow_sprite.update
end
#--------------------------------------------------------------------------
# * Update Weather
#--------------------------------------------------------------------------
def update_weather
@weather.type = game_map.screen.weather_type
@weather.power = game_map.screen.weather_power
@weather.ox = game_map.display_x * 32
@weather.oy = game_map.display_y * 32
@weather.update
end
#--------------------------------------------------------------------------
# *Update Picture Sprite
#--------------------------------------------------------------------------
def update_pictures
game_map.screen.pictures.each do |pic|
@picture_sprites[pic.number] ||= Sprite_Picture.new(@viewport2, pic)
@picture_sprites[pic.number].update
end
end
#--------------------------------------------------------------------------
# * Update Timer Sprite
#--------------------------------------------------------------------------
def update_timer
@timer_sprite.update
end
#--------------------------------------------------------------------------
# * Update Viewport
#--------------------------------------------------------------------------
def update_viewports
@viewport1.tone.set(game_map.screen.tone)
@viewport1.ox = game_map.screen.shake
@viewport2.color.set(game_map.screen.flash_color)
@viewport3.color.set(0, 0, 0, 255 - game_map.screen.brightness)
@viewport1.update
@viewport2.update
@viewport3.update
end
def game_map
$game_map
end
end |
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74786
|
Собственно, один вопрос: зачем заменять имеющиеся страницы, если можно всё это добавлять в материалы? А так - спасибо, поизучаем
|
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74789
|
Оформить так было бы здорово (это одно из пожеланий), но не представляется возможным :\ Допустим, в Game_CharacterBase тридцать-сорок отсылок к $game_map в самых разных методах. Большая часть была заменена на @game_map. Чтобы сделать это не заменой страницы кода, а дополнением, пришлось бы, во-первых, переопределить больше половины методов, во-вторых, эти переопределённые методы будут просто копиями с парой заменённых символов. Разница с заменой оригинальной кодовой страницы получается очень невелика.
|
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74792
|
Если помнить, что заменял, то да. Если скрипт предназначен для "чайников" - лучше даже небольшие изменения выносить отдельно, чтобы они были очевидны, иначе потом будет много вопросов, с чем там что-то конфликтует.
|
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74800
|
Представляю себе такой случай. Допустим, будет страница с кодом Game_BaseCharacter_EvilCat, где в классе Game_BaseCharacter будут переопределены 30 методов, внутри которых будет копипаста из оригинального класса, только с заменой $game_map на @game_map. По другому, с alias'ами, не получится, потому что не добавлены дополнительные действия, а только изменены отдельные строчки.
В таком случае эти файлы, содержащие в принципе копипасту половины оригинального кода с мелкими изменениями, необходимо размещать до всех других скриптов, поскольку если какой-нибудь скрипт сделает "alias :стандартный_метод :моя_копия_стандартного_метода", а в его новом стандартном_методе сделать "super; что-то от себя", а потом Game_BaseCharacter_EvilCat тупо переопределит стандартный_метод, то функционал того скрипта перестанет работать. Кроме того, при отладке написания скриптов в присутствии такого дублирования могут возникнуть трудности с тем, куда смотреть: в Game_BaseCharacter или в Game_BaseCharacter_EvilCat, потому что придётся помнить, которые методы были перегружены в последнем. Мне кажется, легче просто заменить оригинальные классы. |
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74801
|
"Копипасту половины оригинального кода" можно и нужно запихнуть в некий аналог "ядра", во-первых. А насчёт "отладки" - господи, Ctrl+Shift+F вам в помощь
|
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74802
|
"Копипасту половины оригинального кода" можно и нужно запихнуть в некий аналог "ядра" Научи, пожалуйста. |
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74804
|
Я имею в виду - ту часть кода, которая должна быть выше всех, есть смысл выделять в отдельный блок с пометкой "ставить выше всех". Тогда как раз вопрос с конфликтами будет решаться максимально быстро.
|
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 10 года 1 мес. назад #74805
|
EvilCat, можешь посмотреть на то, как реализовано все хотя у этого парня:
victorscripts.wordpress.com/rpg-maker-vx-ace/ (скрипты отдельно, базовый модуль - отдельно, но требуется для работы). Разберешься с этим - натолкнет на правильные мысли в нужном направлении ^_^ |
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 9 года 10 мес. назад #76992
|
EvilCat работа над скриптом продолжается или это уже полностью готовый вариант?
Можно узнать ) -как изменить размеры окна ? -как поместить окно в другой угол ? -можно ли чтобы окно отслеживало определённый евент и передвигало изображение в окне за ним ? -можно ли включить окно через переменные или переключатели и также его выключить? -есть ли возможность включить несколько окон одновременно ))? -как сделать чтобы в окне отображался главный герой если он стоит в том месте где в окне отображается изображение ? -можно ли чтобы окно переключалась на определённые евенты (скажем я нажал на кнопку и в окне показывается как где то открылась дверь потом я нажал на другую кнопку и в окне показывается уже другое изображение но дверь в предыдущем месте остаётся открытой ) -возможно сделать чтобы изображение в окне переключалось по нажатию кнопки на клавиатуре или по выбору из меню? - как сделать чтобы в окне отображался не верхней левый угол а другое место на карте? - как заменить фон с огнём или убрать его ? - возможно ли менять фон переменными или переключателями? Слишком много хочу Большое спасибо за скрипт !!! |
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 9 года 10 мес. назад #76993
|
Jas6666 пишет:
EvilCat работа над скриптом продолжается или это уже полностью готовый вариант? Увы, с моей стороны не продолжается - я сделала и залила много обновлений для браузерки, в которой участвую, а вот на Мейкер времени не хватило -_- Сейчас постараюсь вспомнить ответы на твои вопросы %) -как изменить размеры окна ? -как поместить окно в другой угол ? На странице "PiP" скриптов есть такие строчки: SUBVIEW_X=10 SUBVIEW_Y=10 SUBVIEW_WIDTH=200 SUBVIEW_HEIGHT=200 Первые два параметра - координаты левого верхнего угла окна, а вторые два - его ширина и высота. -можно ли чтобы окно отслеживало определённый евент и передвигало изображение в окне за ним ? Об этом я не подумала... Кажется, сейчас окно показывает строго левый верхний угол. Сейчас я не могу сесть и разобраться, так что вопрос к знатокам, как двигать камеру скриптами независимо от персонажа? %)- как сделать чтобы в окне отображался не верхней левый угол а другое место на карте? -можно ли включить окно через переменные или переключатели и также его выключить? Объект окна предусматривает методы toggle (переключение видимости), set_visible (сделать показываемым) и set_invisible (сделать невидимым). В событиях можно использовать команду Script, которая задействует эти методы. Если я не ошибаюсь, написать нужно просто PiPHud.toggle (или другой нужный метод).-есть ли возможность включить несколько окон одновременно ))? Не в данной версии скрипта, но технически ограничений нет - если кто-то поможет с доработкой кода, это будет возможным %)-как сделать чтобы в окне отображался главный герой если он стоит в том месте где в окне отображается изображение ? Увы, это тоже требует серьёзной доработки кода.-можно ли чтобы окно переключалась на определённые евенты (скажем я нажал на кнопку и в окне показывается как где то открылась дверь потом я нажал на другую кнопку и в окне показывается уже другое изображение но дверь в предыдущем месте остаётся открытой ) Если подойдут знатоки и скажут, как именно задавать координаты камеры, это можно будет сделать легко %) Что касается открытых дверей, то это вообще исключительно вопрос переменных и триггеров - видимость двери в окне никак не помогает и не мешает ей быть открытой в соответствии с триггерами.-возможно сделать чтобы изображение в окне переключалось по нажатию кнопки на клавиатуре или по выбору из меню? Насчёт выбора в меню не знаю, как у тебя устроены меню... Но что касается кнопок, то в коде PiP есть такое место:def self.update toggle if Input.trigger?(TOGGLE_KEY) refresh @submap.update(true) @submap_view.update end ...а TOGGLE_KEY задана сверху как: TOGGLE_KEY=:F5 Можно сделать различные реакции и на другие кнопки, типа: <какой_нибудь_метод> if Input.trigger?(:F10) - как заменить фон с огнём или убрать его ? Спрайт с огнём задан здесь:HUD_FILE='Graphics/Titles2/Fire' Можно указать другой файл. В данной версии скрипта я не предусмотрела отсутствия спрайта -_- - возможно ли менять фон переменными или переключателями? Сейчас подобного не предусмотрено, но скорее всего его можно менять простой скриптовой командой:PiPHud.expose_sprite.bitmap=Bitmap.new('<адрес файла>') Если перед этим добавить в модуль PiPHud: def expose_sprite @sprite end Слишком много хочу Большое спасибо за скрипт !!! Рада, если хотя бы чем-то он поможет! %) И ты всё правильно хочешь. С такой механикой можно много интересного сделать, жаль только, что времени в сутках так мало -_- |
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Jas6666
|
Картинка в картинке - вид на другую карту 9 года 10 мес. назад #76999
|
EvilCat почему бы тебе не попросить помощи на этом форуме в помощи и на форуме нейтральной полосы,
с этим скриптом можно такое наворотить в создании игр даже сейчас ))) а что можно будет когда он будет со всякими примочками |
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 9 года 10 мес. назад #77000
|
Я уже попросила помощи на IRC-канале... Каюсь, я гейм-дизайнер больше, чем программист, так что если без меня скрипт доведут до ума, я не расстроюсь, а обрадуюсь %)
|
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 9 года 10 мес. назад #77728
|
Интересный скрипт, как волшебное зеркало которое позволяет наблюдать за другими мирами.
Пару небольших замечаний: лучше все это дело при старте игры сделать отключенным, запустил не создав вторую карту получил от мейкера ошибку, по умолчанию как раз таки INITIALLY_VISIBLE=true. Размеры окна советую делать кратные 32, для определенного количества тайлов. Персонаж в окне вообще не отображается (можно и текущую карту туда засунуть). Нужна прозрачность окошка. Есть вариант: сделать как игровой экран только с размерами не 580 × 444 а меньше. Было бы забавно переключатся между экранами расширяя на весь экран свернутый и сворачивая текущий))) Можно еще для рыбалки скрипт использовать смотреть когда рыба подплывает и подсекать))) Или для камеры слежения, если стелс игра. Все заносить начинает, значит спать пора! Покопаюсь на досуге, может чего и получится! |
Последнее редактирование: 9 года 10 мес. назад от Arykray.
Администратор запретил публиковать записи гостям.
|
Картинка в картинке - вид на другую карту 9 года 9 мес. назад #77974
|
Гляньте эту версию: Яндекс
Удалил огненное оформление, добавил возможность вызывать нужную карту через скрипты в эвентах - используйте change_pip_map(id) Вроде работает... |
Последнее редактирование: 9 года 9 мес. назад от DK. Причина: забыл ссылку :)
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: MaltonTheWarrior, EvilCat
|
Картинка в картинке - вид на другую карту 9 года 9 мес. назад #77979
|
Спасибо огромное за доработку! %)
|
Администратор запретил публиковать записи гостям.
|
Модераторы: NeKotZima
Время создания страницы: 0.559 секунд