Скриптинг урок 2, Leon перевод by gromdron

Учитель
Больше
19 года 1 нед. назад #5512 от gromdron
Теперь мы начнем 2 главу.
Для того чтобы нормально ориентироваться, вам нужно будет знать следующее:
-Урок 1
-Знать как пишутся сцены
-Знать о наследовании
-Создать основу окна статуса

Сделать сцену это тоже самое что создать окно… . Вы должны создать новое окно, но вы можете его и не создавать, вы можете воспользоваться вашим предыдущем окном, но я советую сам создавать новое окно на каждый урок .
Для упрощения мы воспользуемся нашим предыдущем окном Scene_Name. И так, начнем с строки:
Code:
class Scene_Name

Теперь вы инициализировали все окна… но вы не должны делать это с каждой сценой, это делается только с определенными сценами. С какими? Это уже зависит от того что это за скрипт. Если вы будете делать переключатель с актера на актера, вам это понадобиться. Но в этом случае вы должны обращаться к индексу в скрипте , а не к актеру.
Code:
def initialize(actor_index = 0) @actor_index = actor_index end

Это все хорошо, но… у нас нет актера с ID 0Значит скрипт автоматически поставит значение в 1. Следовательно при использовании I.D. долен быть вывод определенного актера на экран, а точнее информации о нем? Хорошо, мы определим это в окне. Так, давайте отступим от правил в первой сцене.
Code:
class Window_Name Window_Base def initialize super(0, 0, 640, 480) self.contents = Bitmap.new(width - 32, height - 32) self.contents.font.name = $defaultfonttype self.contents.font.size = $defaultfontsize refresh end def refresh self.contents.clear self.contents.draw_text(0, 0, 600, 32, This is a test of the your scripting ability. ) self.contents.draw_text(0, 32, 600, 32, Apparently, you learned something new! ) end end

Подождите, как мы определим актера? Хм.. это может показаться сверхъестественным. Поместите: (actor) около слова ‘initialize’, и перед рефреш поставьте: @actor = actor before refresh. Почему? Эта комбинация вызывает информацию актера на протяжении всей инициализации, и хранит все в переменной @actor. Подождите, это переменная? Где ID героя ? Вы создали все. И это будет id первого актера у вас. Почему? Это случается в сцене. Как насчет цикла? Хм…а де но заканчивается? Очень скоро, вот ответ.
И так, наше окно выглядит так:
Code:
class Window_Name Window_Base def initialize(actor) super(0, 0, 640, 480) self.contents = Bitmap.new(width - 32, height - 32) self.contents.font.name = $defaultfonttype self.contents.font.size = $defaultfontsize @actor = actor refresh end def refresh self.contents.clear self.contents.draw_text(0, 0, 600, 32, This is a test of the your scripting ability. ) self.contents.draw_text(0, 32, 600, 32, Apparently, you learned something new! ) end end

Вернемся назад к нашей сцене.
Code:
class Scene_Name def initialize(actor_index = 0) @actor_index = actor_index end

Теперь нам нужно создать основной метод. Каждая сцена должна иметь метод! Это довольна крутая сцена поэтому мы должны инициализировать метод. Это идентифицирует материал. Теперь я покажу как это должно быть. Это очень важно.
Code:
def main @actor = $game_party.actors[@actor_index] @name_window = Window_Name.new Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end Graphics.freeze @name_window.dispose end
Стоп, стоп, стоп… А как быть с символами #*%& которые загружаются?
Ладно, я опишу вам функции.
Code:
def main #главный метод @actor = $game_party.actors[@actor_index] #Id актера! @name_window = Window_Name.new #Идентификатор @name_window в вашем окне. Graphics.transition #Графический переход loop do #Начало цикла Graphics.update #Обновление графики Input.update #Обновление ввода update # обновляет метод if $scene != self #Если сцена не ровняется сцене.. break #Ломаем цикл end #Закрытие оператора end #Закрытие цикла Graphics.freeze #Останавливаем графику @name_window.dispose #Диспозируем окно. end #конец главного метода

Не трудно? Теперь в каждой сцене мы должны использовать линии от Graphics.transition до Graphics.freeze .
Это неизбежно. К счастью у виндовса есть функция copy/paste.

Теперь у нас есть скрипт, но при его использовании вы получите ошибку. ‘unidentified local variable or method ‘update’ for your scene.’
Нам нужно идентифицировать ‘update’.
Это основа первых 2 классов, давайте же сделаем скрипт.

В ‘update’, вы должны его идентифицировать следующей вставкой.
Code:
def update @name_window.update end

Это уберет ошибку, если вы поместите в конец сценария ‘end’ и закончите тем самым скрипт. Давайте же добавим нашей сценку дополнительную структуру. Сделаем та что при нажатии на клавишу мы вернемся к карте. Довайте начнем.
Code:
if Input.trigger?(Input::B) #Есди нажата В $game_system.se_play($data_system.cancel_se) #Начнет играть игровая музыка. $scene = Scene_Map.new #И мы вернемся к карте end
Это хорошо, но там нет ничего. Вернемся назад к окну чтобы этого избежать.


Code:
class Window_Name Window_Base def initialize(actor) super(0, 0, 640, 480) self.contents = Bitmap.new(width - 32, height - 32) self.contents.font.name = $defaultfonttype self.contents.font.size = $defaultfontsize @actor = actor refresh end def refresh self.contents.clear self.contents.draw_text(0, 0, 600, 32, This is a test of the your scripting ability. ) self.contents.draw_text(0, 32, 600, 32, Apparently, you learned something new! ) end end

Сначала удалите self.contents.draw_text. А точнее все.

Code:
class Window_Name Window_Base def initialize(actor) super(0, 0, 640, 480) self.contents = Bitmap.new(width - 32, height - 32) self.contents.font.name = $defaultfonttype self.contents.font.size = $defaultfontsize @actor = actor refresh end def refresh self.contents.clear end end

Теперь создадим немого информации. Например название актера, его класс и его спрайт.
Мы уже идентифицировали актера и это должно быть просто, правильно? Хорошо, пока вы знаете как работает суперкласс. Здесь вы можете использовать любой метод в суперклассе, если вы идентифицируете его должным образом. Window_Base, один из тех которые должны быть идентифицируемы, включая draw_actor_name, draw_actor_class, and draw_actor_sprite. Довольно круто, да?! Но… как добавить это? Для этого необходимо использовать суперкласс.

def draw_actor_name(actor, x, y)
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 120, 32, actor.name)
end


Вы видите что в скобке около actor написано x, y ? tЭто означает что они должны быть включены. К счастью первый и последний очень просты! Вы можете разместить его месторасположение прямо в мею. Давайте сделаем так:

draw_actor_name(@actor, 40, 0)

и поместите это прямо под self.contents.clear и теперь вы можете видеть имя актера. Если вы продолжите смотреть Window_Base, вы найдете еще несколько элементов. Вот фактически все:
Code:
draw_actor_graphic(actor, x, y) draw_actor_name(actor, x, y) draw_actor_class(actor, x, y) draw_actor_level(actor, x, y) draw_actor_exp(actor, x, y) draw_actor_hp(actor, x, y, width = 144) draw_actor_sp(actor, x, y, width = 144) draw_actor_parameter(actor, x, y, type)

Хорошо… большинство из них одинаковы… но есть двое… они совершенно новые! Как вы догадались это hp и sp, its они почти подобны первомы, но как быть с шириной: width = 144? Вы можете устанавливать это число в то значение которое захотите вы. Вы можете оставить это число 144, даже удалив ‘width = ‘ . Но оставить это последним параметром. Ну и где же этот список? Он в Window_Base в методе. Вот список:

0 = атака
1 = защита
2 = магическая защите
3 = сила
4 = ловкость
5 = проворство
6 = интеллект

Вы можете провести пару экспериментов с этими функциями.


А как быть с надписями, если я хочу показать их?
Это проще чем вы думаете. Если вы хотите добавить вещи они должны быть в одном цвете, а точнее в первом (normal color) опробуйте это:

System1
System2

Normal1
Normal2

Теперь поместите выше вашей системы такую строку: self.contents.font.color = system_color
И выше нормального материала: self.contents.font.color = normal_color

Отлично, но вы должны написать материалы к разным словам, (обычно это ‘Имя:’, ‘Класс:’, ‘Снаряжение’, и др).
Это не сложно. Вы можете создать свой текст. Это сделать можно вот так:
Code:
self.contents.draw_text(x, y, tx, ty, text, z)
x = Месторасположение слева на право от того где начинается текст.
y = месторасположение слева на право от того где текст.
tx = длинна текста. Если длинна текста будет больше этого значения, то редактор просто обрежет лишний текст.
ty = количество ячеек для текста.
z = выравнивание текста. Если не введено, или равно 0, то текст выровняется о левому краю , если будет равно 1 текст будет в центре, если будет равно 2, выравнивание будет по правому краю.

Теперь вы можете рисовать метки, а как насчет снаряжения? Это могло быть стимулом.
В Window_Base, если еще один метод:
Code:
draw_item_name(item, x, y)

Эта функция вырисовывает предмет. Она должна быть всегда определена. А как же мы сделаем это? Хм…мы хотим оборудовать актера, таким образом мы должны призвать информацию о предмете, оружии или броне.

Чтобы вызвать данные оружия, вы можете воспользоваться функцией $data_weapons[x], где x id оружия. Теперь оружие всегда изменяется так когда оружие равняется оружию актера. Мы получили эту функцию из Game_Actor. Именно это делает @actor запросом. Чтобы получить оружия актеров нам нужна @actor.weapon_id. Мы должны поместить то вместо ‘x’.
И так, строка будет выглядеть у нас так $data_weapons[@actor.weapon_id] ее мы должны вставить в item. Тогда, x, y тоже самое, а точнее прежнее местонхождение текста.

Это хорошо но как на счет брони? За нее отвечают armor1, armor2, armor3, и armor4. И что же это означает? Вы узнаете это посредством эксперимента, который вы проведете уже без меня. Я уверен что вы не тупы и можете проделать это самостоятельно.

Создание и проверка сценария .

Теперь когда вы научились делать такие окна вы можете провести эксперимент с ними. В третей главе я научу вас как добавлять предметы к вашему сценарию и при этом не обращаться к стандартным объектам.
Спасибо сказали: akito66

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • HoF
  • Посетитель
  • Посетитель
19 года 1 нед. назад #5570 от HoF
Мое мнение ты знаешь. Статья специализирована для профи. А людям надо с нуля.
А вообще - спасибо. Спасибо, что стараешься, хочешь людям и что меня подбиваешь на энтузиазм. Спасибо за то что хороший человек

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.087 секунд
Работает на Kunena форум