Статья"Создание 3D</b><b>FPS" В данной статье я познакомлю вас с основами создания 3D FPS в популярном конструкторе игр Game Maker. Создадим новый проект. Откроем Global Game Settings -> Ошибки и поставим галочку на «Присваивать неинициализированным переменным значение 0». Создадим спрайт spr_hero, зальём его белым цветом и поставим начало координат «По центру». Создадим обьект obj_hero, это и будет наш ГГ. Присвоим ему spr_hero. В событии Create напишем:
Цитата
d3d_start() // Включаем 3D режим depth=1000 // Обьект игрока должен иметь наибольшую глубину, иначе будут косяки с камерой zdir=0 // Переменная для движения камеры по оси z
Создаём событие Step и пишем туда код:
Цитата
direction-=((display_mouse_get_x()-display_get_width()/2)/5) // Поворот камеры по direction zdir+=((display_mouse_get_y()-display_get_height()/2)/5) // Поворот камеры по zdir // /5 – это чувствительность камеры, чем больше делитель тем меньше чувствительность if (zdir < -75) {zdir = -75} else if (zdir > 75) {zdir = 75} // Ограничение поворота камеры вверх и вниз display_mouse_set(display_get_width()/2,display_get_height()/2) // Ставим курсор на центр экрана
Создаём событие Draw и пишем туда код:
Цитата
d3d_set_projection(x,y,20,x+lengthdir_x(10,direction),y+lengthdir_y(10,direction),20+lengthdir_y(10,zdir),0,0,1) // Это сама камера, где 20 – её высота.
Итак, мы создали игрока, но он пока что не может ходить, исправим это. Во многих FPS по нажатию «SHIFT» персонаж ускоряется, для этого откроем событие Step и дополним код строкой:
ifkeyboard_check(ord('W')) { if place_free(x+lengthdir_x(spd,direction),y) {x+=lengthdir_x(spd,direction)} if place_free(x,y+lengthdir_y(spd,direction)) {y+=lengthdir_y(spd,direction)} } if keyboard_check(ord('S')) { if place_free(x-lengthdir_x(spd,direction),y) {x-=lengthdir_x(spd,direction)} if place_free(x,y-lengthdir_y(spd,direction)) {y-=lengthdir_y(spd,direction)} } if keyboard_check(ord('A')) { if place_free(x+lengthdir_x(spd-0.1,direction+90),y) {x+=lengthdir_x(spd-0.1,direction+90)} if place_free(x,y+lengthdir_y(spd-0.1,direction+90)) {y+=lengthdir_y(spd-0.1,direction+90)} } if keyboard_check(ord('D')) { if place_free(x+lengthdir_x(spd-0.1,direction-90),y) {x+=lengthdir_x(spd-0.1,direction-90)} if place_free(x,y+lengthdir_y(spd-0.1,direction-90)) {y+=lengthdir_y(spd-0.1,direction-90)} }
Итак, мы создали основу ГГ. Создадим новую комнату, поставим ей room_speed=60, для большей плавности камеры. Теперь приступим к созданию пола. Создадим спрайт spr_floor и загрузим для него любую текстуру. Создадим обьект obj_floor. В Событии Create ему пропишем:
Цитата
texture=sprite_get_texture(spr_floor,0) xtex=16 // Ширина вашей текстуры, в данном случае 16 ytex=16 // Высота вашей текстуры
Создадим событие Draw и пропишем:
Цитата
draw_set_color(c_white) // Установим цвет рисования d3d_draw_floor(0,0,0,room_width,room_height,0,texture,room_width/xtex,room_height/ytex) // Рисуем пол во всю комнату
Если вы хотите нарисовать потолок, то дополним код строкой:
Цитата
d3d_draw_floor(0,0,32,room_width,room_height,32,texture,room_width/xtex,room_height/ytex) // Где 32 – это высота потолка
Можем запустить игру и побегать по карте
Добавим стенки. Для этого создадим спрайт любого цвета размером 16x16 и назовём его obj_wall. Создадим спрайт tex_wall и загрузим ему текстуру стены. Создадим обьект obj_wall и присвоем ему этот спрайт. Поставим обьекту галочку на «твёрдость». В событии Create напишем:
Цитата
texture=sprite_get_texture(tex_wall,0)
Добавим событие Draw с кодом:
Цитата
d3d_draw_block(x,y,32,x+16,y+16,0, texture,1,1) // Где 32 – высота стены. Мы могли бынаписать сначала 0, а потом 32, но тогда бы текстура перевернулась.
Теперь добавим стрельбу! Создадим спрайт spr_bullet размером 4x4. Создадим обьект obj_bullet и присвоим ему данный спрайт. В Create напишем:
Цитата
direction=obj_hero.direction zdir=obj_hero.zdir z=20 speed=5 // От этого зависит скорость пули
Добавим событие «Вне границ комнаты» и напишем код:
Цитата
Instance_destroy()
В событии Step:
Цитата
z+=lengthdir_y(6,zdir)
Пулька готова, можете убрать ей видимость. Откроем obj_hero и пропишем код:
Цитата
fire=1 // То есть мы можем стрелять
Создадим событие «Глобальная левая кнопка мыши» с кодом:
Цитата
If(fire=1) {Instance_create(x,y,obj_bullet)} // Если можем стрелять, то создаём пульки fire=0 // Мы не можем стрелять некоторое время alarm[0]=3 // Чем меньше значение, тем чаще стрельба
Итак, в данном уроке мы научились создавать игрока, камеру, пол, стенки и стрельбу В следующем уроке (если он выйдет) я научу вас создавать врагов, делать ограничение на кол-во пуль, менять оружие, делать скусферы и скубоксы. Это моя первая статья, не кидайте сильно тапками XD
Сообщение отредактировал: SKORPION98 - Суббота, 23.03.2013, 20:11
Где видим: d3d_draw_floor - вызов метода отрисовки плоскости в пространстве (x1,y1,z1,x2,y2,z2,id,scalx,scaly) x1,y1 - начальные значения отрисовки нашей плоскости, а так как это "небо", то отрисовка будет из начала координат. z1 - высота первой вершины плоскости. x2,y2 - конечная точка отрисовки плоскости. z2 - высота второй вершины плоскости. id - название текстуры, при использование back'а будет - background_get_textures(id), при использовании спрайта будет - sprite_get_textures(id,номер слоя). scalx,scaly - повторение текстуры или же, кол-во полигонов на плоскости (изменяйте значение, что бы понять для чего это).