Как сделать нормальное столкновение со стенами в 2D аркадах

  Вход на форум   логин       пароль   Забыли пароль? Регистрация
On-line:  

Раздел: 
Game Maker Форум / Профессиональные Пользователи / Как сделать нормальное столкновение со стенами в 2D аркадах

Страницы: 1 2 Next>> новая тема

Автор Сообщение

маэстро
Группа: Сообщество GM
Сообщений: 812
Добавлено: 03-02-2006 20:14
Я посмотрел игры, сделанные на GM и увидел, что есть много косяков с застряванием в стенах, и поэтому хочу рассказать как делается нормальное движение.
Итак начнём.
Для хорошей игры сначала нужно подумать как это сделать.
Та к вот я придумал код, пишущийся за 10 минут, но он гарантирует, что косяков не будет.

Создаём объект player и объект wall.
Пусть у объектов player и wall будет спрайт 32*32 и центер в точке(16;16)
Пишем для player
В Create пишем:
air=0;
global.grav=0;
hsp=5;
jump=2;

В Step пишем:
wi=collision_rectangle(x-15,y+17,x+15,y+17+vspeed,wall,0,0)
if wi>0 and vspeed>0 and air=1 then
{
air=0;
vspeed=0;
gravity=0;
y=wi.y-32;
jump=2
}
...Это проверка столкновения со стеной снизу
if wi<0 and air=0 then
{
air=1;
gravity=global.grav
jump-=1
}
...Проверка отсутствия стены снизу

wi=collsion_rectangle(x-15,y-17,x+15,y-17+vspeed,wall,0,0)

if wi>0 and vspeed<0 then
{
vspeed=0;
y=wi.y+32;
}
...столкновение с потолком
Вот так пишется обработка прыжка
Теперь сам прыжок:

Для события KeyPress(любой клавиши) пишем:
if jump>0 then
{
vspeed-=5;
gravity=global.grav
jump-=1;
}
Теперь передвижение вправо(влево):
Для события KeyRight:
wi=collision_rectangle(x+17,y-15,x+17+hsp,y+15,wall,0,0)
if wi<0 then
{
x+=hsp
}
else
{
x=wi.x-32;
}

Для события KeyLeft:
wi=collision_rectangle(x-17,y-15,x-17-hsp,y+15,wall,0,0)
if wi<0 then
{
x-=hsp
}
else
{
x=wi.x+32;
}

Всё...
Этот лёгкий код - проработка столкновений, по крайней мере у меня он не глючил.
Если я всё правильно вспомнил, то это тот код, которым пользуюсь я.
Висение на стенах и т.д. легко добавляется

мастер
Группа: Сообщество GM
Сообщений: 121
Добавлено: 03-02-2006 20:33
Похвально.Вот, что значить использование логики по назначению

маэстро
Группа: Сообщество GM
Сообщений: 812
Добавлено: 06-02-2006 20:42
Похвально.Вот, что значить использование логики по назначению

Правилно.
А то смотрел, как столкновения реализованны в примерах, и достало - косяки, косяки, косяки....
Вот подумал, как эо нормально сделать и сделал.
P.S.
Этоткод реализован в моих примерах.

мастер
Группа: Сообщество GM
Сообщений: 121
Добавлено: 10-02-2006 11:21
А не пробовал просто сделать для спрайта маску?

маэстро
Группа: Сообщество GM
Сообщений: 812
Добавлено: 10-02-2006 19:48
Ну можно и маску.
Я много пробовал.
Этот код хоть с маской, хоть без работает...

мастер
Группа: Сообщество GM
Сообщений: 121
Добавлено: 10-02-2006 19:49
Но лучше проста маску

маэстро
Группа: Сообщество GM
Сообщений: 812
Добавлено: 10-02-2006 19:57
Раньше тоже так думал...
А потом понял - а если маска другого размера, чем спрайт - ты её постоянно менять будешь?
И много других косяков...

мастер
Группа: Сообщество GM
Сообщений: 121
Добавлено: 10-02-2006 20:00
Ето не косяк а поменять не так уж и трудно мона чз переменные высоты и ширины

маэстро
Группа: Сообщество GM
Сообщений: 812
Добавлено: 10-02-2006 20:07
Дерзай.
Если нужны сложности то пожалуйста..

мастер
Группа: Сообщество GM
Сообщений: 121
Добавлено: 10-02-2006 20:08
Вот сложности то как раз у тя

магистр
Группа: Сообщество GM
Сообщений: 462
Добавлено: 05-03-2006 15:59
Косяк есть. Если игрок сошел со стены в пропасть, он не падает. То есть, если впереди стены заканчиваются, то игрок не падает, а продолжает идти вперед

маэстро
Группа: Сообщество GM
Сообщений: 812
Добавлено: 05-03-2006 19:40
То чего не хватало выделил синим цветом.

магистр
Группа: Сообщество GM
Сообщений: 462
Добавлено: 05-03-2006 19:51
Я щаз подумал, напсал пример, когда довершу его дизайн и доделаю лестницы и всякие там воду с песком, выложу. Там лучше сделана физика, помимо того что столкновения по стенам, так еще можно взбираться по стенам, планая движение и т.п.

Тут могла быть ваша реклама
Группа: Сообщество GM
Сообщений: 1014
Добавлено: 05-03-2006 23:33
Кажется, как будто просто всё что можно было сделать проще написано сложнее. Просто несколько эллементов добавлено
if place_free(x,y+1+vspeed)=1
{
gravity_direction=270
gravity=0.7
letit=1
}
if place_free(x,y+1+vspeed)=0
{
gravity_direction=270
vspeed=0
gravity=0
}
зачем писать collision_rectangle(...)?

магистр
Группа: Сообщество GM
Сообщений: 330
Добавлено: 06-03-2006 08:35
Мне лень этот код писать. Да и неохото чужой код использовать.

магистр
Группа: Сообщество GM
Сообщений: 443
Добавлено: 06-03-2006 10:23
вопрос на засыпку товарищу кристаллу...

имеем твердый движущийся вниз блок, имеем шарик движущийся вверх навстречу блоку, постоянно меняющий размеры, да и с увеличением скорости... шарик мягкий. теперь напиши код, запрещающий шарику отскакивая пересекать границу блока и останавливаться, а блоку тормозить при встрече с шариком.. и не надо говорить что тебе влом =)

маэстро
Группа: Сообщество GM
Сообщений: 812
Добавлено: 06-03-2006 18:04
зачем писать collision_rectangle(...)?

А затем, чтобы потом объект прикрепит к нижней стороне стены без косяков и застряваний, и если скорость больше 32 то твой код не сработает.

магистр
Группа: Сообщество GM
Сообщений: 462
Добавлено: 08-03-2006 08:00
такс, ладно, вот пример, точнее готовый движок под платформер. Он кстати войдет в диск по ГМ, о котором я написал в разделе сообщество.
Ссылка

бывалый
Группа: Участники
Сообщений: 49
Добавлено: 11-04-2006 00:53
Главное стене поставь галочку SOLID
Два Solid объекта по понятиям гаймайкера не могут пройти друг через друга,а если вляпаются то не вылезут друг из друга если у них маленькая скорость

частый гость
Группа: Участники
Сообщений: 23
Добавлено: 14-05-2006 01:04
У меня трабл с застреванием. Я делаю игру типа пинг попг и иногда шарик при попадании на край ракетки застревает, а через секунд 5 отскакивает. Кто знает что делать?

Страницы: 1 2 Next>> новая тема
Раздел: 
Game Maker Форум / Профессиональные Пользователи / Как сделать нормальное столкновение со стенами в 2D аркадах

Отвечать на темы в данном разделе могут только зарегистрированные пользователи

Отвечать на темы могут только зарегистрированные пользователи

KXK.RU