ГлавнаяФорумRPG MakerСкрипты/ПлагиныRPG Maker VX ACEУлучшающие или добавляющее новое скриптыAnimation Special Effects (Спецэффекты)
Войти на сайт
×
ТЕМА: Animation Special Effects (Спецэффекты)
Animation Special Effects (Спецэффекты) 6 года 10 мес. назад #101600
|
Этот скрипт добавляет дополнительную анимацию, для создания визуальных эффектов на карте и под любым уровнем глубины (z-уровень). Вы можете с помощью него сделать анимацию спецэффектов или добавить дополнительные эмоции. Этот скрипт будет нуждаться только в одной вещи… кадровой анимации. И он не привередлив к размерам картинкам. История версий: 2018-01-04 -> Версия 1.1 Изменяет систему отображение анимации (координаты событий) 2017-11-02 -> Версия 1.0 - Реализация Баг: Имеется связанный со сохраненными играми. Нужно начинать новую игру. В будущем исправлю. Ограничение: Стоит учесть, что имеются два вида анимации (связанный с этим скриптом). Простая анимация и зацикленная (или циклическая анимация). В циклической анимации, команды в событии не будут выполнятся после команды зацикленной анимации, за то она будет работать без мельканий. сам код ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] =begin ~~~o o~~~ begin=
:...~o[ Doctor Bug's представляет ]o~...:
:...~o[ Animation Special Effects ]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.1
#~~~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~~~
2018-01-04 -> Версия 1.1
Изменяет систему отображение анимации (координаты событий)
2017-11-02 -> Версия 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~~~
get_special_effect(id, filename, width, height, row, number_frame, *agr)
*agr - (switch_image, pause, speed_of_drawing, z_level, loop_repeat)
Этот скрипт вызывает анимацию. Или позволяет перенаправить свою анимацию
по координатам другому событию (Оно берет только координаты).
Поместите его в событие в раздел script.
Id события, «-1» это игрок, «0» это текущие событие, выше нуля определяет
события по id.
В width и height укажите ширину и высоту кадра анимации.
Укажите ряд – row, который будет анимироваться. Ряд начинается с числа "1".
Аргументы number_frame отвечают за количество кадров в анимации.
"*agr" - дополнительные параметры. Вы можете их вписать в команду, если на
то есть необходимость.
switch_image - режим отображения. Имеет следующие режимы:
:effects – Помещает анимацию верхний, левый край угла тайла, в котором было
размещено событие, игнорируя его размеры (рисунок события, а не анимации).
Так что анимация отображается от этого угла. Не превышая верха тайла, и
не левее его.
:emoji (по умолчанию) – Режим эмоции (или смайликов). Размещает анимацию
над событием. Ровно посередине и учитывая размер события. Даже ваш монстра-босс
будут улыбаться. При условии если его не пытается анимировать другое событие.
:event – Режим взаимодействие с событием. Анимация будет размещена поверх
события, и ровно посередине. Но не ниже самого события. Можно использовать
для отображения, каких либо усилений или проклятий.
pause - создает аналогичную функцию «ожидания» как в простой анимации и
эмоции. Вы знаете, как можно использовать. По умолчанию включина пауза.
"speed_of_drawing" - скорость прорисовки, по умлочанию 8.
Z_level - на каком уровне отображается анимация (земля - 0. Числа можно
ставить и отрицательные). По умолчанию 200.
Если же триггер (он же условие запуска) будет равен «параллельно», то все
будет проигрываться по порядку. Но в случаи циклического повторение
конкретной анимации такое не пойдет. Анимация будет мелькать.
И для того чтобы этого не было, используйте loop_repeat.
И мелькание изображения пройдет. НО! Для повторение циклической анимации
(без мельканий) используйте одну анимацию на одну событию. Ибо остальные команды
в событии будут игнорироватся. Имеет режим включить "on" и выключить "off".
По умолчанию "off"
Событий может быть много. Но не увлекайтесь, иначе почувствуете существенные
лаги в игре.
Для того чтобы анимация отображалась по порядку в триггерах «параллельно» и
«автоматически», ставьте каждую на паузу, или на свое усмотрение.
Pause принимает значение: true – включить, false – выключить.
Если поставлено несколько анимации и пауза выключена, то наблюдается баг,
который проскакивает на последнюю анимацию, игнорируя предыдущии.
stop_loop_special_effect(id,stop_loop)
Этот скрипт выключает циклическое повторение конкретной анимации.
Но можно и включить. Как всегда id определение события,
смотрите выше подобный аргумент. А stop_loop – выключение циклической анимации.
Здесь все наоборот: true – выключить, false – включить.
#~~~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.
Вы можете использовать этот скрипт для разных целях, таких примерах как:
кислотные полы не правильной формы (не квадратные),
или взрывы в каких либо не правильной формы помещений.
Для дополнительных эмоций, или что еще взбредет вам в голову. =)
P.S. И спасибо что используете мой скрипт.
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
=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[ Game_CharacterBase ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
class Game_CharacterBase
#~~~o~~~o Достучатся до переменой и хешу из вне
attr_accessor :special_effect_id
attr_accessor :special_effect_hash
#~~~o~~~o Мы должны знать кто они. Переменая - переменая, Хэш - хэщ )
alias init_public_members_dr_bug init_public_members
def init_public_members
init_public_members_dr_bug
@special_effect_id = 0
@special_effect_hash = {}
end
end
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
# :...~o[ Sprite_Character ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
class Sprite_Character < Sprite_Base
#~~~o~~~o Инициализируем
def initialize(viewport, character = nil)
super(viewport)
@character = character
@balloon_duration = 0
@special_effect_duration = 0
@special_effect_sprite = nil
update
end
#~~~o~~~o Убиваем
alias special_effect_dispose dispose
def dispose
special_effect_dispose
end_special_effect
super
end
#~~~o~~~o Обнавляем
alias special_effect_update update
def update
special_effect_update
update_special_effect
end
#~~~o~~~o Берем чужое и затачиваем под себя без последствий.
#~~~o~~~o От сюда начинается запуск.
alias setup_new_effect_and_special_effect setup_new_effect
def setup_new_effect
setup_new_effect_and_special_effect
if !@special_effect_sprite && @character.special_effect_id > 0
@special_effect_id = @character.special_effect_id
start_special_effect
end
end
#~~~o~~~o После того как все оказалось в хэши,
#~~~o~~~o расфасовываем для удобство в методы
def name_special_effect
return @character.special_effect_hash['name_special_effect']
end
def width_frame_special_effect
return @character.special_effect_hash['width_frame_special_effect']
end
def height_frame_special_effect
return @character.special_effect_hash['height_frame_special_effect']
end
def number_frame_special_effect
return @character.special_effect_hash['number_frame_special_effect']
end
def z_level_special_effect
return @character.special_effect_hash['z_level_special_effect']
end
def id_event_special_effect
@character.special_effect_hash['id_event']
end
#~~~o~~~o Здесь определяем игрок или событие
def player_enent?
@character.special_effect_hash['id_event'] < 0
end
def loop_repeat_special_effect?
@character.special_effect_hash['loop_repeat_special_effect'] == "on"
end
def stop_loop_special_effect?
@character.special_effect_hash['stop_loop_special_effect']
end
#~~~o~~~o
def define_coordinate_x
id_event_special_effect > 0 ? $game_map.events[id_event_special_effect].screen_x : x
end
def define_coordinate_y
id_event_special_effect > 0 ? $game_map.events[id_event_special_effect].screen_y : y
end
#~~~o~~~o Режим отображения, отдельная тема. Здесь обрабатывается совпадений
#~~~o~~~o условий. И также высчитывается правильность
#~~~o~~~o координат из-за этой штуки "!". Регулярки, немного.
def switch_image_special_effect
array_switch = []
if id_event_special_effect > 0
is_sign = $game_map.events[id_event_special_effect].character_name[/^[\!]./]
else
is_sign = @character_name[/^[\!]./]
end
mode = @character.special_effect_hash['switch_image_special_effect']
case mode
when :effects
array_switch[0] = is_sign ? define_coordinate_y : define_coordinate_y + 4
array_switch[1] = 16
array_switch[2] = 32
array_switch[3] = 0
when :emoji
array_switch[0] = is_sign ? define_coordinate_y : define_coordinate_y - 4
array_switch[1] = width_frame_special_effect / 2
array_switch[2] = height_frame_special_effect
array_switch[3] = id_event_special_effect <= 0 ? @ch : 32 #~~~o~~~o Высота кадра чара
when :event
array_switch[0] = is_sign ? define_coordinate_y : define_coordinate_y + 4
array_switch[1] = width_frame_special_effect / 2
array_switch[2] = height_frame_special_effect
array_switch[3] = 0
end
return array_switch
end
#~~~o~~~o Это запуск создания и загрузки анимации, здесь работают не
#~~~o~~~o большие вычисления. Обратите внимания на
#~~~o~~~o эту формулу: "@special_effect_duration"
def start_special_effect
#puts "id_event_special_effect #{id_event_special_effect}"
#if id_event_special_effect > 0
# puts "$game_map.events #{$game_map.events[id_event_special_effect].methods} \n"
#end
dispose_special_effect
@special_effect_duration = number_frame_special_effect * special_effect_speed + special_effect_wait
@special_effect_sprite = ::Sprite.new(viewport)
@special_effect_sprite.bitmap = Cache.animation(name_special_effect,0)
@special_effect_sprite.ox = switch_image_special_effect[1]
@special_effect_sprite.oy = switch_image_special_effect[2]
update_special_effect
end
#~~~o~~~o Подчищаем за собой
def dispose_special_effect
if @special_effect_sprite
@special_effect_sprite.dispose
@special_effect_sprite = nil
end
end
#~~~o~~~o Заточка на триггер и игрока. Они блин не совместимы.
def defining_trigger
return if stop_loop_special_effect?
if player_enent? && loop_repeat_special_effect?
pick_up_number_frame
end
return if player_enent?
if @character.trigger_in?([4]) && loop_repeat_special_effect?
pick_up_number_frame
end
end
#~~~o~~~o Анимация не закончится, если это штука
#~~~o~~~o не станет: @special_effect_duration равна "0"
def pick_up_number_frame
if @special_effect_duration < 2
@special_effect_duration = number_frame_special_effect * special_effect_speed + special_effect_wait
end
end
#~~~o~~~o Обнавление: вычисление, нарезка и показка =)
def update_special_effect
if @special_effect_duration > 0
defining_trigger
@special_effect_duration -= 1
if @special_effect_duration > 0
@special_effect_sprite.x = define_coordinate_x
@special_effect_sprite.y = switch_image_special_effect[0] - switch_image_special_effect[3]
@special_effect_sprite.z = z_level_special_effect
sx = special_effect_frame_index * width_frame_special_effect
sy = (@special_effect_id - 1) * height_frame_special_effect
@special_effect_sprite.src_rect.set(sx,
sy,
width_frame_special_effect,
height_frame_special_effect)
else
end_special_effect
end
end
end
#~~~o~~~o эта штука уничтажает анимацию
def end_special_effect
dispose_special_effect
@character.special_effect_id = 0
end
#~~~o~~~o Та самая скорость прорисовки
def special_effect_speed
return @character.special_effect_hash['speed_of_drawing_special_effect']
end
#~~~o~~~o Продолжительнасть последнего кадра
def special_effect_wait
return 0
end
#~~~o~~~o Вот она, моя полюбившийся формула, внимательно изучите её.
#~~~o~~~o Не раз еще пригадится.
def special_effect_frame_index
return (number_frame_special_effect - 1) - [(@special_effect_duration - special_effect_wait) / special_effect_speed, 0].max
end
end
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
# :...~o[ Game_Interpreter ]o~...:
#~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~o~~~
class Game_Interpreter
def get_special_effect( id_event,
filename,
width_frame,
height_frame,
row,
number_frame,
*agr)
switch_image = agr[0] ? agr[0] : :emoji
#pause = agr[1] ? agr[1] : false
agr[1] = true if agr[1].nil?
pause = agr[1]
speed_of_drawing = agr[2] ? agr[2] : 8
z_level = agr[3] ? agr[3] : 200
loop_repeat = agr[4] ? agr[4] : "off"
character = get_character(id_event < 0 ? -1 : 0) #~~~o~~~o Ищем события
if character
#~~~o~~~o И если событие существует, вынимаем все нужное инфо.
#~~~o~~~o И утрамбовываем все в хэш.
character.special_effect_hash = {'name_special_effect' => filename,
'width_frame_special_effect' => width_frame,
'height_frame_special_effect' => height_frame,
'number_frame_special_effect' => number_frame,
'speed_of_drawing_special_effect' => speed_of_drawing,
'z_level_special_effect' => z_level,
'switch_image_special_effect' => switch_image,
'id_event' => id_event,
'loop_repeat_special_effect' => loop_repeat}
#~~~o~~~o параметр ряда анимации
character.special_effect_id = row
#~~~o~~~o параметр ждать. true or false. Не знаю как это работает, но работает.
Fiber.yield while character.special_effect_id > 0 if pause
end
end
def stop_loop_special_effect(id_event,stop_loop = false)
character = get_character(id_event) #~~~o~~~o Ищем события
if character
character.special_effect_hash['stop_loop_special_effect'] = stop_loop
end
end
end
#~~~o~~~o Ну наконец то, я хоть что то закончил 8] Инструкция по использованию, написана в скрипте. Предоставляется демка: yadi.sk/d/MfEycTcj3REKdL Ну и краткий видео обзор: |
Баг изучает Godot Engine. А слушает эту музыку ~~> Мое сердце
Последнее редактирование: 6 года 10 мес. назад от Doctor_Bug.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: PanzerCat
|
Animation Special Effects (Спецэффекты) 6 года 10 мес. назад #101602
|
сорри, очень режет глаза,исправь
вместо "связоный" и "связаный" (почему одно слово пишешь по-разному не очень понятно) правильно "связАННый" вместо "нужна" - "нужнО" "зацикленой" - "зациклеННой" "сохрпанеными" - "сохранеННыми" |
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Doctor_Bug
|
Модераторы: NeKotZima
Время создания страницы: 0.224 секунд