Цепная молния
| |
nekroo98 | Дата: Четверг, 22 Августа 2013, 16:43 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Итак, здрасте. Возникла необходимость сделать "цепную молнию", и вот тут я столкнулся с неведомой фигней. Не знаю что делать
Суть:
ударяем врага молнией, если в радиусе 2х клеток от врага (поле 5х5) есть другой враг - ударяем его тоже, и если есть - то третьего.
И конечно, отрисовываем спрайт молнии(ну точнее это обьект, со спрайтом). Так, вот, какой то косяк с углом поворота спрайта, не могу понять почему(image_angle параметр), что туда не пишу, угол не меняется. И следущее - молния не перебрасывается на следущего врага. Тоесть совсем.
Я сделал перебором всех клеток типа Код если тут есть враг то {создать молнию2, фигануть ему урон, и тд} ... и так все 25 клеток но нифига не работает. В поиске не нашел чего-то подобного по ГМу. Старожилы, помогите советом.
Сообщение отредактировал nekroo98 - Четверг, 22 Августа 2013, 16:43 |
|
| |
LunarPixel | Дата: Четверг, 22 Августа 2013, 17:00 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Цитата (nekroo98) Так, вот, какой то косяк с углом поворота спрайта, не могу понять почему(image_angle параметр), что туда не пишу, угол не меняется. Может используется событие рисования и спрайт выводится через него. Тогда нужно использовать draw_sprite_ext() и там менять параметр, отвечающий за угол поворота.
Для остального, покажи код, чтобы на ошибку указать можно было.
|
|
| |
qazer | Дата: Четверг, 22 Августа 2013, 17:01 | Сообщение # 3 |
Borey Games
Сейчас нет на сайте
| На первый вопрос можно с ходу ответить: если у тебя в объекте есть событие draw, то воспользуйся функцией draw_sprite_ext, там можно указать угол.
|
|
| |
stalker5889 | Дата: Четверг, 22 Августа 2013, 17:02 | Сообщение # 4 |
Свободный игродел
Сейчас нет на сайте
| Цитата (nekroo98) И следущее - молния не перебрасывается на следущего врага. Тоесть совсем. Скорее всего молния перебрасывается на начального врага - т.е никуда не двигается. Поставь проверку: если ид цели, не ид первого врага то перебрасываемся. Как то так.Цитата (nekroo98) (image_angle параметр Может image_angle=параметр? А если обращение к молнии идёт от цели то пиши ид_выпущенной_молнии.image_angle=параметр. Хотя может я чего то не понял.
|
|
| |
qazer | Дата: Четверг, 22 Августа 2013, 17:02 | Сообщение # 5 |
Borey Games
Сейчас нет на сайте
| Не успел, lunar, только ext.
|
|
| |
Dmi7ry | Дата: Четверг, 22 Августа 2013, 17:08 | Сообщение # 6 |
почетный гость
Сейчас нет на сайте
| Как-то делал что-то похожее. пример Может на какие-то мысли натолкнёт.
|
|
| |
Krosos | Дата: Четверг, 22 Августа 2013, 17:08 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| Я тоже сначала хотел сделать , но я подумал :мои нервы подобного не выдержат...
Дам подсказку , надеюсь очень поможет. Вот так атакует мой ИИ магией , попробуй извлечь пользу от этого кода:
if SelestTarget=1{ //Если началось событие , когда и нужно выбрать цель with attack_Tile{ //Дальнейший код для всех ячеек атаки if collision_rectangle(x-31.99,y-31.99,x+31.99,y+31.99,KleymoOfAlied,0,0){Atile=1}else{Atile=0} //Если игрок находится в ячейке атаки , то ячейка принимает на себя значение Atile=1(Имеет в себе союзника) иначе Atile=0 (Ячейка пустая) if Atile=1{//Если в ячейке кто-то есть timers+=random_range(1,2) //Вводим таймер случайности (Чтобы был случайный выбор цели , иначе атакована всегда будет верхняя угловая цель) if timers>=5{timers=0 //Если наш таймер достиг значения 5 , то обнуляем его и переходим к следующим действиям global.Sunit.SelestTarget=0 //Для юнита который сейчас ходил выбор цели закончен (global.Sunit - это ид игрока) , а все клетки которые не успели досчитать - идут нафиг... global.AttackPoint=id //Объявляем ячейку атакуемой global.Sunit.goattack=1//Начинаем следующий этап атаки для выбранного игрока }}}} Дальше происходит атака магией на атакуемую клетку. Этот код подходит для любой моей магии.
Мой проект
|
|
| |
nekroo98 | Дата: Четверг, 22 Августа 2013, 18:41 | Сообщение # 8 |
почетный гость
Сейчас нет на сайте
| Спасибо за пример, но это не то. Создатель молнии, и враг, на которого она направлена определяются в первую очередь, по ним уже создается обьект-молния, и тд. При этом молния перебрасывается 3 раза максимум, не учитывая столкновения с обьектами вообще никак.
Спрайт присваивается в свойствах. В степе меняется image_angle. Через draw - такая же херня.
Быдлокод следущий:
// сначала создаем обьект - инициатор, наводим его на врага - клацаем кнопку, и создается обьект молния. Инициатор записывает ид цели и создателя и передает их в молнию.
сама молния STEP image_angle = *тут какая-то формула с вычислением угла до обьекта-врага - 125, но в другом обьекте это работает как надо, реализовано так же* if attack = 0 {vrag.input_lightning_damage = sozdatel.lightningatk; vrag.input_magic_damage = sozdatel.matk; attack = 1} //присваиваем атакуемому урон от атакующего, так как его обработка идет непосредственно в обьекте-юните if place_meeting(vrag.x - 100,vrag.y-100,team2) and perec = 0 {vrag_next = instance_place(vrag.x-100,vrag.y-100,team2); instance_create(vrag.x,vrag.y,обьект-молния-2); обьект-молния-2.sozdatel = sozdatel; обьект-молния-2.vrag = vrag_next; lightning_damage = sozdatel.lightningatk; magic_damage = sozdatel.matk; perec =1} ...... и так 24 строчки, исключая того, на кого направлена молния в первый раз. //тут проверяем - есть ли кто-то из врагов рядом, если есть то запускаем 2 кусок цепной молнии в него.
Сообщение отредактировал nekroo98 - Четверг, 22 Августа 2013, 19:28 |
|
| |
Krosos | Дата: Четверг, 22 Августа 2013, 19:47 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| nekroo98, 25 строк - это писец.Код очень трудно-понимаемый, а он должен быть очень простым ,чтобы подвергать его дальнейшим изменениям. Лучше всего использовать 1 функцию на строку , а не лепить кашу иначе очень не удобно его разбирать... Я бы сделал примерно так: 1.Создаются ячейки repeat(5){ 2.Сигнал ячейкам: 3.Проверка наличия игрока в ячейках 4.Проверка достижимости 5.Если ячейка еще не атаковалась 6.Если первые 3 условия совпали то объявляем ячейку глобально атакуемой 7.Если глобально атакуемая ячейка >0 , то атакуем ее иначе удаляемся } instance_destroy()
Вот примерно так.
Мой проект
Сообщение отредактировал Krosos - Четверг, 22 Августа 2013, 19:51 |
|
| |
nekroo98 | Дата: Четверг, 22 Августа 2013, 20:20 | Сообщение # 10 |
почетный гость
Сейчас нет на сайте
| Цитата (Krosos) 1.Создаются ячейки repeat(5){ 2.Сигнал ячейкам: 3.Проверка наличия игрока в ячейках 4.Проверка достижимости 5.Если ячейка еще не атаковалась 6.Если первые 3 условия совпали то объявляем ячейку глобально атакуемой 7.Если глобально атакуемая ячейка >0 , то атакуем ее иначе удаляемся } instance_destroy()
Честно говоря, вообще нифига не понял :). У меня система боя несколько другая. И в коде нет ничего сложного, просто переменные очень длинные.
суть в следущем, как я уже и писал Код если в клетке есть враг и молния2 не создана {записываем ид врага, создаем молнию2, записываем в неё ид врага и создателя. ставим переключатель "молния 2 создана", дальше код не идет}
Сделай пример, если не трудно, как должна работать твоя система.
|
|
| |
Krosos | Дата: Четверг, 22 Августа 2013, 22:18 | Сообщение # 11 |
постоянный участник
Сейчас нет на сайте
| nekroo98, а что у тебя за жанр игры?Если тактик , то все очень просто , а если экшн ,то там все намного труднее , особенно если есть несколько молний одновременно.
Мой проект
Сообщение отредактировал Krosos - Четверг, 22 Августа 2013, 22:56 |
|
| |
nekroo98 | Дата: Четверг, 22 Августа 2013, 22:57 | Сообщение # 12 |
почетный гость
Сейчас нет на сайте
| Цитата (Krosos) а что у тебя за жанр игры? TBS
ну это как например боевка в героях. пошаговая битва.
|
|
| |
Krosos | Дата: Пятница, 23 Августа 2013, 01:35 | Сообщение # 13 |
постоянный участник
Сейчас нет на сайте
| nekroo98, понятно , тогда все очень просто.Ладно , сейчас сделаю пример ,тогда и себе тоже возьму =P Добавлено (23.08.2013, 01:31) --------------------------------------------- Черт , я переоценил свои силы=( Столкнулся с двумя проблемами: 1. направление спрайтой во время атаки. 2. ограничение на поиск целей Добавлено (23.08.2013, 01:35) --------------------------------------------- Можно было сделать просто цель на ближайший объект - это было бы намного проще и удобнее.
Мой проект
|
|
| |
nekroo98 | Дата: Пятница, 23 Августа 2013, 09:19 | Сообщение # 14 |
почетный гость
Сейчас нет на сайте
| Лол
Что значит ограничение на поиск цели?
Делать через ближайший обьект - instance_nearest - не прокатывает естественно, потому, что ближайший объект будет тот, в кого полетела 1 молния. Если придумаешь, как обойти это, скажи.
Направление спрайта у меня делается таким образом Step Код image_angle=(point_direction(0,0,vrag.x+25,vrag.y+25))-135; 0,0- это соответственно координаты начальной точки спрайта. vrag.x+25, vrag.y+25 - это координаты середины спрайта обьекта-врага.
Что я делаю не так?
Сообщение отредактировал nekroo98 - Пятница, 23 Августа 2013, 09:19 |
|
| |
Dmi7ry | Дата: Пятница, 23 Августа 2013, 10:52 | Сообщение # 15 |
почетный гость
Сейчас нет на сайте
| Цитата (nekroo98) Спасибо за пример, но это не то. Создатель молнии, и враг, на которого она направлена определяются в первую очередь, по ним уже создается обьект-молния, и тд. При этом молния перебрасывается 3 раза максимум, не учитывая столкновения с обьектами вообще никак. Да, собственно, переделать - дело десяти минут, но вам, похоже, нужно, чтобы за вас полностью всё сделали...
|
|
| |
stalker5889 | Дата: Пятница, 23 Августа 2013, 11:14 | Сообщение # 16 |
Свободный игродел
Сейчас нет на сайте
| Цитата (nekroo98) Если придумаешь, как обойти это, скажи. По id. Одна лишняя проверка, всего то.
|
|
| |
nekroo98 | Дата: Пятница, 23 Августа 2013, 15:15 | Сообщение # 17 |
почетный гость
Сейчас нет на сайте
| Цитата (Dmi7ry) Да, собственно, переделать - дело десяти минут, но вам, похоже, нужно, чтобы за вас полностью всё сделали...
Ну да, конечно. Не зная устройство и систему всей боевки, заявлять такое. Я не дурак и прекрасно знаком с gml, ну почти. И поверь мне, твой пример ну вообще никак не подходит, совсем. Мне не нужно, чтобы делали что-то за меня, мне нужен толчок, в каком направлении копать. Потому что то, что делаю я почему то не работает, и я понятия не имею почему, вроде должно Добавлено (23.08.2013, 11:25) ---------------------------------------------
Цитата (stalker5889) По id. Одна лишняя проверка, всего то.
Всмысле по ид? instance_nearest не учитывает ид ведь, просто тупо берет ближайший объект и все. А этим объектом является родитель "team2", который стоит у всех врагов. Объясни как прилепить проверку, я не понимаю?Добавлено (23.08.2013, 15:15) --------------------------------------------- В общем дело такое. Нашел я косяк с отображением спрайта. Формула должна быть следущая, если кому надо
Код image_angle=(point_direction(x,y,vrag.x,vrag.y))+90;
Где vrag - ид обьекта, в которого бьет молния. Ну или что там у вас.
А косяк как всегда был неожиданным. В моем случае в переменную vrag записывалась еденица. Понятия не имею почему и как. Создал отдельный обьект, который уже сам создает молнию и уничтожается, и вуаля, как часы работает.
Спасибо за ответы, я это ценю. С уважением :).
|
|
| |
Krosos | Дата: Пятница, 23 Августа 2013, 15:18 | Сообщение # 18 |
постоянный участник
Сейчас нет на сайте
| nekroo98, Цитата (nekroo98) Что значит ограничение на поиск цели? Это значит , чтобы он тебе не бил 100 целей а ударил только 5.Цитата (nekroo98) Делать через ближайший обьект - instance_nearest - не прокатывает естественно, потому, что ближайший объект будет тот, в кого полетела 1 молния. Если придумаешь, как обойти это, скажи. Я удаляю все метки под игроками , не удаляя под собой следующим кодом: if collision_rectangle(x-31.99,y-31.99,x+31.99,y+31.99,KleymoOfAlied,0,0) and distance_to_object(global.Sunit)>16 {instance_destroy()}
В твоем случае надо , просто создать метку над ближайшим игроком , и создавать от следующей , и так далее , но тогда не получится ограничить расстояние.В героях , насколько я помню , цепная молния била с не ограниченным расстоянием , всегда до 5 целей.
Мой проект
|
|
| |
MR_Borg | Дата: Пятница, 23 Августа 2013, 15:20 | Сообщение # 19 |
участник
Сейчас нет на сайте
| А не проще в обьекте молния создать лист из 5 целей и последовательно бить по врагу и незапариваться с метками.
Изучаю C++ попутно пишу игру.
|
|
| |
nekroo98 | Дата: Пятница, 23 Августа 2013, 15:43 | Сообщение # 20 |
почетный гость
Сейчас нет на сайте
| Цитата (MR_Borg) А не проще в обьекте молния создать лист из 5 целей и последовательно бить по врагу и незапариваться с метками.
не, не проще. молнии то может быть 3 штуки. все 3 - отдельные обьекты. и у меня нет меток, у меня просто по родителю определяется свой-чужой. такие дела
А ещё ограничение на дистанцию молнии - 2 клетки, что тоже нужно учитывать.Добавлено (23.08.2013, 15:43) ---------------------------------------------
Цитата (Krosos) В твоем случае надо , просто создать метку над ближайшим игроком , и создавать от следующей , и так далее ,
Вот нечто такое и было изначально, просто вместо врага молния била вникуда, ибо вместо id врага бралась еденичка.
Сообщение отредактировал nekroo98 - Пятница, 23 Августа 2013, 15:28 |
|
| |
|