Архив сообщества
2011 — 2019
Аватар Kawaiidesu~~~

Попробуем покодить? Урок второй

Автор: Kawaiidesu~~~ · 11.01.2014, 22:08 · 7 сообщений

Сообщений в теме: 7

Kawaiidesu~~~#1

И снова здравствуйте. Я Kawaiidesu~~~ и это второй урок по программированию в бьёнде.

В прошлом мы рассмотрели создание переменные и методы, объекты, создание оных и использование процедур, в этом же мы глубже копнём методы, изучим основные возможности самого универсального цикла бьёнда, методов и действий("verb"), наследование, а также подружим два разных объекта.

Что такое метод, мы видели в прошлом уроке, но у него ещё множество интересных возможностей. Вспомните фонарь, он нам ещё сослужит службу. На данный момент он выглядит так:

Изображение

Сделаем для фонаря лампочку. Конечно, столь малый код проще сделать прямо в фонаре, но если мы собираемся использовать лампочку где-то ещё или просто хотим отделить одно от другого, то лучше создать новый объект.

Лампочка будет обладать параметром "glower", который отвечает за состояние нити накаливания и "glass" за состояние стекла лампы. Конечно, вообще такие сложности ни к чему, но ради примера можно.

Изображение

Иногда метод гораздо удобнее, чем проверка каждой переменной, поэтому сделаем такой для проверки:

Изображение

Здесь можно увидеть два примера - в первом переменные "складываются", во втором "умножаются". Любой из них будет работать одинаково хорошо, но я возьму первый.

Как ранее говорилось, "return" отвечает за то, что возвращает метод - в нашем случае он отвечает, сломана ли лампочка. Сделаем эту лампочку тёплой и ламповой, пускай она греет людям сердца :3

Изображение

С первой строкой, я думаю, всё понятно, но во второй "return" на той же строке, что и "if", разве так можно? Да, если после системного оператора(for, if, while и прочее) вам хватает лишь одной строки, то можно поставить код прямо на той же строке, точно также мы можем написать "for(var/mob/m in range®) m << "You feel some heat."" в одну строку. Но не переусердствуйте с этим, обычно так лаконично смотрится лишь простой код.

Следующая строка с for это цикл, довольно сложная строчка, я скажу, поэтому разберём её по кусочкам с конца: range(n) это системный метод бьёнда, который возвращает связный список "list"(далее). "in" это также системный оператор, но немного другой. Он сверяет список справа с условием слева и возвращает уже фильтрованный список. Вообще данная строка читается как "Для(for) всех объектов типа /mob(var/mob/m) в(in) радиусе 3(range(3))". Внимательные уже заметили "var" и, возможно, поняли, что мы создали переменную в цикле. Но чего мы этим добиваемся? Для этого надо рассмотреть работу "for" - он начинает листать список: берёт первый элемент списка, присваивает его укзанной и созданной специально для этого переменной, указанной в самом "for'е", исполняет код, указанный ниже него, потом повторяет, пока не кончатся объекты или не встретится оператор "break", который как "return" прерывает исполнение, но не метода, а конкретного цикла. Это самый сложный к описанию элемент и если вы его поняли - вы поймёте и дальше.

Переменной m будет присваиваться моб. "<<" - оператор вывода. В контексте бьёнда оператор вывода посылает файл, сообщение или что-то ещё прямо на текстовое поле всех клиентов, подключённых к данному объекту. К примеру, если двое человек управляют мобом, то им обоим пришлётся сообщение, указанное справа.

Теперь наша тёплая, ламповая лампочка светит тёплым, ламповым светом, но ведь её ещё нужно засунуть в фонарик, не так ли? Для этого мы будем использовать ссылку ("reference"/"ref") на объект. Ссылки создаются точно также, как и переменные. Так как в бьёнде используются нетипизированные переменные, то есть не важно, будет ли это строка, объект, число, то всё сокращается до лаконичного:

Изображение

Но тут-то и возникает главное отличие ссылки от обычной переменной - ссылка не создаёт объект, она лишь указывает. То есть мы можем создать десять ссылок в разных местах, указать на один объект, и изменение через ссылку объекта отразится на всех ссылках.

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

Скопировать ссылку
Kawaiidesu~~~#2

Оператор создания нового объекта в бьёнде это "new()". Зачем же скобки? В них мы можем указать нужные для создания переменные, к примеру для всех стандартных классов бьёнда нужно указывать место, где появляется объект.

Изображение

Здесь light, l2 и l3 будут полностью идентичны, они ссылаются на один объект. К тому же здесь мы впервые используем переопределение метода, но об этом позже. Далее, после new вы можете увидеть путь к объекту, я думаю, это очевидно, а в скобках "src". "src" это ссылка на объект, в котором выполняется метод, то есть мы создали новый объект типа /obj/bulb в фонаре, в котором и присутствует данный код.

Вызов методов, как многие уже знают, осуществляется через "ProcName(args)", но как нам вызвать его у лампочки? Для этого существует оператор доступа ".", который позволяет нам получить доступ к переменным, ссылкам и методам объекта.

Изображение

Но тут возникает главная проблема - бьёнд не видит данного метода, так как мы не сообщили ему, на класс какого типа ссылается объект. Исправим это

Изображение

Здесь мы видим, что переменная обзавелась путём, типом объекта в середине. Почему именно так? Скорее всего потому что это действительно удобный способ, отличающийся полнотой информации и отсутствием необходимости запоминать множество классов, а так же оставляющий возможность повторяемости названий. Вообщем удобно. Соберём всё вместе: слева, в самом начале, мы указываем, что это переменная("var"), дальше мы сообщаем тип объекта. Если мы этого не сделаем - бьёнд будет обращаться с ней, как с универсальной переменной и не даст нам доступа к методам и переменным. Закрывается же всё названием переменной. Также существует оператор "мягкого" доступа, который не выдаёт ошибку, если метод отсутствует, но реальная необходимость возникает редко, а глупо используют часто, поэтому я лишь сказал про наличие такой возможности.

Наследование классов и переопределение методов, это базис ООП, который позволяет слегка подправивить или полностью изменить объект, добавить новый функционал или изменить старый. Вы уже видели первый пример переопределения с системным методом New(), которая есть у абсолютно всех классов, но я приведу и другой пример. А вот текущей листинг кода.

Изображение

Допустим, нам понадобился фонарик с двумя лампочками, но нам нужен и старый с одной лампочкой. Что нам поможет? Наследование! Совершим наследование от фонаря и добавим новую переменную!

Изображение

Что мы здесь видим? Во-первых, изменился путь/тип, но если быть точнее, то он не изменился, а расширился. Остался старый "/obj/flashlight", но к нему добавился "/powerful". Что это даёт? У данного класса остаются все старые переменные, ссылки(далее просто переменные) и методы, но мы можем добавить новые, не затрагивая старых. Что мы и делаем в следующей строке, объявляя новую лампочку уже известным способом. Ещё можно заметить, что мы снова переопределяем "New()", добавляя в него создание новой лампочки и странный метод "..()". Этот метод отвечает за вызов аналогичного метода, но в интерпретации класса-родителя. Коротко говоря, он вызывает "New()" класса /obj/flashlight. Зачем нам это? Чтобы не переписывать создание первой лампочки, разумеется.

Но что это за сильный фонарь, если он греет так же недалеко? Исправляем!

Изображение

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

Изображение

Создадим своего первого моба - монстра-флешлайтера, мухахахаха! У него: переопределена системная переменная name, если быть точнее - изменено её значение по умолчанию, а двум фонарям-рукам присвоены фонари - правый - обычный, левый- сильный. Хотя обе переменных были объявлены как "/obj/flashlight", так как метод "Use()" переопределён, то у сильного фонаря будет вызван именно "/obj/flashlight/powerful/Use()", а не "/obj/flashlight/Use()". Если сказать по простому - он будет использовать именно ту версию метода, которая заключена в классе в ссылке, а не в каркасе класса в переменной.

И самое главное - "verb"! Это действие, которое может вызвать у объекта, у моба, сам моб, условия изменяемы. Пока что достаточно лишь знать, что это метод, который может быть вызван пользователем вручную, как, к примеру, вращение стула.

К переменным доступ происходит точно так же, как и к методам, лишь не надо ставить скобки. К примеру

Изображение

Здесь мы использовали системный метод prob(x), который выдаёт 1 с вероятностью в то значение, которое вы вобьёте, в процентах. То есть если написать prob(100), всегда будет 1, если prob(0), всегда 0, а если prob(50), то 50 на 50. Далее мы обращаемся через ссылку на ссылку и уже к переменной, присваивая ей значение 1. Сломалась лампочка, такие дела.

Я снова хочу есть, спать и посмотреть что нибудь, поэтому на этом урок стремительно заканчивается. Если есть вопросы - пишите

Скопировать ссылку
Kawaiidesu~~~#6
JavQ (11 January 2014 - 14:43) писал:

Один рассказал, другой написал.

Пятюню Эдитору.

Но ты все же оставь ссыль на первую часть в оп посте.

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

fey (11 January 2014 - 16:17) писал:

я же тебе сказал, оформляй в тег кода, сука

Нет.

Скопировать ссылку
JavQ#7
Kawaiidesu~~~ (12 January 2014 - 00:56) писал:

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

Тогда молодец и пятюню тебе.

Спасибо за ссылочку.

:3

Скопировать ссылку

Обратно в Кодинг