Код:
# Event shifts script VX ACE
# автор: caveman
# версия 1.1
#
# Скрипт позволяет:
# - задавать сдвиги в px для отрисовки спрайта события
# - задавать сдвиг по высоте z для определения, что будет отрисовано
# сверху при наложении спрайтов событий
#
# Просто напишите в комменте события нечто вроде
# [es|-16|16|1]
# для сдвига картинки события влево на 16 пикселей и вниз на 16, и
# сдвига 1 по оси z (даже +1 по z хватит, чтобы перекрыть события
# без этого сдвига.
#
#
# BIG events script VX ACE
# автор: caveman
# версия 1.1
# Скрипт позволяет задать ограничивающий прямоугольник вокруг события
# Он корректно подсчитывает коллизии, с учетом поворотов и движений
#
# Можно пользовать скрипт для больших монстров или линий-телепортов на
# другую карту
#
# Просто напишите в комменте события нечто вроде
# [bbox|1|1|2|0] (влево, вправо, вверх, вниз)
#
#
# MultiGraphic script VX ACE
# автор: caveman
# версия 1.2
#
# Скрипт позволяет:
# - комментарием навершивать сверху на событие графику из любого
# доступного тайлсета, потенциально сколько угодно слоев
# - делать то же самое из чарсета, с возможностью stop анимации
# - задавать сдвиги этой графике, аналогично скрипту Event shifts
# сверху при наложении спрайтов событий
# - проставлять событиям свойство counter
#
# Просто напишите в комменте события нечто вроде
# [dop|Inside_C|t|1|3|8|-16|1]
# на событие сверху наложится графика из тайлсета Inside_C в позиции
# 1, 3 (отсчет по 32 пикселя тайл, от нуля сверху слева)
# со сдвигом картинки вправо на 8 пикселей и вверх на 16, и
# сдвига 1 по оси z
#
# Режимы доп графики - это второй параметр
# t - тайлсет
# с - чарсет (мелкий, 3 на 4)
# a - анимация stop из чарсета (мелкий, 3 на 4). Скорость анимации зависит
# от заданной frequency события
#
# дополнительный тег <counter> в комментарии события позволяет взаимодействовать с другим событием
# через это (работает как counter в тайлсете)
#
# Event features script
# автор: caveman
# версия 1.0
#
# Скрипт позволяет:
# - комментарием поворачивать или зумить графику события
# - задавать вращение событию, регулируя скорость в комменте
#
# Просто напишите в комменте события нечто вроде
# 1) [rot|10|0]
# графика события повернется по часовой стрелке на 10 градусов
# 2) [rot|0|5]
# графика события будет вращаться по часовой стрелке со скоростью 5 градусов за фрейм
# (важно: первый и второй параметры исключают друг друга)
# 3) [zoom|50|50]
# графика события будет сжата по х и у в 2 раза (значение - это проценты)
class Dop_Graphic
attr_accessor :xs # сдвиг по х
attr_accessor :ys # сдвиг по y
attr_accessor :zs # сдвиг по z
attr_accessor :rangle # угол поворота
attr_accessor :tile_x # x в тайлсете (В-Е)
attr_accessor :tile_y # y в тайлсете (В-Е)
attr_accessor :tileset # тайлсет (В-Е)
attr_accessor :mode # 0-тайлсет, 1-чарсет, 2-анимация чарсета
def initialize(tileset, mode, tile_x, tile_y, xs, ys, zs)
self.tileset=tileset
self.mode=mode
self.tile_x=tile_x
self.tile_y=tile_y
self.xs=xs
self.ys=ys
self.zs=zs
self.rangle = 0
end
end
class Sprite_Dop < Sprite_Base
attr_accessor :character
attr_accessor :dop
def initialize(viewport, character, dop)
super(viewport)
self.character = character
self.dop = dop
@cur_x = self.dop.tile_x if self.dop.mode > 0
@ani_count = 0
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_bitmap
update_ani
update_src_rect
update_position
update_other
end
#--------------------------------------------------------------------------
# * Update Transfer Origin Bitmap
#--------------------------------------------------------------------------
def update_bitmap
if self.dop.mode == 0
set_tile_bitmap
else
set_character_bitmap
end
end
#--------------------------------------------------------------------------
# * Set Tile Bitmap
#--------------------------------------------------------------------------
def set_tile_bitmap
sx = self.dop.tile_x * 32;
sy = self.dop.tile_y * 32;
self.bitmap = Cache.tileset(self.dop.tileset)
self.src_rect.set(sx, sy, 32, 32)
self.ox = 16
self.oy = 32
end
#--------------------------------------------------------------------------
# * Set Character Bitmap
#--------------------------------------------------------------------------
def set_character_bitmap
self.bitmap = Cache.character(self.dop.tileset)
@cw = bitmap.width / 3
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
end
#--------------------------------------------------------------------------
# * Update Position
#--------------------------------------------------------------------------
def update_position
self.x = @character.screen_x + dop.xs
self.y = @character.screen_y + dop.ys
self.z = @character.screen_z + dop.zs
self.angle = dop.rangle
end
def update_ani
if self.dop.mode == 2
@ani_count += 1
if @ani_count > 18 - character.move_frequency * 2
@ani_count = 0
@cur_x += 1
@cur_x = 0 if @cur_x > 2
end
end
end
def update_src_rect
if self.dop.mode > 0
sx = @cur_x * @cw;
sy = self.dop.tile_y * @ch;
self.src_rect.set(sx, sy, @cw, @ch)
end
end
#--------------------------------------------------------------------------
# * Update Other
#--------------------------------------------------------------------------
def update_other
self.opacity = @character.opacity
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
self.visible = !@character.transparent
end
end
class Game_CharacterBase
attr_accessor :xs # сдвиг по х
attr_accessor :ys # сдвиг по y
attr_accessor :zs # сдвиг по z
attr_accessor :x_sub # shift to left
attr_accessor :x_add # shift to right
attr_accessor :y_sub # shift to up
attr_accessor :y_add # shift to down
attr_accessor :rangle # rotate angle
attr_accessor :rotate_speed # rotate speed
attr_accessor :zoom_x # zoom (percents from 100)
attr_accessor :zoom_y # zoom (percents from 100)
attr_accessor :dop_graphic # доп графика события
attr_accessor :counter # событие работает как counter тайл
alias es_initialize initialize
def initialize
clear_dops
es_initialize
end
def clear_dops
self.xs=0
self.ys=0
self.zs=0
self.x_sub=0
self.x_add=0
self.y_sub=0
self.y_add=0
self.rangle=0
self.rotate_speed = 0
self.zoom_x = 100
self.zoom_y = 100
self.counter = false
self.dop_graphic = []
end
def setup_shifts(dispose)
clear_dops
unless dispose && @list.nil?
for command in @list
if command.code == 108 && command.parameters[0].include?("[es")
command.parameters[0].gsub(/\[[Ee][Ss]\|(.+?)\|(.+?)\|(.+?)\]/) do
self.xs = $1.to_s.to_i
self.ys = $2.to_s.to_i
self.zs = $3.to_s.to_i
end
end
if command.code == 108 && command.parameters[0].include?("[bbox")
command.parameters[0].gsub(/\[[Bb][Bb][Oo][Xx]\|(.+?)\|(.+?)\|(.+?)\|(.+?)\]/) do
self.x_sub = $1.to_s.to_i
self.x_add = $2.to_s.to_i
self.y_sub = $3.to_s.to_i
self.y_add = $4.to_s.to_i
end
end
if command.code == 108 && command.parameters[0].include?("[rot")
command.parameters[0].gsub(/\[[Rr][Oo][Tt]\|(.+?)\|(.+?)\]/) do
self.rangle = $1.to_s.to_i
self.rotate_speed = $2.to_s.to_i
end
end
if command.code == 108 && command.parameters[0].include?("[zoom")
command.parameters[0].gsub(/\[[Zz][Oo][Oo][Mm]\|(.+?)\|(.+?)\]/) do
self.zoom_x = $1.to_s.to_i
self.zoom_y = $2.to_s.to_i
end
end
if command.code == 108 && command.parameters[0].include?("[dop")
command.parameters[0].gsub(/\[[Dd][Oo][Pp]\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\]/) do
mode = 0
mode = 0 if $2.to_s == "t"
mode = 1 if $2.to_s == "c"
mode = 2 if $2.to_s == "a"
dop = Dop_Graphic.new($1.to_s, mode, $3.to_s.to_i, $4.to_s.to_i,
$5.to_s.to_i, $6.to_s.to_i, $7.to_s.to_i)
self.dop_graphic.push(dop)
end
end
if command.code == 108 && command.parameters[0] == "<counter>"
self.counter = true
end
end
end
end
# Столкновения для BigEvent
def pos?(x, y)
case @direction
when 2
x_s = x_sub
x_a = x_add
y_s = y_sub
y_a = y_add
when 4
x_s = y_add
x_a = y_sub
y_s = x_sub
y_a = x_add
when 6
x_s = y_sub
x_a = y_add
y_s = x_add
y_a = x_sub
when 8
x_s = x_add
x_a = x_sub
y_s = y_add
y_a = y_sub
end
for i in @x - x_s..@x + x_a
for j in @y - y_s..@y + y_a
if x == i && y == j
return true
end
end
end
return false
end
def collide_with_events?(x, y)
$game_map.events_xy_nt(x, y).any? do |event|
event.id != @id && (event.normal_priority? || self.is_a?(Game_Event))
end
end
end
class Game_Event
alias es_refresh refresh
def refresh
es_refresh
setup_shifts(@page.nil?)
#SceneManager.scene.update_dop(id) if SceneManager.scene_is?(Scene_Map)
end
end
class Sprite_Character
def update_position
move_animation(@character.screen_x + @character.xs - x,
@character.screen_y + @character.ys - y)
self.x = @character.screen_x + @character.xs
self.y = @character.screen_y + @character.ys
self.z = @character.screen_z + @character.zs
rotate_update
zoom_update
end
def rotate_update
if @character.rotate_speed == 0
self.angle = @character.rangle
else
self.ox = self.src_rect.width/2 if self.ox != self.src_rect.width/2
self.oy = self.src_rect.height/2 if self.oy != self.src_rect.height/2
self.angle += @character.rotate_speed
end
end
def zoom_update
self.zoom_y = @character.zoom_y / 100.0 if @character.zoom_y != 100
self.zoom_x = @character.zoom_x / 100.0 if @character.zoom_x != 100
end
end
class Spriteset_Map
def create_characters
@character_sprites = []
$game_map.events.values.each do |event|
@character_sprites.push(Sprite_Character.new(@viewport1, event))
end
create_dop
$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
@init = true
end
def create_dop
@dop_sprites = []
$game_map.events.values.each do |event|
event.dop_graphic.each do |dop|
@dop_sprites.push(Sprite_Dop.new(@viewport1, event, dop))
end
end
end
def clear_dop(event_id)
return if @dop_sprites == nil
p @dop_sprites.length
@dop_sprites.each do |dop|
next if dop.character.id != event_id
p 'aaaaaa'
dop.dispose
@dop_sprites.delete(dop)
end
p @dop_sprites.length
end
def add_dop(event_id)
@dop_sprites = [] if @dop_sprites == nil
$game_map.events.values.each do |event|
next if event.id != event_id
if event.dop_graphic != nil && event.dop_graphic.length > 0
event.dop_graphic.each do |dop|
@dop_sprites.push(Sprite_Dop.new(@viewport1, event, dop))
end
end
end
end
def dispose_characters
@character_sprites.each {|sprite| sprite.dispose }
@dop_sprites.each {|sprite| sprite.dispose }
@dop_sprites.clear
@dop_sprites = nil
end
def update_characters
if (@flag == nil || @flag)
refresh_characters if @map_id != $game_map.map_id
@character_sprites.each {|sprite| sprite.update }
@dop_sprites.each {|sprite| sprite.update }
end
end
def set_flag(flag)
@flag = flag
end
end
class Scene_Map
def update_dop(event_id)
if @spriteset != nil
@spriteset.set_flag(true)
@spriteset.clear_dop(event_id)
@spriteset.add_dop(event_id)
@spriteset.set_flag(nil)
@spriteset.update_characters
end
end
end
class Game_Player
def start_map_event(x, y, triggers, normal)
return if $game_map.interpreter.running?
$game_map.events_xy(x, y).each do |event|
if event.trigger_in?(triggers) && event.normal_priority? == normal && !event.counter
event.start
end
end
end
end
Социальные закладки