Введение в RGSS и Ruby - Глава 1
Пожалуйста, если берётесь изучать, так изучите все мои уроки полностью, уважайте мой труд. В моих уроках всё идёт по порядку и если вы, к примеру, найдёте что-то незнакомое в будущих уроках, то это, скорее всего, уже было пройдено, но тем не менее я буду давать ссылки на материалы предыдущих уроков.
Я буду цитировать информацию с других сайтов посвящённых Ruby и RGSS, а затем буду объяснять, где это будет нужно. Весь текст вне цитат или же внутри цитат, но как сноска, написан мною.
Кое-где я мог изменить или опустить детали некоторых основных понятий; это всё для того чтобы объяснить вам основы RGSS, а не программирования в целом. Так что я буду выделять всю информацию, которая будет действительно нужна, дабы вы лучше усвоили как использовать RGSS в скриптах RMXP.
Также советую заглянуть в справочник по RGSS , там я собрал весь исходный синтаксис который даёт возможность RGSS манипулировать всем и вся, (в скором будущем тож переведу, так что ждите).
1- Что такое Ruby?
*Цитата из RubyCentral:Ruby - это совершенно новый, поистине объектно-ориентированный язык программирования. На западе этот язык стал известен относительно недавно, хотя в Японии он приобрёл толпы поклонников и почти превзошел Python по популярности.
Что делает Ruby таким популярным? Ruby вобрал в себя все лучшие качества передовых языков программирования в единое целое.
Ruby это:
Мощь -- Ruby сочетает в себе все лучшие черты классического OO языка Smalltalk с выразительными возможностями и удобством такого скриптового языка как Perl. Программы, написанные на языке Ruby очень компактны, не теряя при этом в качестве.
Простота -- Синтаксис и симентика интуитивны и предельно ясны. Тут нет никаких частных случаев , которые нужно держать в голове. Все инстанции, числа, классы и нули - это объекты, впрочем, как и всё остальное. Изучив основы, вы легко сможете продвигаться дальше.
Понятность -- Ruby освободит вас от муторной борьбы с компилятором. Ruby не стоит у вас на пути при решении конкретных проблем.
Доступность -- У языка Ruby открытый код и он свободно доступен как для разработки, так и для внедрения. В отличие от других новых языков Ruby не ограничивает вас в рамках определённой платформы или производителя. Вы можете использовать Ruby под Unix или Linux, Microsoft Windows, или же специализированные платформы как BeOS и прочие.
Ruby доставит вам массу удовольствий в программировании. Когда последний раз вы получали удовольствие от написания программы; от программы, которая запускалась в первые; от программы, которую вы сможете прочитать через неделю, месяц или даже через год и будете в точности помнить как она работает? Мы считаем, что Ruby как глоток свежего воздуха в мире программирования. Все программисты, опробовавшие Ruby остались довольны.
[...]
Ruby - это истинный объектно-ориентированный язык программирования. Всё, с чем вы манипулируете, - это объекты, а результаты манипуляций также являются объектами
[...]
Как и Perl, Ruby хорош в обработке текста. Как и Smalltalk, всё в Ruby является объектом, также Ruby имеет блоки, итераторы, мета-классы и прочие вкусности.
Вы можете использовать Ruby для написания серверов, экспериментировать с прототипами, или использовать его в повседневных задачах программирования. Как полностью-интегрированный ОО язык, Ruby обхватывает всё.
Возможности Ruby:
Простой синтаксис,
Базовые возможности OO (классы, методы, объекты и т.п.),
Специализированные возможности OO (Mix-ins, одноэлементные методы, переименование, ...),
Перегрузка операторов,
Обработка ошибок,
Итераторы и замыкания,
Сбор мусора,
Динамическая загрузка (в зависимости от архитектуры),
Высокая мобильность (идёт на разных Unices, Windows, DOS, OSX, OS/2, Amiga, и т. п.)
Как видите Ruby - это объектно-ориентированный язык программирования; далее мы рассмотрим, что же всё-таки такое объектно-ориентированный язык программирования. Тот факт, что Ruby имеет открытый код, позволит вам свободно скачать все необходимые инструменты для написания на нём программ.
Здесь вы сможете найти все доступные для скачивания инструменты с официального сайта Ruby.
2- История Ruby:
*Цитата из RubyCentral:Ruby создал Юкиширо Мацумото (Yukihiro Matsumoto (who goes by the handle matz )) Находящийся под впечатлением от Perl, Мацумото решил дать своему новому языку название драгоценного камня и в итоге назвал его Ruby в честь камня соответствующего знаку зодиака своего коллеги.
Позже он узнал, что Ruby во многом является последователем Perl. В камнях, соответствующих знаку зодиака, жемчуг(pearl) - июнь, рубин(ruby) - июль. Измеряя размеры шрифта, оказалось, что pearl - 5pt, ruby - 5.5pt. Он решил, что Ruby самое подходящее имя для языка новее (и, мы надеемся, лучше) чем Perl.
[...]
Далее следует цитата из поста Мацумото на Ruby Talk:
Итак, Ruby появился на свет 24 Февраля 1993 года. Я разговаривал с моими коллегами о возможностях объектно-ориентированных скриптовых языков. Я знал Perl (Perl4, а не Perl5), но в целом он мне не нравился, так как вызывал ощущение игрушечного языка (и до сих пор вызывает). Идея объектно-ориентированного скриптового языка казалась мне очень многообещающей .
Я также знал Python. Но он тоже мне не понравился, так как, по моему мнению, он не являлся истинным объектно-ориентированным языком; возможности OO фигурировали как дополнение к языку. Мне безумно нравилась идея OOП, и я был её фанатом в течение 15 лет, я действительно мечтал о настоящем объектно-ориентированном, лёгком в использовании скриптовом языке программирования. Я искал, но так и не нашел .
Вот так я и решил создать свой собственный. Потребовалось несколько месяцев, чтобы создать интерпретатор. Я вложил в него все функции, которые мне хотелось в нём видеть, как например итераторы, обработку ошибок, сбор мусора .
Затем я реорганизовал функции языка Perl в библиотеку классов и реализовал их в Ruby. Я выложил Ruby 0.95 на отечественных форумах в декабре 1995 года .
3- Что такое Объектно-Ориентированный или OO?
Объектно-Ориентированный язык - это язык, в котором всё с чем вы манипулируете - это Объект .
(
Примечание: язык является набором синтаксиса, терм, правил и структуры, который используется чтобы создать программу. C++, Java и Ruby это всё языки .)
Всех ОО языкы объединяет базовая структура, в которой они оперируют. OO язык включает в себя следующие основные компоненты/функции:
-Классы
-Методы
-Сообщения
-Аргументы
-Переменные/Константы
Пояснение к диаграмме:
-
Класс содержит описание
переменных и
методов.
-
Метод содержит описание
переменных и код .
-
Сообщение может содержать
аргументы.
-
Объект является экземпляром класса.
- Объект сообщается по средствам
Сообщений или
Аргументов.
Пример Экземпляров Объекта:
Предположим, что
класс - это автомобильный завод, а
объект - это машины, которые он выпускает. Автомобильный завод содержит в себе все необходимые функции для производства машин, а каждая машина рассматривается как отдельный экземпляр одной и той же вещи. Экземпляры машин являются разными объектами и могут быть изменены в отдельности друг от друга. Когда авто компании требуется поставить на конвейер новую машину они просто заказывают фабрике новую машину; так как завод(
класс) уже существует, это экономит время и вам не нужно каждый раз вручную переделывать каждую машину (
объект).
Пример Сообщения и Свойств Объекта:
Когда вам необходимо получить доступ к свойствам объекта, вам нужно отправить сообщение к нему, чтобы он в свою очередь отправил вам свой ответ -- Также, если вы хотите изменить свойства объекта вы, опять же, отправляете ему сообщение, чтобы изменить его. Например, в RPG Maker XP у героя есть множество свойств, таких как Имя , Жизни и Уровень . Когда вы открываете главное меню во время игры вы видите все эти свойства(Уровень, Имя и Жизни) на экране. Перед тем как отобразить эту информацию RPG Maker XP посылает сообщение к объекту Герой с запросом о его свойствах.
Метод фактически определяет, какие
сообщения объект будет в состоянии получить, и что делать, когда он их получит. Таким образом, объект связан со своим создателем (
классом) и всякий раз, когда сообщение отправляется к объекту или принимается от него, приводится в дейтсвие
метод в классе, отвечающий за этот объект.
Вернёмся к примеру с героем: Таким образом, класс, определяющий Героя в RPG Maker XP, имеет метод для каждого сообщения, которое Вы можете послать его экземплярам объектов. К примеру, метод с названием name будет отвечать за имя нашего героя и всякий раз, когда нужно будет вывести или изменить имя героя, то все сообщения будут проходить через этот метод.
4- Что такое RGSS ?
RGSS сокращение от Ruby Game Scripting System что означает Игровая Система Скриптов Ruby . RGSS использует язык Ruby, так что если вы знаете Ruby - вы знаете RGSS. Разница между Ruby и RGSS состоит в том, что RGSS является Скриптовым языком который использует уже созданные компоненты. В чистом Ruby, если вам, к примеру, нужно вывести на экран картинку вы не сможете пользоваться тем же синтаксисом что и в RPG Maker XP RGSS, вам придётся прописать все функции с нуля.
Пример кода RGSS для отображения картинки (Позже мы подробно рассмотрим этот пример.):
image = Sprite.new
image.bitmap = RPG::Cache.picture(имя картинки)
Таким образом вам необходимо всего 2 строчки кода чтобы вывести картинку на экран, так как вы используете класс под названием Sprite который уже запрограммирован в RPG Maker XP (Не доступен в Редакторе Скриптов (Script Editor).) Так же вы используете модуль RPG , который то же не доступен в Редакторе Сериптов (Script Editor). Всё это упрощает вам работу и позволяет быстрее программировать свои игры.
Но так как RGSS использует Ruby, и RPG Maker XP использует Ruby (Версия 1.8.1), вы можете написать полностью новый класс Sprite и использовать его или даже добавить в него новые функции.
Итак, всё это значит что RGSS гораздо проще чем Ruby, так как все операции низкого уровня обрабатываются посредствам RPG Maker XP и вам не нужно их прописывать самим.
(
Примечание: операция низкого уровня означает весь код который вы должны были бы написать, чтобы показать картинку, обратиться к машине (к Windows), чтобы прочитать файл, показать файл, и т.д.)
5- Редактор Скриптов RPG Maker XP (RPG Maker XP Script Editor)
В RPG Maker XP есть встроенный Редактор Скриптов (Script Editor) который позволяет вам редактировать/добавлять так называемые Скрипты . Все скрипты - это код RGSS (Использующий синтаксис и возможности Ruby) который позволяет вам добавлять или изменять возможности в RPG Maker XP. Когда вы открываете Редактор Скриптов (Script Editor), вы видите что в нём уже содержится множество Скриптов ; всё это стандартные скрипты, которые дают жизнь стандартным играм. В Enterbrain все скрипты классифицировали по Классам . Для каждого класса выделена отдельная страница (хотя вы можете смешать сразу несколько классов на одной странице.)
Для того чтобы открыть редактор скриптов нужно нажать F11 или выбрать в меню секцию Tools и там выбрать Script Editor или же просто нажать на иконку Script Editor в панели инструментов.
Название класса не имеет ничего общего с названием страницы. И оно не обязательно должно быть таким же как и название класса. Как я говорил ранее на одной странице может находиться сразу несколько классов.
Цвет кода:
Далее приведён список цветов, которые используются для удобства работы в редакторе.
Синий
Синим цветом обозначаются зарезервированные слова как
def,
class,
end,
when,
if,
case, и т. п..
Red
Красным цветом обозначаются числа.
Голубой
Голубым цветом в коде выделяются операторы и операнды. К ним относятся =, ||, + и *.
Зелёный
В зелёный цвет окрашиваются все комментарии. Комментарии игнорируются компилятором и служат для описания каких-либо действий, описания работы скрипта и т.п.
Фиолетовый
Фиолетовым цветом окрашиваются все текстовые (строковые) элементы кода.
Функции Редактора Скриптов:
Редактор скриптов RPG Maker XP наделён базовыми функциями, как Поиск, Замена и Перемещение к строке. Далее идёт список всех опций.
Функции Просмотра:
(Правый клик в окне Просмотра Кода чтобы увидеть все функции)
- Базовые функции Вырезать/Копировать/Вставить/Отмена последнего действия.
- Поиск (Control+F)
- Замена (Control + H)
- Перейти к строке (Control + G)
- Приближение/Отдаление при помощи Control+Колёсико Мыши
Функции Списка Страниц:
(Правый клик в окне Списка страниц чтобы увидеть все функции)
- Базовые функции Вырезать/Копировать/Вставить
- Добавить страницу (Insert)
- Удалить страницу(Delete)
- Поиск (Control + F)
Также следует обратить внимание на возможности редактирования названия страницы, строка которого находится в левом нижнем углу редактора скриптов. Оно воспринимает юникод и позволяет вам устанавливать выравнивание текста; наверное, потому что RPG Maker XP делали японцы.
6- Базовая терминология и синтаксис
Итак, пришло время наконец-то заняться кодом. Начнём с простого, дабы показать вам основной синтаксис и усвоить термины, которыми вы будете пользоваться в написании скриптов. Итак, напишем простенькую программку, которая по завершении будет выдавать нам сообщение I am therefore I m coded. . (Извините, что нарушаю традицию Hello World , но это было необходимо!)
class Say_Something
def initialize
print I am therefore I m coded
end
end
Создайте новую страницу в редакторе скриптов, а затем перенесите в него код. Вы можете назвать страницу как угодно. (В нашем примере он будет называться Say Something ).
Итак, чтобы задействовать наш скрипт нам понадобится событие на карте которое будет выполнять класс. В этом событии вставьте команду Call Script (последний пункт на последней странице), и впишите туда следующее:
А теперь можете проверить как работает наш скрипт. Запустите игру и обратитесь к событию, должно выйти окошко с сообщением I am therefore I m coded .
Итак, начнём объяснение всего что мы проделали (строка за строкой):1 class Say_Something
2
3 def initialize
4 print I am therefore I m coded
5 end
6
7 end
Строка 1: Мы задали новый класс под названием Say_Something .
Строка 3: Мы задали новый метод под названием Initialize .
Строка 4: Мы написали код, который будет выполняться всякий раз при обращении к методу initialize .
Строка 5: Здесь мы закрыли метод initialize зарезервированным словом END .
Строка 7: Здесь мы закрыли наш класс Say_Something зарезервированным словом END .
Метод initialize - это стандартный метод, который выполняется когда вы используете синтаксис .new, что мы и сделали в событии командой Call Script. Итак, вызвав скрипт командой Say_Something.new RPG Maker XP создал экземпляр класса Say_Something с сообщением new , что в свою очередь привело в действие метод initialize .
Как вы уже заметили всё, что объявляется, должно закрываться зарезервированным словом END. Это относится ко многим вещам в Ruby, и чтобы избежать путаницы стоит выделять части кода выступами. (См. пример ниже).
Как видите, все дочерние функции мы разбили на сегменты . Так можно легко определить, где начинаются функции, а где он заканчиваются.
Ранее мы сказали, что всё в Ruby является объектом, но вам могло показаться, что никакого объекта из примера Say Something так и не вышло. На самом деле объект был, но он был удалён сразу же после пояления. Чтобы сделать постоянный объект вам нужно будет написать следующий код для вызова скрипта:
my_object = Say_Something.new
Это будет иметь тот же эффект, но на этот раз мы получим объект под названием my_object и принадлежщий классу Say_Something . Конечно, так как наш класс не делает ничего кроме вывода сообщения, нет смысла создавать для него отдельный объект.
Итак, давайте немного дополним наш класс Say_Something чтобы научиться использовать объекты, а также мы познакомимся с Аргументами . Замените код в Say_Something на следующий:
class Say_Something
attr_accessor :greeting
attr_accessor :name
def initialize(greeting, name)
@greeting=greeting
@name=name
end
def say
print @greeting + + @name
end
end
Затем измените код вызова функции (правый клик и выберите Edit или нажмите пробел) в событии на следующий:
(Я пропустил пару строк чтобы было нагляднее.)message1=Say_Something.new( Привет , Лёша )
message2=Say_Something.new( Привет , Петя )
print message1.name
print message2.name
message1.say
message2.say
Теперь можете запустить игру, и обратится к событию. Вы увидите 4 окошка с сообщениями, выходящих в заданном порядке. Первое окошко покажет name объекта message1 , второе покажет то же для message2 . Затем, 2 оставшихся окна выведут вам сообщения по методу say .
Таким образом, мы создали 2 объекта - message1 и message2 , которые являются двумя экземплярами Say_Something , которые могут быть изменены вне зависимости друг от друга.
Теперь объяснение что к чему, построчно:01 class Say_Something
02
03 attr_accessor :greeting
04 attr_accessor :name
05
06 def initialize(greeting, name)
07 @greeting=greeting
08 @name=name
09 end
10
11 def say
12 print @greeting + + @name
13 end
14
15 end
Строка 1: Мы задали класс под названием Say_Something .
Строка 3: Мы задали значение ATTR, то есть Атрибута. В этом плане Ruby очень удобен, так как мы можем просто использовать синтаксис ATTR_ACCESSOR, чтобы определить новый атрибут, который будет удобочитаем, и перезаписываем для каждого экземпляра объектов, созданного Say_Something . Итак, наш первый атрибут называется greeting , т.е. приветствие.
Строка 4: Мы задали ещё один атрибут со значением name , т.е имя .
Строка 6: Мы задали новый метод под названием initialize . Как говорилось ранее метод initialize запускается в первую очередь при создании нового объекта классом к которому он принадлежит. Потому мы поставили на этот метод Приёмник Аргументов чтобы он первым делом задал нужные нам значения аргументов, принимая данные из вне. В нашем случает этими аргументами (или атрибутами) являются приветствие и имя . Мы поместили приёмник аргументов в скобках справа от названия метода. Заметьте, что Приёмник Аргументов только принимает; названия используемое в скобках - это названия переменных, которые в последствии обзаведутся конкретными значениями.
Строка 7: Здесь мы задаём новую Переменную Экземпляра , которая будет принимать значение всех полученных значений greeting . (Переменная экземпляра всегда начинается со знака @ и используется в каждом методе данного класса, задаются в основном в методах.) Таким образом, полученное приёмником значение greeting помещается в переменную @greeting , которую можно будет использовать в другом методе.
Строка 8: То же самое что и в предыдущей, только с атрибутом name .
Строка 9: Закрываем метод initialize зарезервированным словом END.
Строка 11: Мы задали новый метод под названием say .
Строка 12: Тут мы прописали что произойдёт когда объект примет сообщение say . В нашем случае мы выводим содержимое @greeting , плюс пробел, плюс содержимое @name .
Строка 13: Закрываем метод say зарезервированным словом END.
Строка 15: Закрываем наш класс Say_Something зарезервированным словом END.
Теперь разберём что мы делали, вызывая скрипт:1 message1=Say_Something.new( Привет , Лёша )
2 message2=Say_Something.new( Привет , Петя )
3
4 print message1.name
5 print message2.name
6
7 message1.say
8 message2.say
Строка 1: Создаём новый объект message1 который будет экземпляром Say_Something . А это значит, что всё что мы можем с ним делать определено в нашем классе Say_Something . Так как мы добавили Приёмник Аргументов в метод initialize класса Say_Something , нам нужно отправить туда эти аргументы или же RPG Maker XP закроется так и не получив их. Чтобы отправить аргумент классу, нужно вписать желаемые значения по порядку через запятую в скобках рядом с названием класса как показано в примере.
Строка 2: Делаем то же самое чтобы создать ещё один объект под названием message2 .
Строка 4: Используем команду Ruby print чтобы вывести название содержащееся в объекте message1 . Как видите, всё довольно просто, вы можете получить доступ к атрибутам (свойствам) объекта используя необходимый атрибут указанный в ATTR класса.
Строка 5: То же самое для message2 .
Строка 7: Теперь отправляем сообщение say нашему объекту message1 . Можете называть это командой , если пожелаете. Итак, вы сообщили объекту message1 чтобы тот выполнил его функцию say ; затем message1 произвёл поиск по своему классу Say_Something чтобы убедиться что такая команда задана... А она задана, и объект произвёл действие указанное в классе, то есть вывел нужный текст на экран.
Строка 8: То же самое для message2 .
7- Заключение
Теперь вы знаете как выглядит основная структура программ Ruby, а также знаете всё что понадобится для изучения Второй Главы этого урока, который я (Preston), надеюсь, вскоре переведу