Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Карта подземелья (XP)

Карта подземелья (XP) 11 года 2 мес. назад #58995

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

ВНЕЗАПНО понадобилось сделать карту подземелья, по которому бегает герой. Хотелось следующие вещи:
1) Карта динамически обновляется с открытием героем новых комнат.
2) По карте возможно бегать, просматривая описания комнат.
3) Вызывать увеличенную картинку комнаты. В итоге стало лень рисовать, и эту возможность отбросил, но краткое описание, как сделать, тут будет.
4) Открывать карту по какой-нибудь кнопке прямо из игры

Итак, нам понадобятся:
Ресурсы:
  • Холст - берем подложку с изображением пергамента, размером с экран
  • Мини картинки для глобальной карты. Для каждой мапы - своя картинка. Проще всего каждую карту рисовать в фотошопе или пейнтнете как новый слой на холсте. Это прозрачная картинка - контур комнаты с какими-то пометками. Потом, чтобы экономить место и память игры, картинки обрежем по их контуру.
  • Одна картинка - шаблон подсветки комнаты. Это просто полупрозрачный прямоугольник, впрочем, можно сделать, как душе угодно. Как вариант (в случае комнат на глобальной карте непростых форм - делаем подсветок столько же, сколько комнат). Вариант проще - картинку не надо, а просто заливаем прямоугольник полупрозрачным белым цветом.
  • Картинка светящейся точки - положения героя на глобальной карте.
  • Туча увеличенных карт (отдельная комната) - по желанию. Долго делать, но зато красиво.

Классы:
1) Нам необходимо добавить class Map, содержащий:
  • Id - это Id карты в мейкере.
  • Название - для печати названия выбранной карты на глобальной.
  • Положение верхнего левого угла карты на глобальной (размер берем из файла); x, y.
  • Положение отметки игрока; x, y.
  • 4 значения - Id карты, соседней с этой. Нужно для управления крестовиной на глобальной карте, для перехода на соседнюю карту. -1, если нет соседней карты.
  • Название части карты и увеличенной карты (если не принята какая-нибудь нотация относительно Id)
Пример:
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]

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

2) В Game_Party нужно добавить список, который будет содержать открытые карты и добавить методы по добавлению новой карты, и вспомогательные методы. Под спойлером код с комментариями.

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


Вот так мы из события авторана, при входе на карту, добавляем её в список (не забудьте поставить условие на какой-нибудь Self Switch, чтобы добавить только один раз).

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



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


Теперь в игре нужно создать событие просмотра карты, подвесив его на кнопку. В Common Events по свичу добавить отлов нажатия кнопки; свич инициализировать либо в начале игры, либо при наступлении какого-то события, например, герой нашел бумагу и перо, и теперь может рисовать карту. Проще показать картинками:


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

Тут я создал параллельное общее событие (зависимость поставлена от switch, который я активирую, когда герой находит письменные принадлежности). В событии просто проверяется нажатие кнопки W (в стандартной раскладке; так то это RShift) и дергаем скрипт $game_party.showmap, сопровождая это звуком Book1. Флаг ожидания я убираю, чтобы не мешал в режиме карты (на деле лучше завести еще один), но включаю еще один флаг - для обработки действий игрока на карте. Заодно, от греха подальше, убираю доступ к меню.

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

Сюда мы попадаем (см. флаг-условие), когда нам показывают карту. Тут тоже обрабатываем нажатия кнопок: по W или X (назад, или B на джойстике) прячем карту, возвращаясь в игру и включаем первый флаг для ожидания нового нажатия вызова карты. На кнопки направления реагируем, двигаясь по карте при помощи вызова метода movemap(dir).


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

В начало метода update класса Scene_Map добавляем следующий код:

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


тут почти все, что в цикле далее, но убран апдейт героя, так что ходить он не будет, а реакция на кнопки управления и события осталась.

Все, собираем, запускаем, отлавливаем баги и тестируем карту.

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

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


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

Вкратце:
Нужна будет еще одна поверхность выше карты, как будто мы держим карту отдельного помещения над основной. Нужно еще одно общее событие, которое активизируется из второго, например, по кнопке "пробел" (C на джойстике). Нужно дописать метод show_map ,чтобы по новому флагу из $game_temp рисовать увеличенную карту. Карты складываем в папку Picture, придумываем нотацию названия, например mapbigX.png и дергаем картинку
RPG::Cache.picture('mapbig' +$game_temp.current_map.to_s)
Не забываем в новое общее событие дописать возврат на обычную карту по кнопке B

Демку создавать было лениво, так что лучше я выложу пример на реальном проекте, заодно можно увидеть наработки по изменениям в Imprizoned. Готово пока 8 карт, прохождение до момента подрыва двери. Карты открываются по кнопке W, после того, как в первой же камере герой подберет бумаги и перо с пола.

Ссылка на проект: rusfolder.com/35168717

И бонус - постоянно теряемый и находимый в гугле список кодов кнопок!
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Последнее редактирование: 11 года 2 мес. назад от caveman.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DeadElf79, Dprizrak1, RastaManGames, SailorSaturn

Карта подземелья (XP) 11 года 2 мес. назад #58997

  • AnnTenna
  • AnnTenna аватар
  • Вне сайта
  • Администратор
  • ловлю волны настроения
  • Сообщений: 4543
  • Спасибо получено: 4694
  • 2 место ГотвПроект месяца 3 местоПобедитель Сбитой кодировкиУчительПроект месяца 2 местоОрганизатор конкурсов3 место в КодировкеПроект месяца 1 местоПроект года 2 местоКоммерсант
*_* Ух ты, круто! Не возражаешь, что я перенесла тему в Академию в Факультет Скриптов? Мне думается, что так ее заметит больше народу, тем более это туториал.

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

Карта подземелья (XP) 11 года 2 мес. назад #58998

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

Если будет полчасика свободных - глянь, пожалуйста дему от этого туториала, просто на предмет переделки карт и поправленных ошибок. Переделано совсем мало, где-то на полчаса; до двери, которую надо взорвать. :blush:
Администратор запретил публиковать записи гостям.

Карта подземелья (XP) 10 года 7 мес. назад #64274

  • caveman
  • caveman аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1274
  • Спасибо получено: 1307
  • Проект года 3 местоПроект года 1 местоПроект месяца 3 местоУчительПрограммист Ruby3 местоПроект месяца 2 местоВетеранПроект месяца 1 местоОрганизатор конкурсов
На япапке ссылка убилась, потому перетаскиваю на ядиск :)
yadi.sk/d/k_V2bPi18pmDV
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: AnnTenna, SailorSaturn, Jas6666

Карта подземелья (XP) 10 года 7 мес. назад #64685

  • Dprizrak1
  • Dprizrak1 аватар
  • Вне сайта
  • Просветлённый
  • Призрак обитающий в стенах Академии
  • Сообщений: 437
  • Спасибо получено: 165
Круто, круто, но это так же как и два урока по Ruby не помогли мне((
(^_^)
Этот форум слишком умный для меня
Администратор запретил публиковать записи гостям.
Время создания страницы: 0.222 секунд