Если вы когда-либо делали flash-квесты, то наверняка знаете, как трудно в играх этого жанра создать такой традиционный элемент, как панель инвентаря. Это ещё более сложно, если игровых героев не один, а несколько. Вот для такого случая и был создан класс Inventory на ActionScript 2.0. Ничего "крутого" в нём, конечно, нет. Но класс Inventory позволяет минимальным количеством кода создать простую панель инвентаря, а затем управлять инвентарём при помощи понятных и удобных команд. Выглядит это примерно так:
Для создания показанной выше панели понадобилось всего три строчки кода...
Код ActionScript 2.0:
/*
импорт класса
*/
import Inventory;
/*
создаём панель инвентаря
*/
var invent:Inventory = new Inventory(this, "Hero #1", 4, 2, 50, 50, ["branch", "lupa", "shield"]);
/*
устанавливаем координаты для панели инвентаря
*/
invent.coord(50, 50);
Конструктор объекта Inventory принимает следующие параметры:
- 1-й параметр - объект-контейнер, в который будет помещена панель инвентаря;
- 2-й параметр - подпись/заголовок над панелькой;
- 3-й параметр - количество столбцов у панели;
- 4-й параметр - количество строк;
- 5-й параметр - ширина ячеек у панели;
- 6-й параметр - высота ячеек;
- 7-й параметр - массив, в котором перечислены предметы, доступные для помещения в данную панель инвентаря. Но это не просто названия предметов, а уникальные идентификаторы, которые задаются в Linkage Properties. Для тех, кто забыл, как устанавливаются такие идентификаторы, напоминаю:
1.) Открываем библиотеку проекта.
2.) Правым кликом мышки вызываем контекстное меню над интересующим нас MovieClip-ом.
3.) В контекстном меню жмём пункт Linkage....
4.) В открывшемся окне вводим свой уникальный идентификатор.
5.) Ставим галочку у пункта Export for ActionScript.
6.) Сохраняем изменения. Всё.
Теперь, допустим, вам надо в инвентарь добавить какой-то предмет (например, "branch" - ветку)...
Код ActionScript 2.0:
/*
импорт класса
*/
import Inventory;
/*
создаём панель инвентаря
*/
var invent:Inventory = new Inventory(this, "Hero #1", 2, 4, 50, 50, ["branch", "lupa", "shield"]);
/*
устанавливаем координаты для панели инвентаря
*/
invent.coord(50, 50);
/*
добавляем предмет в инвентарь
*/
branch.onPress = function() {
if (invent.add("branch","ветка")) {
this._visible = false;
invent.addJournal("В инвентарь добавлена ветка.");
}
};
Результат:
Как видите, на сцене у нас есть мувиклип branch (рисунок ветки), который является экземпляром MovieClip-а с одноимённым уникальным идентификатором. Если пользователь кликает по данному мувику, то программа пытается добавить предмет (ветку) в инвентарь с помощью метода add() (первый параметр - это уникальный идентификатор предмета в библиотеке проекта, а второй параметр - пояснительный текст к предмету). Если предмет успешно добавляется, то метод add() возвращает true. А если добавить предмет не получилось (нет места в инвентаре или данный предмет отсутствует в списке разрешённых к добавлению предметов), то возвращается false. А с помощью метода addJournal() можно добавить новую запись в журнал (вызывается кликом по круглой кнопке с "+").
Думаю, ничего сложного нет.
А теперь кратко опишу другие методы класса Inventory:
- метод del() - удаляет предмет из инвентаря; в качестве единственного параметра принимает уникальный идентификатор предмета;
Код ActionScript 2.0:
/*
импорт класса
*/
import Inventory;
/*
создаём панель инвентаря
*/
var invent:Inventory = new Inventory(this, "Hero #1", 2, 2, 60, 60, ["lupa"]);
/*
устанавливаем координаты для панели инвентаря
*/
invent.coord(50, 50);
/*
добавляем предметы в инвентарь
*/
lupa.onPress = function() {
if (invent.add("lupa","лупа")) {
delLupa._visible = true;
this._visible = false;
invent.addJournal("В инвентарь добавлена лупа.","лупа");
}
};
/*
кнопка удаления лупы
*/
delLupa._visible = false;
delLupa.onPress = function() {
if (invent.have("lupa")) {
this._visible = false;
invent.del("lupa");
trace("Лупа удалена!!!");
} else {
trace("Лупа в инвентаре отсутствует!!!");
}
};
Результат:
- метод delAll() - удаляет все предметы из инвентаря;
- метод activCell() - возвращает уникальный идентификатор того предмета, который в данный момент выделен в инвентаре;
- метод allowed() - в качестве единственного параметра принимает уникальный идентификатор и возвращает true или false в зависимости от того, можно ли предмет с этим идентификатором добавить в данную панель инвентаря;
- метод have() - в качестве единственного параметра принимает уникальный идентификатор и возвращает true или false в зависимости от того, присутствует ли предмет с данным идентификатором в данном инвентаре;
- методы hide() и show() - используются для того, чтобы делать панель инвентаря невидимой/видимой;
- метод addAvailable() - расширяет список предметов, разрешённых к добавлению в инвентарь; в качестве единственного параметра принимается ун. идентификатор предмета;
- метод delAvailable() - удаляет предмет из списка разрешённых; в качестве параметра принимает идентификатор, а возвращает true (успешное удаление) или false (неудача);
- методы coord() и coordAnim() - изменяют координаты у панели инвентаря и принимают в качестве параметров новые координаты по оси X и Y;
- метод light() - подсвечивает ячейку с определённым предметом; в качестве единственного параметра принимает идентификатор предмета;
- методы saveInfo() и loadInfo() - сохраняют/загружают данные из LSO; первый параметр у этих функций - это тоже самое, что и первый параметр у метода getLocal() класса SharedObject; второй параметр - это имя переменной, в которой будет храниться информация (это сделано для того, чтобы не было конфликта с другими переменными).
Если вы что-то не поняли, то загляните в исходники или задайте вопрос в комментариях к этому посту. Исходники и сам класс Inventory скачать можно здесь - скачать исходники (под Macromedia Flash 8).
if (invent.have("предмет")) {
trace("Предмет уже имеется в инвентаре!");
} else {
trace("Такого предмета в инвентаре ещё нет!");
}