Платформер - Помогите, не получается! - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Помогите, не получается! » Платформер
Платформер
Skeptor Дата: Воскресенье, 22.01.2012, 06:57 | Сообщение # 1
Молчун
Группа: Пользователь
Сообщений: 13
Статус: Offline
Решил для начала сделать простой, но приятный платформер.

Взял за основу один из примеров с официального форума.

Проблемы:
1. Игрок липнет к объекту o_block если дотронуться с горизонтальных сторон.
2. Лестница. Долго перебирал всевозможные примеры, персонаж залезал и слазил, но:
а) не может стоять на лестнице. (сделал дополнительный объект o_brick_l чтобы регулировать его "solid")
б) странно проигрывает анимацию карабкания.
в) периодически (!) застревает в объекте o_brick_l, когда по нему проходишь.

На всякий случай даю ссылку на основной пример: http://gmc.yoyogames.com/index.php?showtopic=510387
Прикрепления: Project_RETRO.gmk(14Kb)


Сообщение отредактировал Skeptor - Вторник, 24.01.2012, 16:14
 
VIRTUS Дата: Воскресенье, 22.01.2012, 11:24 | Сообщение # 2
Болтун
Группа: Пользователь
Сообщений: 207
Статус: Offline
1. для горизонтальных стен используй дургой объект и проверяй только столкновение.
2. дублируй объект пола, раз он притягивает, липнет к нему, меняй спрайт на лестницу.

Добавлено (22.01.2012, 11:24)
---------------------------------------------
Или лучше сделай одельно лестницу и отключай гравитацию при взаимодействии с ней.

 
Skeptor Дата: Воскресенье, 22.01.2012, 13:53 | Сообщение # 3
Молчун
Группа: Пользователь
Сообщений: 13
Статус: Offline
VIRTUS, Спасибо, но мне важнее увидеть ошибку, чтобы ее больше не повторять, как-то так. smile

Quote (VIRTUS)

Или лучше сделай одельно лестницу и отключай гравитацию при взаимодействии с ней.


Гравитация здесь ни причем, она отключается если значение climb = 1

---

Ну кто-нибудь еще? cry
 
vitaly5000 Дата: Понедельник, 23.01.2012, 00:49 | Сообщение # 4
Разговорчивый
Группа: Пользователь
Сообщений: 125
Статус: Offline
Для горизонтального движения не советую использовать hspeed
попробуй просто перемещать по иксу с проверкой
типо такого

if place_free(x+player_speed,y+0)
x+=player_speed

правда на героя перестанет действовать friction и его не будет заносить на поворотах.
но можно и занос сделать, сча леняво расписывать на секу заскочил.

с лестницей тоже самое! ни какие дополнительные объекты не нужны. просто в коллизии с лестницей отключи гравитацию и вертикальную скорость, а чувочка перемещай также как и по горезонтали
примерно так
if place_free(x+0,y-5)
y-=5
 
Skeptor Дата: Понедельник, 23.01.2012, 05:19 | Сообщение # 5
Молчун
Группа: Пользователь
Сообщений: 13
Статус: Offline
vitaly5000, интересненько, ну я надеюсь, что ты расскажешь как разгон и занос реализовать. happy

на лестницу уже прилепил перемещение, но все равно при столкновении с верхними кирпичами, он фокусы выдавать начинает.

solid вроде регулируется.

научился использовать nearest instance. теперь ГГ цепляется за ближайшую лестницу, а не за какую хочет biggrin

насчет застреваний. липнет везде, где столкновение происходит с двух сторон с одинаковыми объектами. это поправимо?
Прикрепления: 9375225.gmk(14Kb)


Сообщение отредактировал Skeptor - Понедельник, 23.01.2012, 05:27
 
sun Дата: Понедельник, 23.01.2012, 07:29 | Сообщение # 6
Болтун
Группа: Пользователь
Сообщений: 168
Статус: Offline
у меня есть пример.
но ты сразу не разберешься в нем.
давай через лс расскажу как он работает.


xxxyyyzzzed
Ed Gorod


Сообщение отредактировал sun - Понедельник, 23.01.2012, 07:29
 
sun Дата: Понедельник, 23.01.2012, 15:25 | Сообщение # 7
Болтун
Группа: Пользователь
Сообщений: 168
Статус: Offline
вот тебе пример.
с некторыми коментами в коде.
но если че непонел то говори.
можешь там потом подставить немного своего например max_speed и норм платформер.
код из моей игры http://forum.gmaker.su/forum/11-4946-1

ps поиграй в эту игру.
Прикрепления: 0853623.gmk(18Kb)


xxxyyyzzzed
Ed Gorod
 
SaintHeiser Дата: Вторник, 24.01.2012, 09:45 | Сообщение # 8
Болтун
Группа: Проверенные
Сообщений: 182
Статус: Offline
разгон делается через hspeed
Заводистя перменная maxhspeed - это максимальная скорость
далее в Step

Code
//это проверка нажатия на клавиши. Лучше это так же делать в STEP событии
if (keyboard_chek(RIGHT)) hspeed+=speed_ammount;
if (keyboard_chek(LEFT)) hspeed-=speed_ammount;

//торможение, простой и эффективный способ, но тут нужно подбирать делитель, зато будет сверхплавно(потому что по гиперболе)
//if (!keyboard_chek(RIGHT) && !keyboard_chek(LEFT)) hspeed*=0.7;

//торможение, решение в лоб
if (!keyboard_chek(RIGHT) && !keyboard_chek(LEFT))
{
hspeed-=sign(hspeed)*speed_ammount;
// это нужно т.к. бывает такой прикол что значение hspeed не достигнет нуля
//например когда maxspeed=10 а speed_ammount=3;
if (abs(hspeed)<speed_ammount*1.1) hspeed=0;
}

//это проверка на вылазение за передлы максимального значения
if (abs(hspeed)>maxspeed)  hspeed=sign(hspeed)*maxspeed;


Далее нужно проверить столкновения. В самом тривиальном случае это будет выглядеть так:

Code
//проверяем столкновение по линии в заданном движении, если там есть стена то скорость по горизонтали обнуляем.
if (collision_line(x+sign(hspeed)*width/2+hspeed, y-height/2, x+sign(hspeed)*width/2+hspeed, y+height/2, o_wall, 0,0))
hspeed=0;


width и height - ширина и высота ГГ. Да, лучше когда герой имеет прямоугольную маску.
Если уж совсем грамотно подходить, то у меня например обычно все стены состоят из квадратиков, поэтому я обычно ещё и позиционирую ГГ при столкновении на край стены:

Code
var wall_id;
wall_id=collision_line(x+sign(hspeed)*width/2+hspeed, y-height/2, x+sign(hspeed)*width/2+hspeed, y+height/2, o_wall, 0,0);

if (wall_id>0)
{
x=wall_id.x-sign(hspeed)*(wall_id.width/2+width/2);
hspeed=0;
}


У стены тоже лучше чтобы была задана ширина и высота (width и height)
по-хорошему делать как DreamRunner - через массивы, но там нужны дополнительные приседания, которые никто из вас не осилит в ближайшие пару месяцев.

Хорошая привычка - всё параметризовать - поэтому где-то в Create нужно определить значения для maxspeed, speed_ammount (это ускорение, т.е. прирост скорости) и так же кнопки LEFT и RIGHT; Управление лучше вообще делать независимым, поэтому и рекомендуется делать их в Step событии. Все глобальные пременные имеет смысл называть капсом, в общем, где-то нужно определить такие переменные:

Code
globalvar LEFT, RIGHT;
LEFT=vk_left;
RIGHT=vk_right


В дальнейшем это поможет сделать интерфейс смены управления.

Не нужно слушать всяких умников. Встроенные перменные типа hspeed были сделаны не для того чтобы разработчики снова их делали но своими перменными.
А вот галочку solid лучше не использовать, т.к. она порождает неочевидные косяки.
Если код выше непонятен - идите курить справку.

для лестниц - нужно вводить два состояния ГГ:
1) ГГ в обычном режиме и обычне проверки
2) ГГ на лестнице.

Причём из состояния 1 он переходит в 2 если нажата кнопка вверх или вниз и ГГ находится на лестнице( юзайте collision_point)
из состояния 2 в 1 он переходит либо когда ГГ спрыгивает с лестницы (нажата клавиша прыжка), либо когда он достигает конца лестницы. Тут два варианта:
1) ГГ забирается на лестницу (при этом на верху лестницы должна быть стена (можно сделать невидимой выключив visible))
2) ГГ на лестнице касается пола.

Как домой приду - выкину сюда свой пример платформера, с лестницами, с движущимися платформами, прыжками и подкатами. Голый движок.


все формы неприязни ко мне просьба выражать в суицидальной форме

Сообщение отредактировал SaintHeiser - Вторник, 24.01.2012, 10:06
 
Skeptor Дата: Вторник, 24.01.2012, 14:45 | Сообщение # 9
Молчун
Группа: Пользователь
Сообщений: 13
Статус: Offline
SaintHeiser,

т.е. все эти телепортации ГГ в хрен знает куда - это все из-за использования solid?

Quote (SaintHeiser)
width и height - ширина и высота ГГ. Да, лучше когда герой имеет прямоугольную маску.


Когда герой приседает, я меняю ему маску на уменьшенную, для этого состояния тоже отдельно задавать ширину и высоту?
 
SaintHeiser Дата: Вторник, 24.01.2012, 15:35 | Сообщение # 10
Болтун
Группа: Проверенные
Сообщений: 182
Статус: Offline
Quote
т.е. все эти телепортации ГГ в хрен знает куда - это все из-за использования solid?

Скорее всего именно так и есть. Функция contact_solid работает очень интересно. После того как я с десяток раз пытался родить механику платформера при помощи вот этих всех странных функций типа move_contact, place_free и т.д. плюнул и сделал всё по уму. Функции collision_* работают корректно.
Ещё насколько я помню при наложении двух solid объектов друг на друга происходят глюки.
Я уже давно solid не использую и проверки произвожу вручную. Никто из игроков пока что на механику передвижения не жаловался.

Quote
Когда герой приседает, я меняю ему маску на уменьшенную, для этого состояния тоже отдельно задавать ширину и высоту?

Да. Там есть с этим небольшой геморой, но вполне разрешимо. Я выложу пример - поглядишь. У меня во время подката маска и высота меняются. Самоё стрёмное во всём этом на самом то деле - это двигающиеся платформы. Их ещё более стрёмно программировать, чем лестницы.


все формы неприязни ко мне просьба выражать в суицидальной форме
 
Skeptor Дата: Вторник, 24.01.2012, 16:18 | Сообщение # 11
Молчун
Группа: Пользователь
Сообщений: 13
Статус: Offline
SaintHeiser, жду

проблему с залипанием между двумя объектами я решил просто "else" добавив между строк. исходник заменил. но то, что герой иногда телепортируется (например когда я пытаюсь соскочить с блока) заводит в тупик.
 
DanielC Дата: Вторник, 24.01.2012, 18:49 | Сообщение # 12
Болтун
Группа: Пользователь
Сообщений: 244
Статус: Offline
C торможением можно поступить намного проще, для этого нужно использовать функцию friction она же - трение, код будет примерно таким:
Code
if keyboard_check(vk_left) || keyboard_check(vk_right) {friction = start_friction}else{friction = end_friction}

Где start_friction = трение во время движения, оно должно быть небольшим чтобы игрок мог перемещаться, а end_friction большим чтобы игрок останавливался.
Тут уже подбирать индивидуально, скажем 0.4 и 1 или 0.6 и 1.5.
У меня кстати персонаж телепортируется в масло крышу если запрыгивать на лестницу на самый её верх eek happy


Сообщение отредактировал DanielC - Вторник, 24.01.2012, 18:49
 
vitaly5000 Дата: Четверг, 26.01.2012, 01:31 | Сообщение # 13
Разговорчивый
Группа: Пользователь
Сообщений: 125
Статус: Offline
Quote (SaintHeiser)
Не нужно слушать всяких умников. Встроенные перменные типа hspeed были сделаны не для того чтобы разработчики снова их делали но своими перменными.

Я предложил свой вариант как это сделать! Это не значит что он не верный! Кого здесь не нужно слушать так это sun, а
я видел его примеры платформеров ему самому учится, учится и учится.
 
Skeptor Дата: Четверг, 26.01.2012, 07:34 | Сообщение # 14
Молчун
Группа: Пользователь
Сообщений: 13
Статус: Offline
Ребят, а мне тут идея в башку стукнула, может уже где-то и было подобное.

Что если часто используемые объекты такие как стены, лестницы, и другие неподвижные части уровней - делать невидимыми? Ведь если я хочу например следующий уровень создать с такой же механикой, но с другим графическим контентом, мне придется лишь создать объекты содержащие только спрайт, и наклеить поверх невидимых стен и прочих вещей.

Имеет ли затея смысл?
 
sun Дата: Четверг, 26.01.2012, 07:43 | Сообщение # 15
Болтун
Группа: Пользователь
Сообщений: 168
Статус: Offline
Quote (Skeptor)
мне придется лишь создать объекты содержащие только спрайт

можно использовать тайлы
это часто используется в платформерах


xxxyyyzzzed
Ed Gorod
 
Ang3L Дата: Четверг, 26.01.2012, 19:53 | Сообщение # 16
Каждый 5й пост мой
Группа: Админы
Сообщений: 2677
Статус: Offline
Quote (Skeptor)
Имеет ли затея смысл?

Не имеет.

Каждый объект отрисовывает свой sprite_index (должен так делать даже если вы переопределили Draw). Если нужен другой спрайт, то меняем sprite_index и всё, а не делаем по 10 объектов одного и того же.

P.S.: Уровень должен грузиться извне чтобы загрузить все параметры (в т.ч. и индексы спрайтов) и не быть привязанным к ГМ.


Blogpost
 
Skeptor Дата: Пятница, 27.01.2012, 11:28 | Сообщение # 17
Молчун
Группа: Пользователь
Сообщений: 13
Статус: Offline
Quote (Ang3L)
то меняем sprite_index и всё

Точно, чето я тупанул.

Quote (Ang3L)
Уровень должен грузиться извне

ну это мне пока не грозит...

Я кстати нигде не нашел, что делает move_contact_solid, где почитать?

И еще, как все таки фпс не доводить ниже 60? Есть ли рекомендации, что можно в step писать, а что не желательно?
 
Ang3L Дата: Пятница, 27.01.2012, 19:32 | Сообщение # 18
Каждый 5й пост мой
Группа: Админы
Сообщений: 2677
Статус: Offline
Quote (Skeptor)
где почитать?

У почти каждой программы работает волшебная кнопка F1. ГМ не исключение.

Quote (Skeptor)
И еще, как все таки фпс не доводить ниже 60?

Таких советов куча в сети и здесь (в прикрепленной сверху теме - "Оптимизация").

Quote (Skeptor)
Есть ли рекомендации, что можно в step писать, а что не желательно?

Здесь надо рассуждать здраво и понимать что делаешь. Это самый главный и действенный совет. Т.е. пытаться уменьшить кол-во операций, не делать пустых, бесполезных, малополезных, тяжёлых действий и т.д. Искать альтернативные пути решения (опыт показывает что зачастую такие имеются), искать в сети опыт и решение какой-то проблемы. Говорить о чём-то конкретном - бесполезно, т.к. проблем и нюансов, связанных с оптимизацией, великое множество.


Blogpost
 
Skeptor Дата: Суббота, 11.02.2012, 20:18 | Сообщение # 19
Молчун
Группа: Пользователь
Сообщений: 13
Статус: Offline
Такие вопросы: как сделать чтобы после получения урона персонаж очень часто мигал. Такой эффект типа прозрачности на 8-16 битных приставках был.

И еще. Есть ли возможность видео фильтры подключать?

Добавлено (11.02.2012, 20:18)
---------------------------------------------
Насчет первого понял. через алармы. Второй все еще открыт.

 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Помогите, не получается! » Платформер
Страница 1 из 11
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход