ГлавнаяФорумRPG MakerСкрипты/ПлагиныRPG Maker VX ACEУлучшающие или добавляющее новое скриптыAnimation Special Effects 2 (Спецэффекты)
Войти на сайт
×
ТЕМА: Animation Special Effects 2 (Спецэффекты)
Animation Special Effects 2 (Спецэффекты) 6 года 6 мес. назад #104707
|
Этот скрипт добавляет дополнительную анимацию, для создания визуальных эффектов на карте и под любым уровнем глубины (z-уровень). Вы можете с помощью него сделать анимацию спецэффектов или добавить дополнительные эмоции. Этот скрипт будет нуждаться только в одной вещи… кадровой анимации. На первый взгляд этот скрипт похож на предыдущий, скрипт по спецэффектам. Но механика отображения переписана полностью. Так что это не одно и то же. Особая благодарность Амфи, Мертвому Эльфу и Стрелку в помощи, в создание удобной опции и множество хитростей, что запрятаны внутри кода. Инструкция использования запрятана в самом скрипте. История версий: 17.12.2018 -> Версия 1.3 - Исправлен баг, с освобождением данных при смене карт 03.06.2018 -> Версия 1.2 - Исправлен Баг(Т_т) с z-уровнем и с назначением анимации на игрока 30.05.2018 -> Версия 1.1 - Добавлены две не обязательных опций: :axis_ox и :axis_oy 2018-05-15 -> Версия 1.0 - Реализация Баг: Имеется связанный со сохраненными играми. Нужно начинать новую игру. сам код ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] =begin ~~~o o~~~ begin=
:...~o[ Doctor Bug's представляет ]o~...:
:...~o[ Animation_FX ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
Автор: Doctor Bug
Для: RPGMAKER VX ACE
Версия: 1.3
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
:...~o[ История версий ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
17.12.2018 -> Версия 1.3
- Исправлен баг, с освобождением данных при смене карт
03.06.2018 -> Версия 1.2
- Исправлен Баг(Т_т) с z-уровнем и с назначением анимации
на игрока
30.05.2018 -> Версия 1.1
- Добавлены две не обязательных опций: :axis_ox и :axis_oy
2018-05-15 -> Версия 1.0
- Реализация
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
:...~o[ Описание ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
Этот скрипт добавляет дополнительную анимацию, для создания визуальных
эффектов на карте и под любым уровнем глубины (z-уровень).
Вы можете с помощью него сделать анимацию спецэффектов. Этот скрипт будет
нуждаться только в одной вещи… кадровой анимации.
И он не привередлив к размерам картинкам.
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
:...~o[ Инструкция ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
Просто скопируйте и вставьте скрипт над Main.
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
:...~o[ Вызов скрипта ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
Скрипт вызывается в сочетание с командой в событии и его настройки в модуле
«Animation_FX». Команда вызова анимации:
get_special_effect(name,id,first_frame,last_frame,pause=true)
name – Это уникальное имя анимации. Вы можете задать любое имя, занесенное в
кавычки. По этому имени, программа будет искать настройки в модули, проверять
на схожие анимации, которые были задействованы.
Id – Идентификатор события (указывается верхнем левом углу). Если значение
стоит «0», то будет анимация проигрываться на текущем событии. Если выше «0»,
то анимация будет находить анимацию с этим идентификатором и проигрываться на
его координатах.
first_frame – Здесь указывается начальный кадр анимации.
last_frame – Здесь указывается конечный кадр анимации.
Кадры насчитываются автоматически, когда вы указываете размер кадра. Вы можете
иметь в спрайт-листе и по несколько рядов в высоту. Программа будет нарезать
сама на кадры, и выдавать каждому свой номер. Если, к примеру, у вас спрайт-лист
состоит из 16 кадров, 8 кадров на один ряд. То указав к примеру начальный кадр
«0» (кадры считаются с 0, а не с 1) и конечный кадр «14», то анимация будет
будет проигрываться с первого кадра по 15 кадр включительно. Вы можете ставить
начальный кадр больше чем конечный, в этом случаи анимация будет проигрываться,
задом наперед. Вам не обязательно указывать начальный кадр с «0», это число
может быть в диапазоне всех кадров спрайт-листа.
pause – Этот метод ставит анимацию на паузу. Работает схоже с простой
(стандартной) анимацией. По умолчанию стоит ‘true’ – включен. Если ‘false’ –
то выключен. Кавычки не пишутся, по сравнению уникального имени.
#~~~o~~~o Это настройки в модуле.
В модуле «Animation_FX» - мы настраиваем анимации. В модуле нужно указывать
обязательные параметры и пожелание параметры, которые не обязательны. С начала
разберем синтаксис. Animation – этот слова не трогаем, это хэш, туда
помещается настройки каждой анимации. После символов = { на новой строчки
указывается уникальное имя (которое вы задавали в событии). Обязательно в
кавычках. После уникального имени (‘name’) пишется «=>» (Он же так называемый
«hash rocket» - хэш ракета) после указывается блок «{}» в этом блоке
указываются параметры анимации. Они могут быть разделены строчками для
удобства: ‘{’ и ‘}’. Дальше идут обязательные параметры (порядок вещей с
обязательными и не обязательными параметрами не важен). Им также через
хэш ракету задаем значения:
:picture – Сюда помещается название спрайт-листа (вашей названия покадравой
анимации). Также нужно указать их в кавычках.
:size_frame – Этот параметр вычисляет размер вашего кадра. Ширину и высоту
кадра. Если у ваших кадров не квадратные размеры, а прямоугольные то этот
параметр заменяется этими двумя параметрами:
:width_frame, :height_frame – ширина и высота кадра в спрайт-листе. Здесь уже
точно настраиваете ширину и высоту кадра. Но! Если будет указан параметр
:size_frame, то эти параметры не будут действовать, преимущество у
:size_frame.
Дальше идут параметры которые вы можете не включать в настройки анимации если
они не нужны:
:z – указывает глубину анимации. Если ниже 0 то анимация будет проигрываться
за полом. По умолчанию 200
:speed – скорость проигрывание анимации. По умолчанию 20.
:hang – Это зависание на последнем кадре. Если вы к примеру хотите чтобы
анимация на время зависла в последнем кадре указываете этот параметр и пишите
ему значения ‘true’. Или если вы хотите зациклить анимацию без мельканий
используйте ее. По умолчанию ‘false’.
:axis_ox и :axis_oy - начальные координаты самой анимации. Вы можете
настроить, для более точного отображения анимации. Чем больше будет число,
тем левее и выше будет отображаться анимация на карте.
По умолчанию стоят такие число: 16 и 28. Чтобы она точно попадала на тайл.
После указание параметра и значения параметра ставиться запятая, если вам нужно
еще указать параметр. На последнем параметры анимации запятая не ставиться.
Вот не большой пример. Не пугайтесь, как привыкните к синтаксису, будет проще.
Animation = {
'first' => {
:picture => 'pink_number',
:size_frame => 32,
:hang => true,
:speed => 10
}
Если вам будет не достаточно одной анимации (скорее всего так и будет), то вы
ставите после блока параметров анимации запятую и пишете новую анимацию.
Указывая уникальный имя и блок параметров. Пример:
Animation = {
'first' => {
:picture => 'pink_number',
:size_frame => 32,
:hang => true,
:speed => 10
}, <- сюда
'fourth' => {
:size_frame => 50,
:picture => 'Number'
}
И заполняете снова анкету с параметрами. Можно и так записать, но это не всегда
удобно.
Animation = {
'first' => {
:picture => 'pink_number',
:size_frame => 32,
:hang => true,
:speed => 10
}, 'fourth' => {:size_frame => 50, :picture => 'Number'}
Еще две команды, которые выключает и включает залипание последнего кадра в
анимации. Туда нужно лишь указать уникальное имя анимации. Помещаются в событие,
в раздел скрипта.
disable_hovering(name) – выключает залипание
enable_hovering(name) – включает залипание.
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
:...~o[ Требование ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
Данный скрипт можно использовать в любых проектах (в том числе и коммерческих),
если указано моё авторство (Doctor Bug) на данный скрипт.
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
:...~o[ Пару слов ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
Скрипт не должен конфликтовать с другими скриптами. Но вероятность того
что все таки будут конфликты, есть. Для анимации используйте рисунки
формата PNG. Разбитые по кадрам, могут не совпадать по количеству
(не которые кадры могут быть пустые). Главное как высчитаете, когда будете
рисовать их. Также ВАЖНО, рисунки с анимацией помещайте
по пути в папку \Graphics\Animations. И ГЛАВНОЕ, кадры в одном спрайт-листе
должны быть одинаковы размеров (не важно какой ширины или длины).
Вы можете использовать этот скрипт для разных целях, таких примерах как:
кислотные полы не правильной формы (не квадратные),
или взрывы в каких либо не правильной формы помещений. Или что еще взбредет вам
в голову. =)
=end # ~~~o o~~~ # end=
($imported ||= {})["Animation_Special_Effects"] = true
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
# :...~o[ Дальше не лезем!!! ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
module AnimationSpecEffects
@game_fx = {}
@events = {}
@viewport = []
class << self
def viewport(viewport)
@viewport = viewport
end
def params(name,event,data)
game_special_effects = Game_Special_Effects.new(event,data[:picture])
game_special_effects.axis_ox = data[:axis_ox] ? data[:axis_ox] : 16
game_special_effects.axis_oy = data[:axis_oy] ? data[:axis_oy] : 28
game_special_effects.first_frame = data[:first_frame]
game_special_effects.last_frame = data[:last_frame]
if data[:size_frame]
game_special_effects.size_frame = data[:size_frame]
else
game_special_effects.width_frame = data[:width_frame]
game_special_effects.height_frame = data[:height_frame]
end
if data[:speed]
game_special_effects.speed = data[:speed]
else
game_special_effects.speed = 20
end
game_special_effects.z = data[:z] ? data[:z] : 200
game_special_effects.hang = true if data[:hang]
@game_fx[name] = game_special_effects
event = Animation_Special_Effects.new(@viewport, game_special_effects)
@events[name] = event
end
def no_values_params(name)
game_special_effects = game_fx(name)
event = Animation_Special_Effects.new(@viewport, game_special_effects)
@events[name] = event
end
def control_mechanism(name,event,data)
if @events.empty?
params(name,event,data)
else
if @events.has_key?(name)
if @game_fx[name].last_frame != data[:last_frame] && @game_fx[name].finish
@game_fx[name].last_frame = data[:last_frame]
@game_fx[name].first_frame = data[:first_frame]
@game_fx[name].event = event
@game_fx[name].f1 = nil
again_visible(name)
end
if @game_fx[name].finish && @game_fx[name].last_frame == data[:last_frame]
again_visible(name)
@game_fx[name].event = event
@game_fx[name].current_index = data[:first_frame]
end
else
params(name,event,data)
end
end
end
def again_visible(name)
@game_fx[name].finish = false
@game_fx[name].visible = true
end
def inserting_parameters(name,event,first_frame,last_frame)
return if name.empty?
data = {}
Animation_FX::Animation.each_pair do |name_anim,param|
if name == name_anim
data = param
data[:first_frame] = first_frame
data[:last_frame] = last_frame
control_mechanism(name,event,data)
end
end
end
def update
@events.each_value {|event| event.update if event}
end
def update_game_fx
@game_fx.each_value {|game| game.update if game}
end
def dispose
@events.each_value {|event| event.dispose if event}
@events = {}
end
def events
@events
end
def event(name)
@events[name]
end
def game_fx(name)
@game_fx[name]
end
def hide
@events.each_value {|event| event.visible = false if event}
end
end
end
class Animation_Special_Effects < Sprite
attr_accessor :size_frame
attr_accessor :f1
def initialize(viewport, game_special_effects)
super(viewport)
@game_sfx = game_special_effects
@speed = 20
@wait = 10
@duration = 0
start_params
@game_sfx.finish = false
if !@game_sfx.current_index
@game_sfx.current_index = @game_sfx.first_frame
end
end
def start_params
self.z = @game_sfx.z
self.ox = @game_sfx.axis_ox #16
self.oy = @game_sfx.axis_oy #32
end
def dispose
bitmap.dispose if bitmap
super
end
def update
super
update_bitmap
update_visible
update_position
end
def update_frames
@game_sfx.update_frames
end
def update_anim
@game_sfx.update_anim
end
# проверка на видемость
def update_visible
if @game_sfx.hang
self.visible = true
else
self.visible = @game_sfx.visible if self.visible != @game_sfx.visible
end
end
def update_bitmap
self.bitmap = Cache.animation(@game_sfx.picture,0)
define_max_number_frame
sx = (@game_sfx.current_index % @number_frames_row) * if_width
sy = (@game_sfx.current_index / @number_frames_row) * if_height
self.src_rect.set(sx,sy,if_width,if_height)
end
def if_width
@game_sfx.size_frame ? @game_sfx.size_frame : @game_sfx.width_frame
end
def if_height
@game_sfx.size_frame ? @game_sfx.size_frame : @game_sfx.height_frame
end
def define_max_number_frame
unless @number_frames_row
@number_frames_row = (self.bitmap.width / if_width)
#column = (self.bitmap.height / @size_frame)
#@max_number_frame = column * @number_frames_row
end
end
def update_position
self.x = @game_sfx.position_event_x
self.y = @game_sfx.position_event_y
self.z = @game_sfx.z_level
end
end
class Spriteset_Map
alias bug_initialize initialize
def initialize
bug_initialize
create_viewports_for_spec_effects
end
def create_viewports_for_spec_effects
@map_id_bug = @map_id
AnimationSpecEffects.viewport(@viewport1)
end
alias dispose_bug dispose
def dispose
dispose_animation_bug
dispose_bug
end
def dispose_animation_bug
AnimationSpecEffects.dispose
end
alias update_bug update
def update
update_bug
update_animition_bug
end
def update_animition_bug
if @map_id_bug != @map_id
AnimationSpecEffects.dispose
@map_id_bug = @map_id
else
AnimationSpecEffects.update unless AnimationSpecEffects.events.empty?
end
end
end
class Scene_Map < Scene_Base
alias update_bug update
def update
update_animition_bug
update_bug
end
def update_animition_bug
#unless scene_changing?
AnimationSpecEffects.update_game_fx
end
end
class Game_Interpreter
def get_special_effect(name,id,first_frame,last_frame,pause=true)
event = get_character(id)
AnimationSpecEffects.inserting_parameters(name,event,first_frame,last_frame)
if pause
while !AnimationSpecEffects.game_fx(name).finish
unless AnimationSpecEffects.event(name)
AnimationSpecEffects.no_values_params(name)
end
Fiber.yield
end
end
end
def disable_hovering(name)
AnimationSpecEffects.game_fx(name).hang = false
end
def enable_hovering(name)
AnimationSpecEffects.game_fx(name).hang = true
end
end
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
# :...~o[ Game_Special_Effects ]o~...: #
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
class Game_Special_Effects
attr_accessor :picture
attr_accessor :current_index
attr_accessor :size_frame
attr_accessor :width_frame
attr_accessor :height_frame
attr_accessor :first_frame
attr_accessor :last_frame
attr_accessor :f1
attr_accessor :visible
attr_accessor :finish
attr_accessor :z
attr_accessor :speed
attr_accessor :hang
attr_accessor :event
attr_accessor :axis_ox
attr_accessor :axis_oy
def initialize(event,picture)
@picture = picture
@event = event
@duration = 0
@visible = true
end
def generate_cyclic_loop(from, to)
Fiber.new do
loop { from.step(to, from < to ? 1 : -1 ) { |num| Fiber.yield num } }
end
end
def update
update_frames unless @finish
update_anim
update_axis
end
def update_frames
unless @f1
@f1 = generate_cyclic_loop(@first_frame,@last_frame)
@current_index = @f1.resume
end
end
def update_anim
@duration += 1
if @current_index == @last_frame
if @duration > @speed
@visible = false
@duration = 0
#@current_index = @f1.resume
@finish = true
end
else
if @duration > @speed
@current_index = @f1.resume
@duration = 0
end
end
end
def update_axis
@axis_ox
@axis_oy
end
def z_level
if @event.id == 0
else
#puts "$game_map.events[@event.id].screen_x #{$game_map.events[@event.id].screen_z}"
end
@z
end
def position_event_x
if @event.id == 0
$game_player.screen_x
else
$game_map.events[@event.id].screen_x
end
end
def position_event_y
if @event.id == 0
$game_player.screen_y
else
$game_map.events[@event.id].screen_y
end
end
end и примерный модуль: ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
# :...~o[ Настройка Модуля Анимации ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
module Animation_FX
Animation = {
'third' => {
:picture => 'pink_number',
:size_frame => 32,
:hang => true,
:z => 40
},
'first' => {
:picture =>'Number',
:size_frame => 50
},
'second' => {
:size_frame => 50,
:picture => 'Number'
},
'fourth' => {
:size_frame => 50,
:picture => 'Number'
},
'fifth' => {
:picture => 'Anderson_bill_Bug',
:width_frame => 192,
:height_frame => 128,
:hang => true,
:speed => 7,
:z => 10
},
'Doctor_Bug' => {
:picture => 'Fires_Doctor_Bugs',
:size_frame => 50,
:z => 110,
:speed => 3,
:axis_ox => 26,
:axis_oy => 70
},
'Axis' => {
:picture => 'pink_number',
:size_frame => 32,
:axis_ox => 32,
:axis_oy => 12
},
'Man' => {
:picture => 'Man',
:size_frame => 42,
:hang => true
},
'gg' => {
:picture =>'Bug_gg',
:width_frame => 28,
:height_frame => 27,
:speed => 4,
:axis_ox => 26,
:axis_oy => 55
},
'omg' => {
:width_frame => 34,
:height_frame => 72,
:picture => 'Bug_omg',
:speed => 4,
:axis_ox => 26,
:axis_oy => 72 + 42
},
'wah' => {
:width_frame => 54,
:height_frame => 49,
:picture => 'Bug_wah',
:speed => 5,
:axis_ox => 26,
:hang => true,
:axis_oy => 80
},
'panic' => {
:picture => 'Bug_panic',
:width_frame => 60,
:height_frame => 33,
:speed => 4,
:axis_ox => 5,
:axis_oy => 60
},
'sob' => {
:picture => 'Bug_sob',
:width_frame => 27,
:height_frame => 43,
:speed => 4,
:axis_ox => 25,
:axis_oy => 12 + 60
},
'hum' => {
:picture => 'Bug_hum',
:width_frame => 37,
:height_frame => 33,
:speed => 4,
:axis_ox => 25,
:axis_oy => 12 + 60
},
'hmm' => {
:picture => 'Bug_hmm',
:width_frame => 28,
:height_frame => 24,
:speed => 4,
:axis_ox => 25,
:axis_oy => 12 + 60
},
'Abs' => {
:picture => 'Bug_Abs',
:width_frame => 41,
:height_frame => 66,
:speed => 4,
:axis_ox => 15,
:axis_oy => 45 + 60
},
'drool' => {
:picture => 'Bug_drool',
:width_frame => 29,
:height_frame => 26,
:speed => 4,
:axis_ox => 20,
:axis_oy => 60
},
'money' => {
:picture => 'Bug_money',
:width_frame => 27,
:height_frame => 24,
:speed => 4,
:axis_ox => 20,
:axis_oy => 60
},
'bzz' => {
:picture => 'Bug_bzz',
:width_frame => 29,
:height_frame => 26,
:speed => 8,
:axis_ox => 20,
:axis_oy => 60
},
'ono' => {
:picture => 'Bug_ono',
:width_frame => 27,
:height_frame => 24,
:speed => 4,
:axis_ox => 20,
:axis_oy => 60
},
'oops' => {
:picture => 'Bug_oops',
:width_frame => 36,
:height_frame => 33,
:speed => 4,
:axis_ox => 10,
:axis_oy => 60
},
'heh' => {
:picture => 'Bug_heh',
:width_frame => 27,
:height_frame => 24,
:speed => 3,
:axis_ox => 23,
:axis_oy => 60
}
}
end ссылка на демку: yadi.sk/d/hHYKiEDc3YzuG3 |
Баг изучает Godot Engine. А слушает эту музыку ~~> Мое сердце
Последнее редактирование: 6 года 1 мес. назад от Doctor_Bug.
Администратор запретил публиковать записи гостям.
|
Animation Special Effects 2 (Спецэффекты) 6 года 1 мес. назад #107770
|
Найден и уничтожен мелкий Баг. Версия 1.3
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] Пришел, увидел, пофиксил |
Баг изучает Godot Engine. А слушает эту музыку ~~> Мое сердце
Администратор запретил публиковать записи гостям.
|
Модераторы: NeKotZima
Время создания страницы: 0.306 секунд