Здравствуйте! Сегодня я расскажу Вам о том, как создать мультиязычное, текстовое меню с настройками, абсолютно без графики, чисто на коде. Итак поехали! Создаём объекты без спрайтов: o_main - сам объект, в котором будет наше дальнейшее меню. o_settings - здесь будут настройки языка и экрана. Создаём фон: fnt_russian
С объектами разобрались, теперь переходим к написанию кода. Открываем объект o_main и ему в Create пишем:
Code
menu = 'main' //переменная, которая будет служить переходом между меню. В самом начале она равна 'main' select = 1 /*Текущий выбор пункта меню. допустим пункты в меню идут в такой последовательности: New Game Load Game Quit Тогда значит, если select будет равняться двум, будет выбран второй пункт меню "Load Game". Думаю мою логику и принцип поняли. */ maxbtn = 5 //Переменная служит для того, что-бы в определённом меню задавать определённое кол-во пунктов меню, чтобы например, если select == 5, а пунктов меню всего 3, то указатель просто исчезнет с вида. menu_x = 250 //Положение меню по оси Х menu_y = 240 //Положение меню по оси У title_x = 250 //Положение названия меню по оси Х title_y = 210/ /Положение названия меню по оси У
//Далее создаём переменные, содержащие текст, который будет использоваться в меню text_new_game = 'New Game' //Пункт "Новая игра" text_load = 'Load' // Пункт "Загрузить" text_info = 'About' //Ну и так далее... text_quit = 'Quit' text_continue = 'Continue' text_main_menu = 'Main Menu' text_options = 'Options' text_language = 'Language' text_back = 'Back' text_screen = 'Resolution' text_pause = 'Pause'
Переменные объявили, теперь переходим в Step этого-же объекта.
Code
if keyboard_check_pressed(vk_up) {select -= 1} //Если нажата стрелка UP, то уменьшаем переменную выбора пунктов на 1 if keyboard_check_pressed(vk_down) {select += 1} //Если нажата стрелка DOWN, то увеличиваем переменную выбора пунктов на 1 if select > maxbtn {select = 1} //Тут делаем ограничение выбора пунктов, в зависимости от меню if select < 1 {select = maxbtn} if global.resolution > 2 {global.resolution = 1} //Тут делаем ограничение переменной настроек экрана if global.resolution < 1 {global.resolution = 2} if global.switch_language > 2 {global.switch_language = 1} //Тут делаем ограничение переменной смены языка if global.switch_language < 1 {global.switch_language = 2}
//Теперь переходим к созданию настройки переключения языка if global.switch_language == 1 { //Если переменная настр. языка равна 1, то переменным текста присваиваем англ. текст text_new_game = 'New Game' text_load = 'Load' text_info = 'About' text_quit = 'Quit' text_continue = 'Continue' text_main_menu = 'Main Menu' text_options = 'Options' if global.switch_language == 1 text_language = 'Language: English' text_back = 'Back' if global.resolution == 1 text_screen = 'Fullscreen: off' if global.resolution == 2 text_screen = 'Fullscreen: on' text_pause = 'Pause' } if global.switch_language == 2 {//Если переменная настр. языка равна 2, то переменным текста присваиваем рус. текст text_new_game = 'Новая игра' text_load = 'Загрузить' text_info = 'О игре' text_quit = 'Выход' text_continue = 'Продолжить' text_main_menu = 'Главное меню' text_options = 'Опции' if global.switch_language == 2 text_language = 'Язык: Русский' text_back = 'Назад' if global.resolution == 1 text_screen = 'Фуллскрин: выкл.' if global.resolution == 2 text_screen = 'Фуллскрин: вкл.' text_pause = 'Пауза' } //Параметры разрешения экрана rm = room_get_name(self) if global.resolution == 1 { //если переменная разр. экрана равна 1, то переводим игру в оконный режим window_set_fullscreen(0) } if global.resolution == 2 { window_set_fullscreen(1)//если переменная разр. экрана равна 2, то переводим игру в полноэкранный режим window_set_sizeable(1) }
if menu == 'options' {maxbtn = 3} //Тут для каждого меню устанавливаем кол-во пунктов if menu == 'menu' {maxbtn = 5} if menu == 'pause' {maxbtn = 2} if keyboard_check_pressed(vk_escape) { //Если нажата клавиша Enter и мы в игре, то объекты деактивируются и игра переходит в режим паузы if menu == 'game' { instance_deactivate_all(true) menu = 'pause' } }
if keyboard_check_pressed(vk_enter) { if menu == 'main' { if select == 1 {room_goto(level_1); menu = 'game'} if select == 2 {/*game_load('gamesave.inc')*/menu = 'options' select = 0} if select == 3 {menu = 'options'} if select == 4 {show_info()} if select == 5 {game_end()} } if menu == 'pause' { if select == 1 {instance_activate_all(); menu = 'game'} if select == 2 {menu = 'main'; maxbtn = 5; select = 0} } if menu == 'options' { if select == 1 {global.switch_language += 1} if select == 2 {global.resolution += 1} if select == 3 {menu = 'main'; maxbtn = 5; select = 0} } }
Потом создаём событие Draw и вставляем туда код:
Code
draw_set_font(fnt_russian) draw_text(100,100,""+string(menu)) if menu == 'main' { draw_text(title_x,title_y,""+string(text_main_menu)) draw_line(250,233,350,233) if select == 1 {draw_text(menu_x,menu_y,"> "+string(text_new_game)+"#"+string(text_load)+"#"+string(text_options)+"#"+string(text_info)+"#"+string(text_quit))} if select == 2 {draw_text(menu_x,menu_y,""+string(text_new_game)+"#> "+string(text_load)+"#"+string(text_options)+"#"+string(text_info)+"#"+string(text_quit))} if select == 3 {draw_text(menu_x,menu_y,""+string(text_new_game)+"#"+string(text_load)+"#> "+string(text_options)+"#"+string(text_info)+"#"+string(text_quit))} if select == 4 {draw_text(menu_x,menu_y,""+string(text_new_game)+"#"+string(text_load)+"#"+string(text_options)+"#> "+string(text_info)+"#"+string(text_quit))} if select == 5 {draw_text(menu_x,menu_y,""+string(text_new_game)+"#"+string(text_load)+"#"+string(text_options)+"#"+string(text_info)+"#> "+string(text_quit))} } if menu == 'options' { draw_text(title_x,title_y,""+string(text_options)) draw_line(250,233,350,233) if select == 1 {draw_text(menu_x,menu_y,"> "+string(text_language)+"#"+string(text_screen)+"##"+string(text_back))} if select == 2 {draw_text(menu_x,menu_y,""+string(text_language)+"#> "+string(text_screen)+"##"+string(text_back))} if select == 3 {draw_text(menu_x,menu_y,""+string(text_language)+"#"+string(text_screen)+"##> "+string(text_back))} } if menu == 'pause' { draw_text(title_x,title_y,""+string(text_pause)) draw_line(250,233,350,233) if select == 1 {draw_text(menu_x,menu_y,"> "+string(text_continue)+"#"+string(text_main_menu))} if select == 2 {draw_text(menu_x,menu_y,""+string(text_continue)+"#> "+string(text_main_menu))} }
Поздравляю! Вы создали текстовое меню! Пример будет завтра.
P.S:Я статью писал в почти сонном состоянии, когда мой организм уже засыпал. Причина: сутки без сна, 2 дня на рыбалке по жаре (Простите за оффтоп)
Завтра на свежую голову доработаю статью!
Перезарядка оружия.
Во всех шутерах можно перезаряжать оружие. А почему бы нам не сделать это в Game Maker? Этим мы и займёмся! Этот мини урок покажет вам создание перезарядки оружия.
Что нужно: -Пример TDS с такой системой оружия: максимальное кол-во патронов, которые можно нести, переменная для кол-ва патронов обойме и автоматическая перезарядка при 0 патронов в обойме.
Предположим, что есть такие переменные:
Code
ammo_size = 120 //патронов в запасе ammo_clip = 30 //патронов в обойме
Допустим вы выстреляли 12 патронов и хотите перезарядить оружие. Суть такова: создаёте переменную, которая будет содержать кол-во оставшихся патронов в обойме, потом при нажатии на клавишу перезарядки прибавляете к переменной обоймы выстрелянные пули, а от переменной максимального кол-ва патронов вычитаете.
Code
if keyboard_check_pressed(ord('R')) { //клавиша, нажатием на которую будет осуществляться перезарядка if ammo_clip < 30 && ammo_size > 0 { //если обойма неполная и есть патроны в запасе, то rel = 30-ammo_clip //вычитаем из обоймы кол-во оставшихся патронов и записываем значение в переменную rel ammo_clip += rel //прибавляем к обойме выстрелянное кол-во пуль ammo_size -= rel //отнимаем из запасных патронов выстрелянные пули } }
Вот и всё, ничего сложного! Теперь в вашей игре можно перезаряжать оружие Всем спасибо за внимание!
Создание простейшего инвентаря. Часть 1.
Всем привет! Сегодня мы с вами разберём простейшую реализацию инвентаря Что собой представляет инвентарь? Это
ячейки в каждой из которых содержится информация о подобранном вами предмете. Что происходит, когда пользователь
подбирает какой либо предмет? Проверяются все ячейки инвентаря, когда найденна свободная, то записываем в неё
информацию предмета, который подобрали. Не будем терять время и перейдём к делу! P.S: Кто не знаком с циклами и массивами, советую дальше не читать. Для начала создадим все необходимые нам спрайты и объекты.
<Спрайты> s_fruit - спрайт предмета, который мы будем подбирать s_non - спрайт ячейки. Просто создайте пустой прозрачный спрайт размером в 32х32
<Объекты> inv - объект, в котором создаются ячейки инвентаря o_case - ячейка. Создаются в объекте inv o_fruit - предмет, который мы будем подбирать
Спрайты и объекты созданы, теперь можно переходить к написанию кода. Открываем объект inv, создаём событие Create и пишем код:
Давайте разберём. Первая строка отвечает за кол-во ячеек по горизонтали, вторая - по вертикали. В итоге у нас должно получиться 9
ячеек. Третья и четвёртая строки инициализируют двойной цикл. Пятая строка создаёт объекты ячеек по горизонтали и
вертикали и записывает индекс каждой ячейки в массив. Думаю поняли. Всё, с этим объектом завершили! Переходим теперь к объекту o_fruit. Создаём события нажатой кнопки мыши (не глобальной) и пишем такой код:
Здесь код отвечает за подбор предмета и помещения его в первую свободную ячейку инвентаря. Работает это так: если у объекта ячейки спрайт == s_non, значит она свободна, иначе занята. Запускаем цикл, который проверяет все ячейки и создаём условие, которое проверяет все ячейки на наличие предмета,
если его нет, то найденной пустой ячейке присваиваем спрайт объекта, на который нажали, уничтожаем этот объект и
выходим из цикла. С этим разобрались.
Далее идём в o_case и создаём два события. -Нажатая кнопка мыши -Draw
В событии нажатия кнопки мыши пишем ну очень сложный код:
Code
if sprite_index == o_fruit //Тут проверяем спрайт объекта, который находится в данной ячейке {o_player.hp += 10 //Если условие истина, то прибавляем игроку 10 единиц здоровья и sprite_index = s_non;} //Опустошаем ячейку, на которую нажали
И последнее, что мы с вами должны сделать, это отрисовать ячейку, т.к. она невидима из-за спрайта. Открываем ранее созданное событиие Draw и пишем такие строки:
Code
draw_set_alpha(0.3); //Устанавливаем прозрачность на 0.3 draw_rectangle(x, y, x+32, y+32, 0); //Рисуем вокруг спрайта заполненный квадрат draw_set_alpha(1); //Устанавливаем прозрачность на 1 draw_rectangle(x, y, x+32, y+32, 1); //И поверх рисуем не заполненный квадрат draw_sprite_ext(sprite_index, image_index, x, y, 1, 1, image_angle, c_white, 1); //И наконец отрисовываем сам спрайт ячейки
Теперь ячейки будут отображаться нормально
С вами был vasyan555, спасибо за прочтение статьи, до новых встреч! :)
Создание простейшего инвентаря. Часть 2.
Всем снова здравствуйте! С вами vasyan555. В этой части урока мы с вами продолжим создание инвентаря. В первой части мы познакомились с основами инвентаря и простейшей его реализацией. Итак, чем мы займёмся.. Проведём оптимизацию инвентаря и реализуем складывание вещей в стопку. Это всё можно будет сделать всего-лишь одним объектом, ну и конечно же предметом(ами), нажимая на которые, они будут добавляться в инвентарь. Основы создания надеюсь Вы поняли, поэтому расскажу коротко. Как обычно создаём новый проект. Создаём наш старый, знакомый объект inv, и в Create пишем такой вот код:
Code
w = 3; h = 3; for(i = 0; i < w; i += 1) { for(j = 0; j < h; j += 1) { Spr[i,j] = -1; Amount[i,j] = 1; } }
Получив знания с первого урока, я думаю Вы знаете, за что отвечает каждая строка данного кода. Но как мы видим, код слегка дополнен двумя строками. Давайте их разберём.
Spr[i,j] = -1; Эта строка отвечает за спрайт объекта, лежащего в конкретной ячейке. Циклом и массивом мы каждой ячейке присваиваем "нулевой" спрайт, тоесть все ячейки пусты.
Amount[i,j] = 1; Здесь строка отвечает за количество объектов в ячейках. Каждой из всех ячеек мы присваиваем кол-во 1 Так, с этим разобрались. Теперь нам нужно сделать отрисовку спрайтов в ячейках. Создаём событие Draw и пишем код:
Здесь всё устроено немного иначе. Сначала мы инициализируем цикл, проверяющий все ячейки. Далее отрисовываем ячейки. Думаю об этом принципе рисования Вы узнали из первого урока, поэтому зацикливать внимание я на этом не буду. Потом идёт отрисовка спрайта объекта в занятых ячейках. И последнее, что мы проверяем, это отрисовку количества объектов в определённой ячейке. В данном случае рисовать количество мы будем только в том случае, если в ячейке находится больше одного объекта.
Основа нашего с Вами инвентаря готова. Всё, что нам осталось, осуществить подбор и складывание предметов в инвентарь. Создаём спрайты s_item1,s_item2, s_item3 и объекты и назначаете им соответствующие спрайты. Для того, чтобы не пришлось писать много кода в каждый объект, мы напишем скрипт. Создаём скрипт и назовём его add_item и в нём пишем следующий код:
Всё также запускаем цикл, который проверяет все ячейки инвентаря. Потом проверяем наличие объекта в ячейках, пока не находим пустую, и в переменную найденной ячейки записываем спрайт подобранного объекта, уничтожаем его и выходим из цикла (В данной ситуации это необходимо!). Иначе, если при проверке был обнаружен объект, который мы хотим подобрать, то тогда увеличиваем количество предметов в ячейке с найденным предметов, уничтожаем его и также выходим из цикла. Всё, наш скрипт написан. Теперь осталось его, как-бы так сказать, "привести в действие". В каждый созданный объект (o_item1, o_item2... их может быть любое кол-во, на ваше усмотрение) в событие Left Pressed пишем инициализацию нашего написанного скрипта:
Code
add_item();
Готово. Теперь создаём комнату, размещаем объект inv в левый верхний угол комнаты и произвольно размещаем предметы. Тестируем на работоспособность и радуемся тому, что научились создавать крутой, но в то же время простой для понимания инвентарь!
В этом уроке: 1. Ходьба 2. Поворот за мышью 3. Стрельба
Итак, приступим! Для начала определимся, что нам нужно: игрок, умеющий ходить, поворачиваться и стрелять. Создаём спрайт игрока, пули и стены: s_player s_bullet s_wall P.S: спрайты должны быть повёрнутыми вправо!
Теперь создадим 3 соответствующих объекта и назначим им только, что созданные спрайты: o_player o_bullet o_wall
Далее открываем объект o_player, и в Step пишем код:
Code
image_angle = point_direction(x,y,mouse_x,mouse_y) if keyboard_check(ord('W')) {y -= 5} if keyboard_check(ord('S')) {y += 5} if keyboard_check(ord('A')) {x -= 5} if keyboard_check(ord('D')) {x += 5}
Первая строка определяет направление от середины игрока, до курсора и присваивает значение к углу поворота спрайта. Вторая строка проверяет нажатость клавиши W, и если условие истина, то смещаем игрока вверх на 5 пикселей. Аналогично с другими проверками, только смещения разные, в зависимости от нажатой клавиши. P.S: Y- (вверх), Y+ (вниз), X- (влево), X+ (вправо)
Теперь ваш персонаж умеет ходить и поворачиваться в сторону мыши! Можете проверить, для этого создаёте комнату, поместите туда объект игрока и нажмите на зелёный треугольник для запуска. Работает! Хорошо, теперь давайте создадим препятствия, через которые, игрок не мог бы проходить. Откройте раннее созданный объект стены - o_wall. Поставьте ему галочку в Solid. Этим вы делаете его "твёрдым". Это нужно для столкновений. Теперь в объекте игрока создайте событие столкновения со стеной и впишите код:
Code
x = xprevious y = yprevious
Что же дают эти 2 команды? Они возвращают объект на предыдущую позицию, благодаря чему не дают ему смещаться дальше. Также расставьте стены по комнате и протестируйте на работоспособность
Теперь приступим к стрельбе. Нам нужно, чтобы пуля летела по направлению мыши, а также поворачивалась по направлению. Для этого, в Create у пули прописываем код:
Code
move_towards_point(mouse_x,mouse_y,10) image_angle = direction
mouse_x - координата мыши по оси X mouse_y - координата мыши по оси Y 10 - скорость полёта пули Вторая строка поворачивает спрайт в сторону полёта.
С пулей разобрались. Теперь нужно осуществить стрельбу. Открываем объект игрока, создаём событие "Global left pressed", и пишем код:
Code
instance_create(x,y,o_bullet) //создаёт объект пули в координатах игрока
Протестируйте игру!
Как видите, пули пролетают сквозь стен, это можно легко исправить!
В объекте пули создайте событие столкновения со стеной и впишите такой код:
Code
instance_destroy() //уничтожаем пулю при столкновении с объектом стены
Вот, пожалуй всё. На этом урок окончен, спасибо за внимание!
Ходьба по неровной поверхности в платформере.
Всем привет! Сегодня я Вам расскажу о том, как реализовать ходьбу по неровной поверхности в плаформере. Для начала давайте рассмотрим способ данной реализации. Итак. Для работы моего способа у вас ходьба в платформере должна быть осуществлена следующим образом: при движении спрайт игрока должен отражаться соответственно направлениям, т.е. если игрок движется влево, то image_xscale = -1;, иначе image_xscale = 1;. Каким же образом мы будем перемещать игрока вдоль неровной поверхности? К нам на помощь приходят циклы. Циклом мы проверяем кажду свободную позицию впереди игрока и чуть выше, и если эта эта позиция свободна, то перемещаем туда игрока. Давайте теперь рассмотрим код. (Данный код помещать в Step)
Code
var Dir, D, xn, yn; if image_xscale == -1 {Dir = 180; D = -10} else {Dir = 0; D = 10}
if place_meeting(x+D, y, o_solid) {
for(i = 0; i < 135; i += 2) { xn = x + lengthdir_x(speed, Dir + i); yn = y + lengthdir_y(speed, Dir + i); if place_free(xn, yn) {x = xn; y = yn; exit;} } }
В начале мы объявляем временные переменные, хранящие направление игрока и позицию впереди игрока.
Dir - напрвление D - отражение спрайта (сторона, в которую смотрит игрок) xn, yn - переменные, хранящие свободную позицию перед игроком.
Далее изменяем эти переменные. Если спрайт отражён влево, т.е. игрок смотрит влево, то изменяем Dir на 180 (180 - направление влево), D - присваиваем значение -10 (-10 - позиция левее). Аналогично с другим. Далее ставим проверку на столкновение с объектом. x+D - из переменной D считывается текущее направление игрока. (Лучше всего для всех твёрдых объектов создать один родительский, и проверять столкновение только с ним, потому, что проверять столкновения со всеми объектами - очень трудоёмкий процесс) И если столкновение произошло, то запускаем цикл, проверяющий все свободные позиции относительно игрока, и если эта позиция найдена, то в переменные xn, yn записываем найденную свободную позицию и ставим проверку на эту позицию, и если она свободна, то перемещаем туда игрока и выходим из цикла.
На этом урок окончен. Спасибо за внимание! До новых встреч!
Создание системы частиц.
Приветствую всех пользователей портала! В ходе разработки моего проекта, я остановился на реализации эффектов. Знаю, что существует весьма хорошая система частиц, в которой можно создавать практически любые эффекты. Но создание этой системы занимает немалое время в плане написания кода, поэтому я решил, так сказать, заменить/упростить эту систему на более удобную. Ну чтож, давайте начнём разработку нашей с Вами системы! Оперировать мы будем всего-лишь с одним объектом и скриптом, создающий партиклы. Создаём объект o_eff, добавляем ему 2 события - Step и Draw. В Step пишем такой код:
Code
image_alpha -= life; //уменьшаем прозрачность на значение из переменной life if image_alpha <= 0 {instance_destroy();} //удаляем объект, когда он станет невидимым if radius_min < radius_max {radius_min += radius_up;} //увеличиваем размер партикла до максимального заданного
значения на значение переменной radius_up Как видите, код отвечает за жизнь партикла и его размеры. Теперь откройте событие Draw и отрисуйте партикл.
Code
draw_set_alpha(alpha); //устанавливаем прозрачность из переменной alpha draw_set_color(make_color_rgb(red, green, blue)); //устанавливаем цвет партиклов из переменных draw_circle(x, y, radius_min, 0); //и рисуем сам партикл с радиусом radius_min
Как вы уже поняли, код отвечает за отрисовку партиклов, прозрачность, цвет и радиус. Объект/генератор частиц создан, но в нём полно неизвестных нам переменных, задавать значения которых мы будем скриптом. Создайте скрипт с именем make_particle и впишите туда следующий код:
Code
repeat (argument14) //арг14 - кол-во частиц, создаваемых за раз { with instance_create(argument0, argument1, o_eff) //применяет действия к созданому объекту { speed = argument2; //скорость полёта direction = argument3; //направление life = argument4; //жизни alpha = argument5; //прозрачность clr = argument6; //один цвет для всех. Например (134,134,134) или (150,150,150). if argument13 == true {red = clr; green = clr; blue = clr;} //если параметр общего цвета истинна else //то присваиваем всем партиклам один заданный цвет, иначе {red = argument7; green = argument8; blue = argument9;} //присваиваем произвольный radius_max = argument11; //максимальный размер radius_min = argument10; //начальный размер radius_up = argument12; //скорость увеличения размера до максимального } }
Вот мы и присвоили всем переменным объекта o_eff значения. Всё, система готова! Теперь чтобы создать партиклы, используйте функцию
Создание <Combobox> Всем снова здравствуйте! В очередной раз вы узнаете, как создавать Combobox. Что это такое, объяснять не буду. Итак, времени у меня мало, поэтому сразу дам весь код. Когда буду свободен - оформлю как следует.
Объект o_combobox_papa
Объект o_combobox #Parent = o_combobox_papa <Create>
if mouse_x > x && mouse_x < x+100 && mouse_y > y+h && mouse_y < y+h+(h*Tabs) { if Show { Color_tab = c_dkgray; mY = (mouse_y-h - y+h) div h; if mouse_check_button_pressed(mb_left) { Sel = t[mY]; Show = false; } } }
Ребят, извините, что не пишу статьи, просто времени в обрез мало. Две последующие статьи будут посвящены созданию AI для TDS, и созданию простенького инвентаря.
Добавлено (05.07.2011, 20:31) --------------------------------------------- В скором времени напишу
Добавлено (05.07.2011, 21:34) --------------------------------------------- Написал статью по созданию самого простого инвентаря! Новичкам в самый раз!