Game Maker - создание игр | HellRoom Games
Май 14, 2025, 11:47:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Ссылки на события
  • Новый урок в школе GML: Август 28, 2011 - Август 31, 2011
Страниц: [1]   Вниз
  Печать  
Автор Тема: Урок 10. Комнаты  (Прочитано 20028 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« : Август 28, 2011, 10:07:56 »

Комнаты - вид игровых ресурсов, место взаимодействия экземпляров объектов.
В отличии от остальных ресурсов, в списке комнат важен их порядковый номер.
Любую комнату можно охарактеризовать как первая, последняя, предыдущая или следующая. Рассмотрим на примере.
Рассмотрим на конкретном примере. Допустим у нас есть такой список комнат
Код:
r_start
r_menu
r_01
r_02
r_end
Ясно, что r_start будет комнатой, которую можно назвать "первая". Но она же и является "предыдущей" для r_menu. В свою очередь r_menu будет "следующей" для r_start и "предыдущей" для r_01... И в конец концов r_end будет "последней" и "следующей" для r_02. Следует запомнить эту небольшую классификацию.

Также к комнатам относится 2 понятия: индекс комнаты - название игрового ресурса; и имя комнаты - её заголовок.
Теперь поясню про заголовок.
Заголовок (или имя) комнаты - надпись на окне приложения сверху.
Заголовок комнаты содержится в переменной room_caption (по умолчанию пустая строка). Через эту переменную можно напрямую изменять имя комнаты. Например (обратите внимание на событие):
Код: (Step)
room_caption="My first game"
или
Код: (Step)
caption="my game";
a=4
room_caption="It is "+caption+string(a);

Важно помещать изменение заголовка в событие Step, потому что каждый шаг имя комнаты сбрасывается (становится равным пустой строке), и приходится каждый шаг его возвращать.

Теперь обсудим основное свойство комнат - переходы.
Можно во время игры перейти в любую комнату при помощи
Код:
room_goto(индекс)
например
Код:
room_goto(r_menu)//r_menu комната из нашего списка (см. выше)
Но зачастую нам нужно перейти не в определённую комнату, а в "следующую" или "предыдущую" (вспоминайте классификацию)
Для этого пользуемся соответствующими функциями room_goto_next() и room_goto_previous()

Но тут получается заминка. У первой комнаты нет предыдущей, равно как и у последней комнаты не следующей. Здравый смысл (и кэп) подсказывают нам, что нужно выполнять проверку на возможность перейти. В этом нам помогут особые переменный (ВНИМАНИЕ! эти переменные нельзя изменить)
Код:
room - содержит индекс текущей комнаты
room_first - содержит индекс первой комнаты
room_last - содержит индекс последней комнаты
То есть проверка будет выглядеть следующим образом
Код:
if(room!=room_last)
{
room_goto_next()
}
или
Код:
if(room!=room_first)
{
room_goto_previous()
}
room_first и room_last можно использовать в качестве аргумента к функции room_goto(). Не запрещено также пользоваться choose, к примеру
Код:
room_goto(choose(room_last, room_first))
Для перехода в случайную комнату из всех возможных пользуйтесь конструкцией
Код:
room_goto(irandom(room_last))
или, чтобы комнаты не повторялись...
Код:
do
{
p=irandom(room_last)
}until(p!=room)
room_goto(p)
Смысл этих записей мы непременно рассмотрим в одном из следующих уроках.

Последняя тема, которую мы заденем будет манипулирование комнатами "на лету"

room_set_width(ind,w) - устанавливает ширину w для комнаты с индексом ind.
room_set_height(ind,h) - устанавливает высоту h для комнаты с индексом ind.
room_set_caption(ind,str) - устанавливает заголовок окна str для комнаты с индексом ind.

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

room_instance_add(ind,x,y,obj) - добавляет экземпляр объекта с индексом obj в точку с координатами (x,y) комнаты с индексом ind. Возвращает индекс создаваемого экземпляра (как и в instance_create, только instance_create создаёт объект в текущей комнате).
Давайте подумаем для чего может понадобиться эта функция? Если у вас есть несколько комнат, которые различаются одним или двумя объектами, то эта функция спасёт вас. Допустим такая ситуация:
Стартовая комната. В ней невидимый объект, который контролирует нажатие клавиш. Если нажали Q,то переходит в комнату, в которой другой невидимый объект пишет, что нажали Q-клавишу. Аналогично с клавишами W и E. Попробуем реализовать.

Прочитав внимательно, создадим необходимые ресурсы: 2 комнаты (стартовая и в которую переходим), 4 объекта (один в стартовой комнате и 3 для клавиш). В первом объекте (сразу поместите его в стартовую комнату) определяем 3 события: Key Press Q, Key Press W и Key Press E. Остальные три объекта назовём соответственно Qkey, Wkey и Ekey. У каждого в событии рисования поставим приблизительно следующее:
Код: (Qkey Draw)
draw_text(3, 3, "Вы нажали клавишу Q")//не забудьте включить русский текст
Код: (Wkey Draw)
draw_text(3, 3, "Вы нажали клавишу W")
Код: (Ekey Draw)
draw_text(3, 3, "Вы нажали клавишу E")
И теперь в первом объекте (назовём его main) пропишем:
Код: (main Key Press Q)
room_instance_add(room1, 0, 0, Qkey)
room_set_caption(room1, "Q key pressed!");
room_goto(room1)
Думаю сообразите что написать в событиях Key Press W и Key Press E  
ВНИМАНИЕ! Комната room1 должна быть изначально пуста.
Протестируйте получившийся пример. Думаю объяснил более-менее понятно.

ВНИМАНИЕ! Если бы в реальной игре стояла только такая задача, то решать бы её пришлось другим, более простым способом. В данном примере подразумевается, что объекты Qkey, Wkey и Ekey содержат в себе ещё километровые коды и исход игры зависит от того, какой объект поставить.

Думаю, на сегодня хватит.)

Задания.

Новички:
1) Создайте игру по описанию. В игре 2 комнаты и 2 объекта: один объект-контроллер (в первой комнате) и объект-переходник (во второй комнате). Если игрок нажмёт клавишу W, то предлагается ввести новую ширину окна и собственно ширина другой комнаты меняется на новую. Аналогично при нажатии клавиши h те же операции с высотой. Сделайте так, что при введении пользователем отрицательного числа или нуля, выскакивало сообщение, говорящее, что нельзя вводить числа такого типа. После ввода числа пусть игра переходит в следующую комнату. Во второй комнате если нажать Пробел, то игра переходит обратно в первую комнату (прописать у второго объекта).

Среднечки:
1) Создайте игру по описанию. Первая комната - меню (2 пункта: Новая игра и Выйти. Большее количество пунктов приветствуется). При нажатии "Новая игра" действие переносится в другую комнату, где есть 3 объекта (к примеру синий, зелёный и красный шарик) и игрок (управление на стрелках). Реализуйте примерно следующее: если игрок сталкивается с синим шариком, то переходим в следующую комнату, где ждёт синий враг; с зелёным - зелёный враг; с красным - красный враг. В заголовке пусть пишется цвет врага. Для всего этого используйте манипулирование "на лету". У врагов должно быть разное количество жизней (чтобы отличать). Они должны двигаться рандомно (менять своё направление). Реализовать битву (например при нажатии на пробел, игрок стреляет: пуля летит к врагу и наносит ему урон). При смерти врага выводить сообщение о победе и переходить в комнату меню.
Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
S_Kleer
GM Pro user
*

Репутация: 567
Offline Offline

Награды:
За лояльность! [+500 репутации]3 место в Дичайшем джеме #82000 сообщений!За постоянность! [50 дней на форуме]Настоящий игродел!2 место на HellRoom Jam #5, Контраст...
API: GameMaker Studio 2
Сообщений: 2734


« Ответ #1 : Август 28, 2011, 13:34:49 »

Жаль, что я не смогу выполнять задания (наверное).
Так как начнётся учёба, а там не знаю, будет у меня время или нет.  :(
Записан

Коты - Мирители
Михаил144
Участник
****

Репутация: 21
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Сообщений: 181

Помни где ты живешь - Цив-я Брато и Отцеубийства


WWW
« Ответ #2 : Август 28, 2011, 18:10:59 »

room_set_width(room0,w); - у меня не сработал!
а так интересно!
Спасибо!
« Последнее редактирование: Август 28, 2011, 18:19:43 от Hummer » Записан

Да пройдутся Святые Катары по земле своими огненными жезлами и возжгутся сердца миллионов огнем чистой Любви....
Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1325
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Сообщений: 5026



« Ответ #3 : Август 28, 2011, 18:15:24 »

room_set_width(room0,w); - у меня не сработал!
Не действует на текущую комнату, если не выполнить после этого room_restart();
Записан

Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« Ответ #4 : Август 28, 2011, 18:20:16 »

Ок. Слегка переделаю задание для новичков (сегодня же)

Добавлено: Август 28, 2011, 18:26:09
ВНИМАНИЕ! Изменил задание у новичков! Проверьте формулировку. Если что-то не понятно, пишите - перепишу.
Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
dimon13zak
Посетитель
**

Репутация: 9
Offline Offline

Пол: Мужской
API: 8.0 Pro
Деятельность: Учу GML, новичок
Сообщений: 48



WWW
« Ответ #5 : Август 28, 2011, 18:48:22 »

Цитировать
Заголовок комнаты содержится в переменной room_caprion (по умолчанию пустая строка).
room_caption, опечатался)
Записан

Hummer
scio me nihil scire
GM Pro user
*

Репутация: 335
Offline Offline

Пол: Мужской
Награды:
2000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+300 репутации]Знаток Game Maker!За помощь новичкам!
API: Game Maker 8.0 Pro
Деятельность: GML, С++, OpenGL, Java. Бывший Директор бывшей школы GML
Сообщений: 2573


« Ответ #6 : Август 28, 2011, 18:49:43 »

Упс. Спасибо, исправил.
Записан

Есть вещи, которые нельзя объяснить. Для всего остального есть Справка
Рандом-рандом-рандомище (с)

C++ & OpenGL
akimenko8095
Новичок
*

Репутация: -1
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 10


« Ответ #7 : Январь 17, 2018, 18:18:36 »

room_goto(irandom(room_last))

НЕ работает почему то
Записан
Slavik
GM Pro user
*

Репутация: 106
Offline Offline

Пол: Мужской
Награды:
За постоянность! [100 дней на форуме]За создание истории чата!
API: Unity 3D
Сообщений: 498



« Ответ #8 : Январь 17, 2018, 18:38:48 »

room_goto(irandom(room_last))

НЕ работает почему то
Вам бы скинуть весь код, который не работает. Экстрасенсов тут вроде нет.
Записан

Иногда, если есть настроение, пишу музло для игр, не дорого.
Писать сюда: https://vk.com/dmitry.ibragimov
Не особо жду.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.097 секунд. Запросов: 33.