Готовая основа по 3D.
Внутри всё описано комментариями ,если что не ясно пишем в эту тему..
Switch (Объект ){
Cam: это игрок, в нём создается проекция 3D мира.
Cube: это стенка (игрок с нею сталкиваеться), также из него можно сделать любую другую модель
в событии Draw заменяем d3d_draw_block(x1,y1,z2,x2,y2,z1,tex,1,1) x1,y1,z2,x2 угловые координаты куба z1,z2 нижняя и верхняя высота куба , tex ранее загруженная текстура в событии Create tex = sprite_get_texture(sCube,0);
obj_block_par: родительский объект для объектов с которыми игрок должен сталкиваться
position: рисует позицию игрока и прицел(его надо ставить в последнюю очередь для того чтобы не получилось вот такой ошибки).
Готовая основа 3D
}
объект Cam :
В событии Create:
//Установка позиции курсора по серидине вида
window_mouse_set(view_wview[0]/2,view_hview[0]/2);
//стартуем 3D
d3d_start();
d3d_set_culling(0);
d3d_set_hidden(1);
d3d_set_lighting(0);
d3d_set_perspective(1);
//Направления просмотра
y_angle = 0;
z_angle = 0;
//Чувствительность мыши
sens = 0.3;
//Скольжение игрока
friction = 0.5;
//Высота на которой находиться игрок
z = 0;
//Высота камеры откуда игрок смотрит
z_cam = z+20;
//Высота нижней точки (тоесть до первого препятсвия)
z_base = 0;
//Скорость по Z величине (для прыжков и гравитации)
zspeed = 0;
//Сама гравитация
zgravity = 0.2;
//Высота игрока
zheight = 24;
//Клавиши движения
key_up = ord('W');
key_down = ord('S');
key_left = ord('A');
key_right = ord('D');
key_jump = vk_space;
В событии Step:
Скрываем курсор мыши
далее пишем :
//устанавливаем курсор посредине
mouse_set()
zspeed -= zgravity;
z += zspeed;
//Проверяем отсутвие родительского объекта obj_block_par в позиции игрока (этот объект специально для тех объектов
//с какими игрок должен сталкиваться
//P.S. В этих объектах надо назначить его родительским)
if !instance_place(x,y,obj_block_par) z_base = 0;
if z < z_base
{
z = z_base;
zspeed = 0;
}
//Передвижение игрока
if keyboard_check(key_up)
{
hspeed += lengthdir_x(1,z_angle);
vspeed += lengthdir_y(1,z_angle);
}
if keyboard_check(key_down)
{
hspeed += lengthdir_x(1,z_angle+180);
vspeed += lengthdir_y(1,z_angle+180);
}
if keyboard_check(key_left)
{
hspeed += lengthdir_x(1,z_angle+90);
vspeed += lengthdir_y(1,z_angle+90);
}
if keyboard_check(key_right)
{
hspeed += lengthdir_x(1,z_angle+270);
vspeed += lengthdir_y(1,z_angle+270);
}
speed = min(speed,2);
if keyboard_check(key_jump)
{
if z = z_base
zspeed = 3;
}
//поварачивание камеры
y_angle = max(min(y_angle,80),-80);
z_cam = z+20;
В событии Begin Step :
//Запоминаем прежнию позицию игрока по Z координате
zprevious = z;
В событии столкновения с объектом Obj_block_par :
if z < other.z1 && z+zheight > other.z2 && x>other.x && x<other.x+other.x2 && y>other.y && y<other.y+other.y2
{
x = xprevious;
y = yprevious;
if (abs(hspeed) >= abs(vspeed) && not place_meeting(x+hspeed,y,obj_block_par))
{ x += hspeed; exit;}
if (abs(vspeed) >= abs(hspeed) && not place_meeting(x,y+vspeed,obj_block_par))
{ y += vspeed; exit;}
speed = 0;
}
if z>other.z1 {
with(other)
{
c=collision_line(x,y,Cam.x,Cam.y,obj_block_par,1,1)
if c<0 Cam.z_base=z1 else
if c.z1>z1
Cam.z_base=c.z1
}
}
if(z+zheight<=other.z2){//Если игрок находится под блоком
if(z+zheight>other.z2-4){//Если игрок возле дна блока
zspeed=0;//Останавливаем скорость игрока
z=other.z2-4-zheight;//Перемещаем игрока чуть ниже дна блока чтобы игрок не застрял в блоке
}
}
В событии Draw пишем вот это(ниже будет описан этот скрипт , так как стандартно этой команды нету)
d3d_view()
.
Объект Cube:
В событии Create:
//Высота на которой находиться куб
z1 = 16;
z2 = 0;
//Координаты углов куба
x1 = x-8;
y1 = y-8;
x2 = x+8
y2 = y+8
//тестура для куба
tex = sprite_get_texture(sCube,0);
В событии Draw :
//Рисуем сам куб
d3d_draw_block(x1,y1,z2,x2,y2,z1,tex,1,1)
Объект Obj_block_par в нём нечего не пишем потому-что он нужен только для столкновения игрока и твёрдыми объектами.
Объект position :
//Устанавливаем ортогональное проектирование
d3d_set_projection_ortho(0,0,room_width,room_height,0);
d3d_set_hidden(false);
//Рисуем Поизицию камеры(игрока)
draw_text(10,5,'x: ' + string(round(Cam.x/16)));
draw_text(10,20,'y: ' + string(round(Cam.y/16)));
draw_text(10,35,'z: ' + string(round(Cam.z/16)));
//рисуем прицел на координатах курсора
draw_line(room_width/2-3,room_height/2,room_width/2+3,room_height/2)
draw_line(room_width/2,room_height/2-3,room_width/2,room_height/2+3)
d3d_set_hidden(true);
Скрипты :
Vector_x :
// x = vector_x(length,direction,pitch)
return argument0*cos(degtorad(argument1))*cos(degtorad(-argument2));
Vector_y :
// y = vector_y(length,direction,pitch)
return -argument0*sin(degtorad(argument1))*cos(degtorad(-argument2));
Vector_z :
// z = vector_z(length,direction,pitch)
return argument0*sin(degtorad(-argument2));
mouse_set :
z_angle -= (window_mouse_get_x()-view_wview[0]/2)*sens;
y_angle -= (window_mouse_get_y()-view_hview[0]/2)*sens;
window_mouse_set(view_wview[0]/2,view_hview[0]/2);
d3d_view :
//Установка проекции
d3d_set_projection(x,y,z_cam,x+vector_x(10,z_angle,y_angle),y+vector_y(10,z_angle,y_angle),z_cam-vector_z(10,z_angle,y_angle),0,0,1);
//Рисуем тень от игрока (ставим серый цвет ,прозрачность - 0.5 , рисуем цилиндр ,возвращаем
//прозрачность и цвет в нормальное состояние)
draw_set_color(c_gray);
draw_set_alpha(0.5);
d3d_draw_cylinder(x-2,y-2,z_base,x+2,y+2,z_base+1,-1,0,0,1,8);
draw_set_alpha(1);
draw_set_color(c_white);
Далее переходим к созданию комнаты где будет происходить вся игра...
Сначала ставим на нужном месте объект Cam это будет наш игрок.
Далее расставляем все препятствия (например Cube) .
Теперь в самую последнюю очередь ставим объект position поскольку он рисует в ортогональной проекции.