пятница, 9 ноября 2012 г.

Продолжаем создавать 3D шутер.



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

Создание атмосферы в игре.
Невзрачный фон и отсутствие пола портит нам всю игру. Давайте исправим это. Я предлагаю скачать текстурный пак на нашем сайте, которым мы будем пользоваться: Скачать
Работаем с полом. Нам для этого нужна texture2. Создадим новый объект - inf_room. Для него создадим событие Draw. Введем скрипт:

d3d_draw_floor(0,0,0,room_width,room_height,0,background_get_texture(pol),24,24);

Это скрипт прорисовки пола. Для него мы используем текстуру pol. Я ее выделил. Тем, кто знает английский несложно догадаться, что пол развернется на всю комнату. Часть кода отвечающего за размеры пола я тоже подчеркнул. Объект создан, но текстуры пола нет. Создаем фон(Backgrounds) с названием pol и загрузим в него texture2. Скинем в комнату объект inf_room. Круто, под ногами есть пол)))


Но серое небо невзрачно... Поэтому меняем цвет неба на голубой. Для этого заходим в настройки комнаты во вкладку Фон и меняем цвет на небесный:


Теперь атмосфера нормальная.


Нормальное передвижение.
Стрелки которые я посоветовал в предыдущем уроке оказались немного отсталым вариантом. Приношу свои извинения. Поэтому почти что полностью меняем систему передвижения. Создадим событие press <Up> и release <Up> для объекта camera. В событие press <Up> вводим скрипт:

speed:=4;

А в событие release <Up> вводим другой скрипт:

speed:=0;

В результате этого скрипта при нажатии на кнопку <вверх> игрок изменит скорость на 4 и пойдет вперед. А если отпустить кнопку, то скорость будет равна 0 и игрок будет стоять на месте.


Препятствия.
А вот и самое интересное! ))). Начнем с того, что каждое препятствие большинство игроделов в Game Maker создают в виде куба. 
По сути возможности Game Maker ничем не отстают например от Anim8or или 3D Max. Поэтому продвинутые пользователи в Game Maker могут создать при помощи точек модельку человека, ничем не отключающеюся например от моделек в Counter Strike. Но не об этом сейчас. При помощи texture3 мы сейчас создадим небольшой куб.

Создаем новый фон - toxic. В него грузим texture3. Теперь создадим объект obj_toxic. Создадим для него событие Draw и введем скрипт прорисовки куба:

d3d_draw_block(x-8,y-8,0,x+8,y+8,12,background_get_texture(toxic),1,1); 

Скрипт очень прост. Предлагаю вам позже поиграться с ним и разобрать его свойства. Потому, что значения его параметров мне придется объяснять 3 часа, а на практике проверить значения самому - займет минуты 3.
Но бочка какая-то нетвердая. Поэтому поставим галочку на Твердый:


А так же создадим какой-нибудь условный спрайт для объекта. Например зеленый кружок.

Поскольку препятствий в игре много, то прописывать столкновение объекта camera с каждым из них будет мучительно. Поэтому создадим объект wall_parent. Добавим событие для camera - Столкновение с wall_parent. И введем скрипт: 

x=xprevious; 
y=yprevious; 

Теперь поставим "родителя" для объекта obj_toxic:


Скинем в комнату объект obj_toxic и вот! Мы можем теперь с ним столкнутся:


Нормально) Теперь нарисуем стены. Для них создадим sprite1() и sprite2(). Сделайте белый фон этих спрайтов прозрачным. Теперь создадим объект wall_hor. Сделайте его твердым. Поставьте родителя - wall_parent. Создайте событие Draw и введите скрипт:


d3d_draw_block(x-16,y-2,0,x+16,y+2,64,background_get_texture(sten),1,1); 


Создайте объект wall_vert и поставьте для него такие же свойства. Только в событие Draw измените скрипт на:


d3d_draw_block(x-2,y-16,0,x+2,y+16,64,background_get_texture(sten),1,1); 


Скрипт почти такой же, но он создает другой по размеру куб.
Кстати, совсем забыл. Создайте фон sten размерами 64x64 и загрузите в него texture1. Теперь "облепите" комнату объектами wall_vert и wall_hor как на рисунке:


Ну вот и все! Можете спокойно запускать игрушку и путешествовать по 3D миру! Не пропустите следующий урок!

2 комментария:

  1. ERROR in
    action number 1
    of Draw Event
    for object inf_room:

    Trying to get texture from non-existing background.
    at gml_Object_inf_room_DrawEvent_1 (line 1) - d3d_draw_floor(0,0,0,room_width,room_height,0,background_get_texture(pol),24,24);

    ОтветитьУдалить