RS Game Maker Community
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

 
Расширенный поиск
  Главная  Форум   Вики Блоги FAQ Игры Статьи Примеры Войти Регистрация  
Вики
Все желающие приглашаются редактировать вики. Можете писать о своих (или чужих) играх, размещать туториалы, постить статьи - главное навесить категорию.
Страниц: 1   Вниз
  Печать  
Как сделать твердый объект действительно твердым?
0 Пользователей и 1 Гость смотрят эту тему.
Da Kapa Preta
Новичок


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

Сообщений: 7

26 Сентября 2016 в 22:18
Я не так давно начал изучать GM и сходу у меня возникла проблема, как в 2д платформере можно реализовать твердость объекта, что бы через него не могли пройти другие.
  vspeed = 0 персонажа в отношении стены - плохое решение, так как из за этого возникает слишком много багов, которые я не знаю как исправлять.
Кто может подсказать хорошие способы сделать твердый объект действительно твердым и непроходимым?
 
ГоК
Начинающий
Старожил
******

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

Награды:
Легенда сайтаЗа интересные проекты
Сообщений: 2 032


Ответ № 1 26 Сентября 2016 в 23:25
Не мучайся. Вот тебе рабочий движок:
Во-первых, убедись, что у всех объектов, которые должны быть твёрдыми стоит галочка "solid", иначе place_free не будет срабатывать.

* 2016-09-26_23-00-21.png (17.66 Кб. 816x373 - просмотрено 90 раз.)


А вот и код для игрока:
Create
fallSpeed = 32; // максимальная максимальная скорость падения
gravAccel = 2; // ускорение паления (гравитация)
walkSpeed = 8; // максимальная скорость ходьбы
walkAccel = 1; // ускорение ходьбы
jumpSpeed = -16; // вертикальная скорость при прыжке
Step
// направление движения: 0 - стоим на месте, -1 - идём налево, 1 - идём направо
var _hDir;
_hDir = keyboard_check( vk_right )-keyboard_check( vk_left );

// считаем горизонтальную и вертикальную скорости (спасибо Толичу за метод расчёта)
hspeed = median( walkSpeed*_hDir, hspeed-walkAccel, hspeed+walkAccel );
vspeed = median( fallSpeed, vspeed-gravAccel, vspeed+gravAccel );

// прыгаем
if( keyboard_check( vk_space ) )
if( !place_free( x, y+1 ) )
    vspeed = jumpSpeed;

// проверяем столкновения со стенами
if( hspeed != 0 )
if( !place_free( x+hspeed, y ) )
    {
    move_contact_solid( 270+90*sign( hspeed ), abs( hspeed ) );
    hspeed = 0;
    };

// проверяем столкновения с полом и потолком
if( vspeed != 0 )
if( !place_free( x+hspeed, y+vspeed ) )
    {
    move_contact_solid( 180+90*sign( vspeed ), abs( vspeed ) );
    vspeed = 0;
    };
Если что-то будет непонятно, не стесняйся спрашивать.
Прикреплённые файлы Графические миниатюры:
Da Kapa Preta
Новичок


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

Сообщений: 7

Ответ № 2 27 Сентября 2016 в 00:17
Спасибо, а есть где-то полный разбор этого кода, ну всего остального платформера?
Хочу посмотреть как люди без костылей это делают.
ГоК
Начинающий
Старожил
******

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

Награды:
Легенда сайтаЗа интересные проекты
Сообщений: 2 032


Ответ № 3 27 Сентября 2016 в 00:27
Не понял, что ты имеешь в виду под "всем остальным платформером"...
Da Kapa Preta
Новичок


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

Сообщений: 7

Ответ № 4 27 Сентября 2016 в 00:29
Ну, если ты раньше такое уже писал, может у тебя есть и другие сохраненные статьи о реализации кода для платформера?
Или ты этот код специально для меня написал?
ГоК
Начинающий
Старожил
******

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

Награды:
Легенда сайтаЗа интересные проекты
Сообщений: 2 032


Ответ № 5 27 Сентября 2016 в 00:59
Статей, таких, чтоб прям всё по-полочкам, у меня нет.
Я могу, конечно, скинуть тебе исходник того, что я сам сейчас делаю, но ты там запутаешься.
Код, который я тебе дал - это самая основа. Ты не спеши, разберись с ним как следует, прочти каждую строчку, убедись что понял как всё работает, поэкспериментируй, сделай маленькую "тестовую" игру. А потом уже потихонечку начинай усложнять себе задачу.
Da Kapa Preta
Новичок


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

Сообщений: 7

Ответ № 6 27 Сентября 2016 в 01:30
Статей, таких, чтоб прям всё по-полочкам, у меня нет.
Я могу, конечно, скинуть тебе исходник того, что я сам сейчас делаю, но ты там запутаешься.
Код, который я тебе дал - это самая основа. Ты не спеши, разберись с ним как следует, прочти каждую строчку, убедись что понял как всё работает, поэкспериментируй, сделай маленькую "тестовую" игру. А потом уже потихонечку начинай усложнять себе задачу.
А как сюда вставить анимацию передвижения?
ГоК
Начинающий
Старожил
******

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

Награды:
Легенда сайтаЗа интересные проекты
Сообщений: 2 032


Ответ № 7 27 Сентября 2016 в 01:48
Готового решения говорить не буду, но подсказку дам. Заодно и поупражняешься.

Для того, чтобы сделать простую анимацию тебе понадобятся соответствующие спрайты (стоит, идёт, прыгает, падает), и вот эти переменные:
sprite_index - спрайт объекта;
image_index - кадр анимации спрайт;
image_speed - скорость с которой меняются кадры;
image_xscale - горизонтальное масштабирование. Полезно, чтобы "отзеркаливать" спрайт. image_xscale = 1, когда игрок смотрит вправо и image_xscale = -1, когда - влево.

Посмотри код и попробуй понять, в какой момент и как нужно менять спрайты игрока.
Последнее редактирование: 27 Сентября 2016 в 01:55 от ГоК
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

RSGMC (gmakers.ru) © 2007—2017
Счётчик–@Mail.ru