Четверг, 12 Декабря 2024, 10:18

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Цепная молния
nekroo98Дата: Четверг, 22 Августа 2013, 16:43 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Итак, здрасте. Возникла необходимость сделать "цепную молнию", и вот тут я столкнулся с неведомой фигней. Не знаю что делать smile

Суть:

ударяем врага молнией, если в радиусе 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
почетный гость
Сейчас нет на сайте
Лол smile

Что значит ограничение на поиск цели?

Делать через ближайший обьект - 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, ну почти. И поверь мне, твой пример ну вообще никак не подходит, совсем.
Мне не нужно, чтобы делали что-то за меня, мне нужен толчок, в каком направлении копать. Потому что то, что делаю я почему то не работает, и я понятия не имею почему, вроде должно biggrin

Добавлено (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 - отдельные обьекты. и у меня нет меток, у меня просто по родителю определяется свой-чужой. такие дела smile

А ещё ограничение на дистанцию молнии - 2 клетки, что тоже нужно учитывать.

Добавлено (23.08.2013, 15:43)
---------------------------------------------

Цитата (Krosos)
В твоем случае надо , просто создать метку над ближайшим игроком , и создавать от следующей , и так далее ,


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


Сообщение отредактировал nekroo98 - Пятница, 23 Августа 2013, 15:28
  • Страница 1 из 1
  • 1
Поиск:

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