| Платформер |
|
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
Сообщение отредактировал 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, Спасибо, но мне важнее увидеть ошибку, чтобы ее больше не повторять, как-то так. Quote (VIRTUS) Или лучше сделай одельно лестницу и отключай гравитацию при взаимодействии с ней. Гравитация здесь ни причем, она отключается если значение climb = 1 --- Ну кто-нибудь еще?
|
| |
| | |
|
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, интересненько, ну я надеюсь, что ты расскажешь как разгон и занос реализовать. на лестницу уже прилепил перемещение, но все равно при столкновении с верхними кирпичами, он фокусы выдавать начинает. solid вроде регулируется. научился использовать nearest instance. теперь ГГ цепляется за ближайшую лестницу, а не за какую хочет насчет застреваний. липнет везде, где столкновение происходит с двух сторон с одинаковыми объектами. это поправимо?
Сообщение отредактировал 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 поиграй в эту игру.
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. У меня кстати персонаж телепортируется в масло крышу если запрыгивать на лестницу на самый её верх
Сообщение отредактировал 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) --------------------------------------------- Насчет первого понял. через алармы. Второй все еще открыт.
|
| |
| |
|
|