Пятница, 20 Декабря 2024, 22:00

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Художник пытается освоить GML
FerrumelДата: Суббота, 26 Марта 2011, 01:01 | Сообщение # 141
почти ветеран
Сейчас нет на сайте
Ух жаркая дискуссия.

Quote
(в игре ничего не происходит, игрок и враги не двигаются например).

Это уже скумекал и отказался от циклов в степе. biggrin

Придумал себе игрушку, чтобы не скучно было осваивать программу, реализую ее потихоньку. Просто платформер, прыгать, собирать, стрелять, это скучно. Таких вещей уже больше чем надо наклепано. Делаю платформер с нестандартными фишечками. А именно в движениях персонажа. Алгоритмику движений за основу взял из черного плаща что на денди. Персонаж уже стреляет, прыгает, делается неуязвимым за счет клавиши down. спрайтики анимированы, все довольно симпатично.
Одну вещь смог реализовать только частично. Дело в том, что в оригинальной игре, ЧП может
1- подпрыгивать и цепляться за платформу,
2- вися на платформе, он может поворачиваться влево и вправо для ведения огня.
3-При нажатии вниз, он отцепляется и летит вниз.
4-при нажатии прыжок, он запрыгивает на платформу.
5-если стоя на платформе нажать вниз и прыжок, ЧП спрыгивает с платформы и снова оказывается в положении вися.

Первые три пункта изготовил на 100%. Вот с прыжками туда сюда, возникли неувязки. Из положения вися запрыгивать на платформу вроде научил, но мне не нравится как это сделано.
Даю вводную.

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

Сменил направление мысли, превратил этот висельный блок в невидимую тонкую полоску, прилепил к обычному твердому блоку внизу(самый простецкий ими реализованы стены, пол, невисельные блоки). Результат, цепляемся замечательно, подпрыгивание вверх коряво но реализовал, а именно, клавиша UP y=-40. Вроде школьник сказал бы; "А ! и так сойдет!". Но мне такое положение вещей не нравится, персонаж буквально телепортируется вверх, выглядит резко и не красиво. Спрыгивание с блока с целью снова за него зацепиться в принципе можно реализовать так же.

Может есть какая то возможность перемещения персонажа более плавным способом? какое нибудь временное block1.solid=false block1.solid=true? да и тут трудность, когда персонаж будет спрыгивать вниз, он скорее всего нижней своей частью, пролетая сквозь блок влипнет в активную зону висения и раскрылится, остановится и как следствие застрянет в нелепой позе.

Или все таки плюнуть, сделать красивую анимацию телепортации? Игровая сущность персонажа это позволяет.


все серо и пусто
LunarPixelДата: Суббота, 26 Марта 2011, 07:23 | Сообщение # 142
старожил
Сейчас нет на сайте
Ferrumel, хм... конечно и с телепортацией было бы прикольно.. но всё же отвечу на твой вопрос...

Можно сделать block1.solid=false и block1.solid=true
Для этого нужно просто проверять положение персонажа. Т.е. если он над платформой, то она твердая... а если под платформой, то не твердая... Чтобы всё правильно рассчитать, нужно ещё учитывать высоту спрайта персонажа.

Code
if obj_player.y+obj_player.sprite_height < y and solid = false
     {solid = true; }
if obj_player.y+obj_player.sprite_height > y and  solid = true
    {solid = false; }

Думаю не будет проблемы добавить сюда условие нажатия клавиши down, при котором платформа в любом случае перестанет быть твердой.
Ну а для прыжка из висячего положения в таком случае используй vspeed=8

Аналогично, сравнивая положение игрока по y с тонкой полоской, за которую персонаж цепляется, можно рассчитать чтобы это цепляние происходило только в нужный момент, а не при первом же столкновении игрока и полости.
Хотя данный аспект можно реализовать и другими способами. Проверкой коллизий например collision_point или collision_line.. лучше второй вариант.. она проводит мнимую линию и проверяет есть ли столкновение этой линии с объектом.... настраиваем collision_line таким образом, чтобы она проверяла есть ли над игроком полоска. Допустим нужно чтобы персонаж цеплялся, когда касается полоски головой... тогда нужно настроить collision_line таким образом, чтобы она проходила через голову персонажа, не выходя за границу. Думаю понятно.
Или же, как ещё один вариант, можно создавать дополнительный небольшой объект в области головы персонажа. И проверять столкновение полоски уже с этим объектом. Когда столкновение происходит, персонаж цепляется. Этот вариант как по мне, легче всего, но нужно доп. объект делать, а это не каждому по душе будет )))


FerrumelДата: Пятница, 01 Апреля 2011, 14:15 | Сообщение # 143
почти ветеран
Сейчас нет на сайте
Благодарю. Обязательно попробую все варианты, для лучшего усвоения материала. Больше всего понравилось про объект в районе башки.

Добавлено (01.04.2011, 14:15)
---------------------------------------------
Что то не пойму такой тонкости, а объекты находящиеся на разной глубине(depth) взаимодействуют? Например герой с глубиной -1 сталкивается с объектом глубиной 0? Я так понял, глубина здесь отвечает только за наложение изображений друг на друга? А все взаимодействия остаются такими же?


все серо и пусто
LunarPixelДата: Пятница, 01 Апреля 2011, 14:25 | Сообщение # 144
старожил
Сейчас нет на сайте
Да, на взаимодействие это не влияет. Только на наложение изображений.

FerrumelДата: Пятница, 01 Апреля 2011, 15:47 | Сообщение # 145
почти ветеран
Сейчас нет на сайте
LunarPixel, ага спасибо так и подумал...

Все! Сдаюсь!

Quote
4-при нажатии прыжок, он запрыгивает на платформу.

Неделя жесткого мозгового штурма задачи не решила. Уже прихожу к мысли что необходимо поставить UP y=-40. и не тратить себе нервы и личное время. Но опять же, слишком резким выходит прыжок... НЕКРАСИВО(((......
Попытка управления твердостью платформы результата не дала. Происходит следующее,
1-герой подпрыгивает, цепляется за платформу. активирована переменная prilip, в этом состоянии могу висеть, разворачиваться в разные стороны, вести огонь, пока не нажата клавиша вниз. Все прекрасно, все хорошо.
2-попытка прилепить событие прыжка вверх(опять же клавиша вверх) при prilip=true. Меняю твердость платформы на ноль, придаю персонажу отрицательную скорость, отрубаю события столкновения с объектами липучка(внизу платформы) и самой платформой, взмываю вверх. На персонажа начинает действовать сила тяжести, скорость становится положительной (реализую твердость платформы опять на 1), благополучно приземляюсь на верх платформы. Вроде все замечательно? Как бы не так.

При кратковременном нажатии на клавишу вверх (прыжок получается хилым) мы просто не успеваем пролететь сквозь платформу, когда скорость становится положительной и она снова становится твердой. Итог- как муха в краске biggrin .

Как можно такого избежать?
Есть следующее соображение. При переменной прилип=1 нажатие клавиши вверх инициирует событие движения персонажа, скорость отрицательна (блок нетвердый), выход на запланированную точку у, блок снова становится твердым, падаем вниз, благополучное приземление.
Вот теперь самое интересное, как реализовать движение к нужной точке у, даже если кнопка вверх уже отпущена. Попытка реализовать через move_towards не дало результатов. Попытка впихнуть в step нужного результата не дает. Ничего не дает результатов а различных способов опробовал уйму. Как тут быть если событие прекращается раньше чем надо? Как сделать чтобы событие пригралось до конца вне зависимости от других присходящих событий?


все серо и пусто
LunarPixelДата: Пятница, 01 Апреля 2011, 16:03 | Сообщение # 146
старожил
Сейчас нет на сайте
Quote (Ferrumel)
При кратковременном нажатии на клавишу вверх (прыжок получается хилым)

У тебя сила прыжка меняется в зависимости от того, как долго держишь кнопку?! Можешь просто задать для этой ситуации чтобы в любом случае подпрыгивал на одну и ту же высоту. Т.е. просто пишешь при нажатии на прыжок наприме vspeed=-8, тогда он всегда будет только на эту высоту подпрыгивать.

Но вообще застревания можно избежать и без этого. Зачем ты сделал проверку скорости для смены твердости? Я же дал код. Проверяй положение игрока относительно платформы. Если он ниже её, тогда платформа не твердая, если выше, тогда твердая.
Тот код что я дал помести в степ платформы, должно работать. В таком случае пока герой не будет выше платформы, она твердой не станет и он не застрянет.

Добавлено (01.04.2011, 16:03)
---------------------------------------------
Вот на всякий случай примерчик
Пока объект под платформой, она не твердая, когда над ней (полностью выше неё), тогда становится твердой.


FerrumelДата: Пятница, 01 Апреля 2011, 17:12 | Сообщение # 147
почти ветеран
Сейчас нет на сайте
LunarPixel,
Ага, я уже так реализовывал, мне не нравится, что если персонаж врезается сбоку в платформу, она не твердая, и он начинает двигаться сквозь нее как через кисель.
Все равно спасибо за пример. Полезная штука, обязательно пригодится.

Quote
У тебя сила прыжка меняется в зависимости от того, как долго держишь кнопку?!
Нее, не так мыслю выразил, у меня стоит vspeed=-10 там просто идет конфликт переменных состояния персонажа, и чтобы избежать долгих нудных объяснений, решил сказать вот так.
Кстати если интересно, могу показать что именно сделано и как, в виде исходника. Но я человек неопрятный, как в рисовании, куча безымянных слоев непонятного назначения. Так получается что и в программировании я неопрятен, выключенные (на время) куски кода, понятные только мне переменные, ноль комментариев. Что к чему только я понимаю и то не все))).


все серо и пусто
LunarPixelДата: Пятница, 01 Апреля 2011, 17:18 | Сообщение # 148
старожил
Сейчас нет на сайте
Ferrumel, я работаю программистом и у меня бывает такое же с кодом... понятное только мне... так что тебе думаю простительно... biggrin
Хм, подумаю сейчас над твоей проблемкой ))
Чувствуется мне что игра должна получиться на хорошем уровне, не хотелось бы портить впечатление ))) Хотя и интересно посмотреть )))


FerrumelДата: Суббота, 02 Апреля 2011, 00:14 | Сообщение # 149
почти ветеран
Сейчас нет на сайте
LunarPixel,
Можно и на телепортировании остановиться как я уже говорил ранее. А так обладая уже имеющимся, можно изготавливать блок следующим образом.
Основной блок, с проверкой в шаге на солид, внизу к нему прицеплена липучка, по бокам блока ставятся "заглушки" из обыкновенного блочка, невидимого, но твердого. Чтобы персонаж не пролетал блок сбоку.

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


все серо и пусто
LunarPixelДата: Суббота, 02 Апреля 2011, 08:22 | Сообщение # 150
старожил
Сейчас нет на сайте
Может переизбытка и не будет, но сам способ не очень хороший. Хотя если уж так решать проблему, то можно создавать эти невидимые блоки по бокам не с самого начала на всей карте, а только в определенный момент (когда герой близко к блоку), а затем удалять их.

FerrumelДата: Понедельник, 04 Апреля 2011, 16:46 | Сообщение # 151
почти ветеран
Сейчас нет на сайте
Народ! А как можно временно отключить событие например нажатие клавиши вниз? Через alarm? А как я этим будильником пользоваться не умею, и нормального кода не всречал чтобы по путю разобраться.

все серо и пусто
EshfordДата: Понедельник, 04 Апреля 2011, 16:53 | Сообщение # 152
Богиня Гамака ♥
Сейчас нет на сайте
Можно схитрить, Если хочешь сделать кат-сцену, то делай так: У тебя есть перс, со всеми событиями. Ты его , заменяешь на другой "пустой" объект, а когда надо, обратно возвращаешь нужный объект.
LunarPixelДата: Понедельник, 04 Апреля 2011, 17:00 | Сообщение # 153
старожил
Сейчас нет на сайте
Ferrumel, да, первое что приходит на ум это Аларм. Там ничего сложного.

Как пример:
Задаем переменную down=1

В коде нажатия клавиши пишем:
if down=1
{Выполняется код}

При каких нибудь обстоятельствах меняем переменную на 0. (действия по нажатию на ВНИЗ не будут выполняться)

Далее где нибудь включаем таймер:
alarm[0]=60 //включаем таймер, время таймера зависит от скорости комнаты. Скорость комнаты - одна секунда для таймера. т.е. если скорость комнаты 30, то написав в таймере 60, мы включим таймер на 2 секунды.

А в событии Alarm 0 пишем:
down=1 //По истечению таймера переменная снова равна 1

Следует заметить что таймер нельзя включать в циклических событиях без особых проверок, т.к. таймер в таком случае не выполниться. Например если поместить alarm[0]=60 просто в step, то он никогда не сработает, т.к. будет каждый шаг начинать отчет заново.

Добавлено (04.04.2011, 17:00)
---------------------------------------------
Naruto-63, ну это не хитрость.... и подходит только для кат-сцен. (Любишь ты их как я погляжу :D)
Если нужно непосредственно в игре такое делать, то этот способ не рационален.


EshfordДата: Понедельник, 04 Апреля 2011, 17:04 | Сообщение # 154
Богиня Гамака ♥
Сейчас нет на сайте
Quote (LunarPixel)
подходит только для кат-сцен. (Любишь ты их как я погляжу :D)

biggrin Извиняюсь если что-то не так.
Смотрю я что-то, оказывается сам ничего не умею bag
FerrumelДата: Понедельник, 04 Апреля 2011, 17:45 | Сообщение # 155
почти ветеран
Сейчас нет на сайте
Naruto-63, а что такое кат-сцена?

LunarPixel, Круто! Замечательное объяснение. А я все думал как там таймер считается, в миллисекундах? Вроде нет(( Опыты попроводил, ничо не понял. Еще сейчас попроводил опытов, вроде что то стало проявляться.
Кстати, изготовил настоящую тестовую комнату с графикой которая будет в игре, тоесть уже примеряю отрисованные элементы к физике и движению персонажа. Там протестирую основные формы движения, подбор предметов, их использование и так далее и тому подобное. Заведу темку в "проекты в разработке" там можно уже будет попрыгать немного.
Все равно я по своему решил как запрыгивать и спрыгивать с платформ, несколько резковато, но глаз уже не раздражает.


все серо и пусто

Сообщение отредактировал Ferrumel - Понедельник, 04 Апреля 2011, 17:46
LunarPixelДата: Понедельник, 04 Апреля 2011, 17:51 | Сообщение # 156
старожил
Сейчас нет на сайте
Ferrumel, обращайся, если что... happy

Ну и к слову: кат-сцена - это момент в игре (как правило сюжетный), в котором игрок никак или почти никак не влияет на происходящее. Кат-сценой так же может быть видео вставка в игре, которая показывает развитие сюжета. Думаю понятно.


FerrumelДата: Понедельник, 04 Апреля 2011, 17:56 | Сообщение # 157
почти ветеран
Сейчас нет на сайте
Ага, понял, знаем. Когда главный злодей потрясает топором и ведет долгую глупую нудную беседу с главным героем.

все серо и пусто
LunarPixelДата: Понедельник, 04 Апреля 2011, 17:57 | Сообщение # 158
старожил
Сейчас нет на сайте
Ferrumel, да да... это именно оно самое... biggrin

AGENTX001Дата: Вторник, 05 Апреля 2011, 15:24 | Сообщение # 159
почётный гцупер
Сейчас нет на сайте
Quote (LunarPixel)
Naruto-63, ну это не хитрость.... и подходит только для кат-сцен. (Любишь ты их как я погляжу :D)
Если нужно непосредственно в игре такое делать, то этот способ не рационален.

Иногда это удобнее чем 153 пост) Например в файтингах.
LunarPixelДата: Вторник, 05 Апреля 2011, 15:42 | Сообщение # 160
старожил
Сейчас нет на сайте
Это совсем не удобно... А если нужно будет 5-10 клавиш ограничить, причем в разное время...!? Что ж тогда 10 одинаковых объектов создавать, с отличием в одно событие?! При этом условие, что клавиша снова должна работать через некоторое время, никуда не девается... значит через некоторое время объект нужно менять на старый... а это делается таймером... получается тоже самое что я описал, только с лишним геморроем... dry

Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг