Game Maker - создание игр | HellRoom Games
Январь 19, 2025, 19:30:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Готовая основа 3D  (Прочитано 15802 раз)
0 Пользователей и 1 Гость смотрят эту тему.
site-pro
Участник
****

Репутация: 31
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: GameMaker 8.1 Standard
Деятельность: Програмирую программы и игры, а также рисую аниме
Сообщений: 139


Программист


« : Июль 24, 2012, 13:05:08 »

Готовая основа по 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: рисует позицию игрока и прицел(его надо ставить в последнюю очередь для того чтобы не получилось вот такой ошибки).
}

объект 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 поскольку он рисует в ортогональной проекции.

* Engine_for_3D.gmk (13.36 Кб - загружено 991 раз.)
« Последнее редактирование: Январь 31, 2013, 01:41:31 от site-pro » Записан

-Движок 3D
-Эффектные выпад. инфо-сообщения
-Steam pipes[The most adequate games of hellroom #2]
-terraria на android
Пишу программы и игры на Delphi,GML,C++,сайты на HTML,PHP,MySQL. Рисую аниме

Briginas
Главный Модератор
*

Репутация: 673
Offline Offline

Пол: Мужской
Награды:
1 место в Дичайшем джеме #82000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]Настоящий игродел!1 место в конкурсе Адекватные игры #3 [Антиутопия]...
API: GameMaker Studio 2
Деятельность: Game Designer
Сообщений: 2042



« Ответ #1 : Июль 24, 2012, 13:23:42 »

На сайте и форуме движков 3D основ довольно много, но чаще всего в них слишком много всего лишнего, этот мне показался прост и понятен. Молодец.
Но всё-таки это пример, а не статья. Так что лучше опиши всё подробно в теме, русских статей по 3D маловато.
Записан
Dgon
GM Pro user
*

Репутация: 40
Offline Offline

Пол: Мужской
Награды:
За постоянность! [50 дней на форуме]
API: Game Maker 8.0 Pro
Сообщений: 352

Boss


« Ответ #2 : Июль 24, 2012, 13:25:51 »

Адекват в меме опечатка...  понравится добырым людям
Записан
Адекват
Во имя адекватности
GM Pro user
*

Репутация: 313
Offline Offline

Пол: Мужской
Награды:
За отличную игру Peace, Death!1000 сообщений!За постоянность! [50 дней на форуме]За лояльность! [+150 репутации]2 место на HellRoom Jam #4, Ancient Egypt3 место на HellRoom Jam #3, Каменный век...
API: GameMaker Studio 2
Сообщений: 1871



WWW
« Ответ #3 : Июль 24, 2012, 14:09:12 »

Адекват в меме опечатка...  понравится добырым людям
Знаю. Давай будем думать, что я это спецом сделал, ок да?
Записан

Haks
GM Pro user
*

Репутация: 234
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [10 дней на форуме]За лояльность! [+150 репутации]Знаток Game Maker
API: GameMaker 8.1 Standard
Деятельность: Программист, Композитор.
Сообщений: 607


Date a Live ][


WWW
« Ответ #4 : Июль 25, 2012, 22:25:03 »

Вот только есть одна проблема. Если сделать еще один блок выше и поставить на объект нижнего блока, то объект будет сталкиваться, но потом падать. Пример прикрепил

* Engine_for_3D.gmk (13.98 Кб - загружено 526 раз.)
Записан

site-pro
Участник
****

Репутация: 31
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: GameMaker 8.1 Standard
Деятельность: Програмирую программы и игры, а также рисую аниме
Сообщений: 139


Программист


« Ответ #5 : Июль 26, 2012, 21:53:47 »

Вот только есть одна проблема. Если сделать еще один блок выше и поставить на объект нижнего блока, то объект будет сталкиваться, но потом падать. Пример прикрепил
Эта проблема связана с тем что если под тем блоком что выше есть ещё блок то оно берёт для z_base высоту нижнего...

Решил
надо заменить вот этот код :

Код:
if z > other.z1
    {
    z_base = other.z1
    }

на вот это:

Код:
if z > other.z1
    {
    with(other)
    {
    collised=collision_rectangle(x1,y1,x2,y2,object10,1,1)
    if collised<=0
    {
    Cam.z_base = z1
    }
    else
    {
    Cam.z_base = collised.z1
    }    
    }
    }

P.S. Результат во влажении

* Engine_for_3D_1.gmk (13.7 Кб - загружено 586 раз.)
Записан

-Движок 3D
-Эффектные выпад. инфо-сообщения
-Steam pipes[The most adequate games of hellroom #2]
-terraria на android
Пишу программы и игры на Delphi,GML,C++,сайты на HTML,PHP,MySQL. Рисую аниме

Briginas
Главный Модератор
*

Репутация: 673
Offline Offline

Пол: Мужской
Награды:
1 место в Дичайшем джеме #82000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]Настоящий игродел!1 место в конкурсе Адекватные игры #3 [Антиутопия]...
API: GameMaker Studio 2
Деятельность: Game Designer
Сообщений: 2042



« Ответ #6 : Июль 26, 2012, 22:27:43 »

На второй уровень высоты запрыгивает, а вот если рядом находится первый, то не спрыгивает. Если поставить на одну и туже клетку блок с z = 16 и с z = 32, то игрок начинает проваливаться в куб. Если прыгнуть находясь на высоте 16 и прыгать в сторону блока с 32 высотой, то игрок начнёт высоко прыгать. Дорабатывай.
Записан
site-pro
Участник
****

Репутация: 31
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: GameMaker 8.1 Standard
Деятельность: Програмирую программы и игры, а также рисую аниме
Сообщений: 139


Программист


« Ответ #7 : Июль 26, 2012, 22:52:49 »

А вот и решение....
да порадуемся же этому  

* Engine_for_3D.gmk (13.33 Кб - загружено 568 раз.)
« Последнее редактирование: Август 05, 2012, 20:45:01 от site-pro » Записан

-Движок 3D
-Эффектные выпад. инфо-сообщения
-Steam pipes[The most adequate games of hellroom #2]
-terraria на android
Пишу программы и игры на Delphi,GML,C++,сайты на HTML,PHP,MySQL. Рисую аниме

Briginas
Главный Модератор
*

Репутация: 673
Offline Offline

Пол: Мужской
Награды:
1 место в Дичайшем джеме #82000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]Настоящий игродел!1 место в конкурсе Адекватные игры #3 [Антиутопия]...
API: GameMaker Studio 2
Деятельность: Game Designer
Сообщений: 2042



« Ответ #8 : Август 05, 2012, 20:35:59 »

Молодец, но всё же при падении с высокого блока на низкий игрок застревает в нём.
Записан
site-pro
Участник
****

Репутация: 31
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: GameMaker 8.1 Standard
Деятельность: Програмирую программы и игры, а также рисую аниме
Сообщений: 139


Программист


« Ответ #9 : Август 05, 2012, 20:45:41 »

та я тоже заметил.... как раз над этим думаю....
P.S. это если с блока идти медленно

Добавлено: Август 29, 2012, 17:22:58
исправил ошибку
вложение в первом посте
« Последнее редактирование: Август 29, 2012, 17:23:14 от site-pro » Записан

-Движок 3D
-Эффектные выпад. инфо-сообщения
-Steam pipes[The most adequate games of hellroom #2]
-terraria на android
Пишу программы и игры на Delphi,GML,C++,сайты на HTML,PHP,MySQL. Рисую аниме

MusNik
KeeVee Games
GM Pro user
*

Репутация: 733
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3241



WWW
« Ответ #10 : Август 29, 2012, 19:36:22 »

Отлично Скриншотов бы под спойлер
Записан

site-pro
Участник
****

Репутация: 31
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: GameMaker 8.1 Standard
Деятельность: Програмирую программы и игры, а также рисую аниме
Сообщений: 139


Программист


« Ответ #11 : Август 29, 2012, 19:48:59 »

Отлично Скриншотов бы под спойлер
а что заскриншотить?
Записан

-Движок 3D
-Эффектные выпад. инфо-сообщения
-Steam pipes[The most adequate games of hellroom #2]
-terraria на android
Пишу программы и игры на Delphi,GML,C++,сайты на HTML,PHP,MySQL. Рисую аниме

MusNik
KeeVee Games
GM Pro user
*

Репутация: 733
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3241



WWW
« Ответ #12 : Август 29, 2012, 19:54:53 »

Движок в действии. Хотя ладно, не хочешь - не надо
Записан

site-pro
Участник
****

Репутация: 31
Offline Offline

Пол: Мужской
Награды:
За постоянность!
API: GameMaker 8.1 Standard
Деятельность: Програмирую программы и игры, а также рисую аниме
Сообщений: 139


Программист


« Ответ #13 : Август 29, 2012, 19:56:14 »

ну вообще то у меня в планах записать видео по этому уроку...
Записан

-Движок 3D
-Эффектные выпад. инфо-сообщения
-Steam pipes[The most adequate games of hellroom #2]
-terraria на android
Пишу программы и игры на Delphi,GML,C++,сайты на HTML,PHP,MySQL. Рисую аниме

ETUN4
«Старожил форума»
******

Репутация: 50
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [10 дней на форуме]
API: Game Maker 8.0 Pro
Деятельность: Game Maker, HTML, MobileBasic...
Сообщений: 855

Ну как-то так...


« Ответ #14 : Август 29, 2012, 20:54:36 »

вроде как ничего особенного...
Записан

Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.191 секунд. Запросов: 33.