Войти на сайт

Авторизация, ждите ...
×
  • Страница:
  • 1
  • 2

ТЕМА: Восьмифреймовое движение [XP]

Восьмифреймовое движение [XP] 11 года 8 мес. назад #59473

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
Иногда в интернетах нарываются анимации персонажей, состоящие более, чем из 4 кадров, например из 8ми (либо вы - отличный и трудолюбивый художник), и появляется вопрос - как же их вставить в XP?

Гугл ничего толком не нагуглил, хотя тем, кому интересны движения по диагонали и расширенные (по позам, а не количеству фреймов) рекомендую обратить внимание на этот топик:

Eight Direction & More Frames
Впрочем, для нашего случая он не подходит, там, чтобы сделать как надо, ковырять код придется даже больше, чем без скрипта.


Итак, имеем вот такой чарсет на 8 кадров (старики и археологи сразу же узнают, откуда он):

DS-WALK.png


Начинаем немного ковырять скрипты:

1) Создаем глобальную переменную в Main
$anim_count = 8 # число фреймов на движение (кадров)

2) Добавим параметр класса Game_Character
attr_accessor :frames_count
и в initialize проставим его в = $anim_count

3) В классе Sprite_Character ставим на 28 строке
@cw = bitmap.width / @character.frames_count #(было 4)

4)
Если сделать только пункт 3 и запустить игру - то фреймы персонажа будут меняться медленно и использоваться только первые четыре, поэтому в классе Game_Character (Game_Character2) пишем:
@pattern = (@pattern + 1) % @frames_count #(было 4)
(15 строка), чтобы брать все 8 кадров, а не 4, как было раньше

Чтобы анимация не была медленной, в методе update_move этого же класса делаем так
if @walk_anime
      @anime_count += 1.5 * (@frames_count / 4) 
    elsif @step_anime
      @anime_count += 1 * (@frames_count / 4)
в update_stop поступаем аналогично


Вот и всё, запускаем и наслаждаемся плавной анимацией Ваньки Малолесьева или какого-нибудь вашего крутого персонажа, состоящего из 8ми кадров.

PS: Благодаря советам Мертвого Эльфа сделал скрипт, который просто можно добавить в конце списка скриптов, но выше Main, а также немного параметризовал его.

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Последнее редактирование: 10 года 4 нед. назад от DeadElf79.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DeadElf79, Irich5, Jas6666

Восмифреймовое движение [XP] 11 года 7 мес. назад #59627

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • 1 место в Готв3 местоВетеранПроект месяца 1 местоУчительПрограммист RubyПисатель 3 местоПроект месяца 2 местоОрганизатор конкурсов
Я правильно понял, теперь можно с одной переменной менять количество кадров? Хм, удобно.
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59628

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
да, типа того.
но для полного счастья надо замутить функцию SetFrameCount(map_id, event_id, framecount) ставящую конкретному событию число фреймов, чтобы можно было держать и такие, и такие чарсеты.


Кроме этого, вчера в процессе тестирования, понял, что
1.5 * (@frames_count / 4) и 1 * (@frames_count / 4) мало
пока стоят 1.8 и 1.3, но надопоэкспериментировать еще
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59630

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • 1 место в Готв3 местоВетеранПроект месяца 1 местоУчительПрограммист RubyПисатель 3 местоПроект месяца 2 местоОрганизатор конкурсов
А не сделать ли зависимость скорости анимации от количества кадров?
К примеру, для 8 - это:
(1+@frames_count*0.1)*(@frames_count/4) для походки (walk)
((1+@frames_count/2*0.1)*(@frames_count/4) для ожидания (idle)

Тогда уж для полного счастья неплоха была бы и функция SetFrameRate(map_id,event_id,speed) :-)
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: caveman

Восмифреймовое движение [XP] 11 года 7 мес. назад #59631

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
ага, вот эти формулы!
ну и вторая функция полезна
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59632

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • 1 место в Готв3 местоВетеранПроект месяца 1 местоУчительПрограммист RubyПисатель 3 местоПроект месяца 2 местоОрганизатор конкурсов
Кстати, почему бы не оформить это в качестве отдельного скрипта? Гораздо удобнее, чем лазить по стандартным скриптам, да и некоторая гарантия безопасности этих самых стандартных скриптов - нечего их изменять и трогать вообще, лучше скопипастить скрипт с фичами и не волноваться. Да и обновление формул будет происходить гораздо быстрее. :-)
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59633

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
научи меня, о, гуру, делать отельные скрипты.
я как-то пробовал (кажись в картах) делать в отдельном файле, но чето все печально было - не срастались они с оригиналом.
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59634

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • 1 место в Готв3 местоВетеранПроект месяца 1 местоУчительПрограммист RubyПисатель 3 местоПроект месяца 2 местоОрганизатор конкурсов
Вот открываешь окно со скриптами, так?
Наводишь мышь на список скриптов, ок?
Нажмешь Insert (на обычных клавах справа, над стрелками и левее нампада), верно?
Получаешь чистый лист, именуешь его как-то по-своему внизу слева под списком скриптов, а на чистом листе уже набиваешь полный скрипт.

Он будет выглядеть примерно так(можешь скопировать и доработать до ума):
$anim_count=4#изменит количество кадров для ВСЕХ(для отдельного перса - см. ниже)
class Game_Character
attr_accessor :frames_count

alias withoutmod_init initialize
def initialize
@frames_count=$anim_count
withoutmod_init
end

def set_frame_count(count)#нужно для удобства и для доступа к защищенной переменной
@frames_count=count
return
end
end

Ну и там прочее, прочее, надеюсь, все понятное))
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59635

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
alias withoutmod_init initialize

шоцетакэ?
может потому я у себя и не смог, ибо тоже initialize ковырял
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59636

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • 1 место в Готв3 местоВетеранПроект месяца 1 местоУчительПрограммист RubyПисатель 3 местоПроект месяца 2 местоОрганизатор конкурсов
Немного отойду от темы, пояснение ниже.
Я давно заметил, что мы с тобой начинали учить Руби Мейкера с разных сторон. И вот этот диалог - отличный наглядный случай.
Ты правил стандартные скрипты. И правишь до сих пор. И даешь уроки, как их править и даже указываешь, где конкретно.
Я вчитывался в скрипты Ryex'a, Blizzard'a и других. И до сих пор вместо того, чтобы лезть менять стандартные скрипты, я на всякий случай использую алиасы (от alias), чтобы потом не искать, где и в чем у меня были проблемы в скриптах.

Руби, в отличие от С++/Pascal, позволяет добавлять в созданные классы сколь угодно огромное количество новых переменных, методов и изменять классы чуть ли не целиком и полностью, не меняя исходников.

Ответ на твой вопрос:
Оператор alias - это как раз одно из удобных средств для подобных действий. С его помощью внутри класса создается копия исходного метода, но под другим именем. То есть строка "alias some_other_name some_def" скопирует метод some_def и назовет его some_other_name.
Зачем это нужно?
Все просто - мы копируем в память исходный метод some_def. Затем переписываем его с нуля:


alias some_other_name some_def#вот мы делаем алиас
#вот мы начинаем писать метод с нуля:
def some_def
#здесь может быть все, что угодно
end


Затем, после внесения изменений запускаем тот метод, который у нас был сохранен изначально в качестве some_other_name, допустим, что теперь это выглядит так:

alias some_other_name some_def
def some_def
@value1=124
@value2='Oh my String!'
some_other_name# вот сюда
end


И все - теперь у тебя в методе этого класса при вызове будут созданы переменные @value1 и @value2. При этом исходный скрипт не меняется. Так работают почти все дополнительные скрипты, которые мы скачиваем для изменения меню/боевки/добавления фич.

Стоит отметить, чтобы моя помощь была совсем уж полной, что в исходном коде следует прочитать работу метода, который мы хотим изменить через алиас. В методах initialize почти во всех классах, связанных с графикой в конце вызывается метод refresh, относящийся к этому классу.
Допустим, наглядный вариант:

class Window_Base
def initialize
@x=x
@y=y
...
refresh
end
end


Это значит, что все, что ты хочешь добавить, должно быть перед вызовом метода refresh, иначе не факт, что ты увидишь эти изменения (или увидишь, но не сразу, что не есть хорошо). Поэтому при алиасе мы пишем:

def some_def
@value1='odin'#перед исходным методом
some_other_name
end


В остальных случаях можно писать наши изменения и после вызова исходного метода:

alias some_other_name some_def
def some_def
some_other_name
@value1='chto-to'
end
Последнее редактирование: 11 года 7 мес. назад от DeadElf79. Причина: дооформил пост, выделил код
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Cerberus, sando, caveman

Восмифреймовое движение [XP] 11 года 7 мес. назад #59637

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
Эльф, огромнейшее спасибо. Мало того, что в тех же туторах надо все расписывать - но потом и сам забываешь, где что подправлял.

А я уже 6 лет с с++/с#, и руби не касался, потому для меня удивительно и непривычно, что можно с методами тут такое творить.

Мне как раз скоро предстоит кучу скриптов расковырять, буду теперь отдельно это делать.
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59683

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
Благодаря советам Мертвого Эльфа сделал скрипт, который просто можно добавить в конце списка скриптов, но выше Main, а также немного параметризовал его.

Скрипт в первом сообщении под спойлером.
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59722

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • 1 место в Готв3 местоВетеранПроект месяца 1 местоУчительПрограммист RubyПисатель 3 местоПроект месяца 2 местоОрганизатор конкурсов
Вот, теперь это стало похоже на "канонический" туториал, как на иностранных сайтах. Интересно, а можно ли к этому заснять гифку с анимацией в качестве скриншота? А если можно, то как вариант - сделать сразу две, одну со стандартной анимацией, другую - с новой.
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59723

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
вот узнаю, как это дело снять и заснимаю)
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 7 мес. назад #59726

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • 1 место в Готв3 местоВетеранПроект месяца 1 местоУчительПрограммист RubyПисатель 3 местоПроект месяца 2 местоОрганизатор конкурсов
Какой-нибудь Fraps ( www.fraps.com/ ) - это чтобы заснять видео.
Какой-нибудь VidGif ( www.geovid.com/ru/vidGif ) - это чтобы конвертировать видео в gif-анимацию.
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 6 мес. назад #60027

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
Вышло небольшое улучшение скрипта.
Теперь для событий можно задавать в комментарии число фреймов на его отображение, просто написав
[frames N], где N - число фреймов в чарсете
Срабатывает это на активной странице события.

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 6 мес. назад #60032

  • strelokhalfer
  • strelokhalfer аватар
  • Вне сайта
  • Архитектор Миров
  • Знатный грамотей
  • Сообщений: 1640
  • Спасибо получено: 1078
  • Программист Ruby2 место 2 место Сбитая кодировкаОрганизатор конкурсовПереводчикДаритель Стимкея
А можешь на Ace портировать? А то на забугорном ничего такого подобного не видел.
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Последнее редактирование: 11 года 6 мес. назад от strelokhalfer.
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 6 мес. назад #60033

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
попробую вечерком, не факт, что сегодня же и получится - там наверняка все по-другому устроено в этом месте, как и в случае с panic
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 6 мес. назад #60042

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Программист Ruby2 место ГотвПроект года 1 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсовОраторРазработчикПроект месяца 3 местоПроект года 3 место
Для VX, просьба внимательно прочесть комментарии. Извращенные и упрощенные VX чарсеты мне лень поддерживать, тем более, что сделать нормальные - пара кликов в пейнте.

По ссыли демка

rghost.ru/45646217

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Администратор запретил публиковать записи гостям.

Восмифреймовое движение [XP] 11 года 6 мес. назад #60046

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • 1 место в Готв3 местоВетеранПроект месяца 1 местоУчительПрограммист RubyПисатель 3 местоПроект месяца 2 местоОрганизатор конкурсов
Для VX ACE, оригинал:
victorscripts.wordpress.com/rpg-maker-vx...cripts/multi-frames/

Требует также для работы вот ето: victorscripts.wordpress.com/rpg-maker-vx...cripts/basic-module/

Оба скрипта ставим - проблему анимашек в эйсе решаем))
Это для ХР такого решения не было до Пещерного.
Администратор запретил публиковать записи гостям.
  • Страница:
  • 1
  • 2
Модераторы: NeKotZima
Время создания страницы: 0.333 секунд