Дата: Воскресенье, 25.03.2012, 23:32 | Сообщение # 1
Сообщений: [1514]
Решил написать мини учебник по созданию 3D игр на Game Maker.
Глава I. Включение 3D режима Итак, прежде чем начать расставлять объекты и подгружать в них 3D модели, необходимо включить режим 3D. Ведь вы не прочтете текст, написанный на скомканом листке бумаги, не выровняв его. Представим, что 3D режим - это тот самый скомканый листок, на котором написаны все 3D объекты, 3D модели и прочее, что нужно рисовать в 3D. Для того, чтобы разровнять наш листок, то есть включить 3D режим, создадим объект objCamera. В событии Create (создание) запишем код:
Quote
global.camsin = sin(direction*pi/180); //Эту строку можно просто запомнить. global.camcos = cos(direction*pi/180); //И эту тоже
d3d_start() //Включаем сам 3D режим. d3d_set_perspective(true) //Включаем перспективу d3d_set_lighting(false) //Выключаем свет. d3d_set_culling(false) //Выключаем НЕотрисовку сторон объектов, которые мы не видим (сложно объяснить, поэтому чтобы понять лучше поэксперементируйте)
texture_set_interpolation(false) //Выключаем сглаженность текстур (можете включить, просто я предпочитаю выключать сглаженность) z = 16 //Создаем новую координату Z (для простых игр без прыжков, поднятий по лестницам и тому подобным это можно не делать :D)
3D режим мы включили, теперь нам необходимо сделать прорисовку 3D объектов (чтение, уже выровненного листка). Для этого, в событие Draw (рисование) напишем код:
Quote
d3d_set_projection(x, y, z, x+global.camcos, y-global.camsin, z, 0, 0, 1) //Эту строку можно также, просто запомнить. Ее изменение вам понадобится ОЧЕНЬ редко, если вообще понадобится
Вот и все. Теперь осталось только создать фон, с названием texture1, загрузить в него любую текстуру и можете смело запускать ваше творение. Позже выложу исходник к этой главе.
Глава 2 - Ходим В этом уроке, я расскажу о том, как можно «заставить» камеру передвигаться по нашему миру. Вернее, как заставить мир передвигаться вокруг нашей камеры, ведь в 3D это так и происходит. Работать мы будем с тем исходником, с которым работали в предыдущем уроке. Откроем его. Откроем наш объект objCamera и добавим в него событие Step (шаг). Введем следующий код:
Quote
if(keyboard_check(ord("W"))) //Если нажата клавиша W { speed = 3 //Идем вперед } if(keyboard_check(ord("S"))) //Если нажата клавиша S { speed = -3 //Идем назад }
//Далее начется "самый пугающий код", его можно просто запомнить if(keyboard_check(ord("A"))) //Если нажали A { var xn,yn; ///Инициализируем новые переменные, действующие только в этом скрипте. xn = x - sin(direction*pi/180); //Вычисляем где у нас лево yn = y - cos(direction*pi/180); //Вычисляем где у нас лево if not place_meeting(xn,yn,sblock) //Если ничего не мешает идти (sblock заменить на название родительского объекта всех ваших твердых объектов) { x = xn; y = yn; } //Идем влево } if(keyboard_check(ord("D"))) //Если нажали D { var xn,yn; //Инициализируем новые переменные, действующие только в этом скрипте. xn = x + sin(direction*pi/180); //Вычисляем где у нас право yn = y + cos(direction*pi/180); //Вычисляем где у нас право if not place_meeting(xn,yn,sblock) //Если ничего не мешает идти (sblock заменить на название родительского объекта всех ваших твердых объектов) { x = xn; y = yn; } //Идем вправо } //Конец пугающего кода if(keyboard_check(vk_nokey)) //Если ниче не нажимали { speed = 0 //Не двигаемся } global.camsin = sin(direction*pi/180); //Обновляем значение для global.camsin (ОБЯЗАТЕЛЬНО!!!) global.camcos = cos(direction*pi/180); //Обновляем значение для global.camcos (ОБЯЗАТЕЛЬНО!!!)
Теперь, добавим событие End Step и запишем в него следующее:
Quote
//Данный код можно не запоминать а просто копировать //Он нужен для создания свободного обзора мышкой . xx = (display_mouse_get_x()-(display_get_width()/2))/16 //16 – скорость поворота по X, можно экспериментировать yy = (display_mouse_get_y()-(display_get_height()/2))/16 //16 – скорость поворота по Y, тоже можно экспериментировать
objCamera.direction -= xx objCamera.zdir -= yy/32 //С числом 32 можно экспериментировать
Hagrael, Насчет чего-то посерьезнее Game Maker'a толком не думал пока, ибо он меня пока устраивает. Знаю только, что буду переходить на Unity или NeoAxis.