Форум » Вопрос-Ответ » Мои вопросы по Gm » Ответить

Мои вопросы по Gm

PERLOVKA: Я хочу сделать A.I в Комической леталке(Вид с верху) Что бы он не тупо летел за какимто обектом, а мог уварчиватся от пуль, убегать. Ну или хотя бы просто что бы он не резко поворачивал а медлено как настоящий самолёт (типа direction+=1 ).

Ответов - 27

D(e)N: Сначала попробуй сделать без плавного поворота. Придумай алгоритм по которому ИИ будет работать, напиши его на русском, а затем реализуй в гамаке. Это не такая уж и простая штука, тут подумать немало нужно :)

PERLOVKA: Как то так У врага Если дистанция до Игрока менее 15 и Если direction менее 50 до point_direction(игрока) и Если скорость больше 7 то скорость равна больше семи direction = direction // это бред но может получиться что враг пролетит мимо из-за невозможности быстро повернуть. // теперь надо сделать разворот а то враг так и улетит на совсем. Хотя если у врага direction равна point_direction(игрока) то возможно враг начнёт разворачиватся. Ну это моя гипотеза так что не пишите что я какую то фигню написал.

ALIEN XIII: PERLOVKA пишет: Если скорость больше 7 то скорость равна больше семи Логично!


PERLOVKA: Ну да ) я кеп Надо скорость равна 7

PERLOVKA: Код будет выглядеть как то так : if distance_to_object(o_player)<15 { if direction<50.point_direction(x,y,o_player,x,o_player,y) //В этой строчке я не уверен может кот знает, как записать? { if speed>7 { speed=7 direction=direction // Здесь тоже что то не то, надо чтобы direction не изменялась. } } }

Ev-genius: что значит if direction<50.point_direction ? и что значит direction=direction?

PERLOVKA: if direction<50.point_direction этой записью я хотел сказать что если корбль врага повёрнут от игрока больше чем не 50 градусов. а direction=direction я точно не знаю как записать надо чтобы градус в который повёрнут объект остался а не начал изменятся из-за direction=point_direction(x,y,o_player,x,o_player,y).

Ev-genius: в первой строке 50.point непонятно что означает эта точка, почему там не запятая или знак доллара какойнибудь? понимаете, то что вам нужно сделать не пишется в 2 строчки которые можно безмозгло вставить и всё будет работать. Тут дело в том, что ИИ пишется в зависимости от игры, в кажой свои детали учитываются, нет оригинального варианта который подойдет вам. поэтому единственный выход писать самому. Но, вы незнаете синтаксис и пишите <50.point мну например незнаю что означает точка, вы пишите direction=direction написать 10=10 подсилу только К.О. А главное за просто так писать вам игру никто не будет. Есть два выхода: -оплачиваете работу программисту и он делает всё за вас -изучаете сами. второй вариант займет больше времени и придется много думать. рекомендую ставить эксперименты, много и часто. перед тем как чтото сделать в игре, создаете новый проект в гамаке ставите туда шарики и экспериментируете с ними начиная с самого простого для начала сделайте чтобы он просто тупо летал и тупо стрелял. потом сделайте чтобы он тупо летал случайным образом поворачивая и тупо стрелял также потом обдумайте и сделайте чтобы он стрелял только тогда когда смотрит в сторону игрока. и потихоньку-постепенно усложняйте код. если вы не смогли разобраться в 5 строчках кода с радаром, то что уж говорить о 15-20 строчках ИИ. начинайте с малого, самого простого и примитивного

D(e)N: И еще небольшой совет :) Все эти if можно записать в одну строчку, и код станет проще. Все вот это if distance_to_object(o_player)<15 { if direction<50.point_direction(x,y,o_player,x,o_player,y) //В этой строчке я не уверен может кот знает, как записать? { if speed>7 { speed=7 direction=direction // Здесь тоже что то не то, надо чтобы direction не изменялась. } } } можно записать так: if distance_to_object(o_player)<15 && direction<point_direction(x,y,o_player,x,o_player,y) && speed>7 { speed=7 direction=direction } Вместо && можно использовать and.

PERLOVKA: Я же сказал что это моя гипотеза. И я не срисовал её откуда-нибудь а придумывал. Это как раз и есть мой "експеремент". Вот поэтому и точка, что експеремент.

Ev-genius: PERLOVKA пишет: Вот поэтому и точка, что експеремент. когда ставите эксперименты надо ставить знаки $ и @ вместо точек, иначе работать небудет а вообще повторюсь, открываете гм, создаете новый проект и пытаетесь там сделать самое простое. если не получается, делаете ещё проще выкидывая сложные детали.

PERLOVKA: На сколько я знаю если поставть @ или $ то работать точно не будет.

Ev-genius: не узнаете, пока не прочтете хелп по гм. благо есть переведенный русский вариант

PERLOVKA: Я насчёт медленного поворота у врага if direction<point_direction(x,y,o_player.x,o_player.y) { direction+=5 } if direction>point_direction(x,y,o_player.x,o_player.y) { direction-=5 } if direction=point_direction(x,y,o_player.x,o_player.y) { direction-=0 //тут можно написать + } Всё бы ни чего только например если у врага direction=14 а у игрока 354 то у врага direction увеличивается то есть он идёт в круговую вместо выгодново поворота. Можно устранить это так: if direction=14 && direction>point_direction(x,y,o_player.x,o_player.y) { direction-=5 } if direction=14 && direction<point_direction(x,y,o_player.x,o_player.y) { direction+=5 } Но как же остальные градусы? Не прописовать же каждый. Надо сделать как периоды типа с 0-90 градус, с 91-180 и так далее... Тока как прописать эти периоды?

PERLOVKA: Да уж как я сразу не додумался if direction<90 && direction<point_direction(x,y,o_player.x,o_player.y) { direction=+5 } if direction>270 && direction<point_direction(x,y,o_player.x,o_player.y) { direction=-5 } Теперь надо это проверить.

PERLOVKA: Хм... Почему то не работает Я даже сделал объект для отрисовки direction игрока и т.д. Что бы убедится что все direction и т.д. работают. Переменные та работоют а алгоритм нет ( Как будто я его не написал в Step'е у врага! Может что не так. А.I

zuko: Код поворота пушки в игре Jacal тот прицип что тебе нужен distance=ceil(point_distance(x,y,plar.px,plar.py)) image_angle=ceil(image_angle) if distance<dist && !collision_line(x,y,plar.x,plar.y,o_rockbord,1,1) { tochka=floor(point_direction(x,y,plar.px,plar.py)) } else { if ch=180 { gg=0 } if gg=0 { if timerr>room_speed*paus { tochka=floor(random(360/pov))*pov gg=1 timerr=0 } timerr+=1 } } if image_angle>tochka { ch=image_angle-tochka } if image_angle<tochka { ch=image_angle+(360-tochka) } if image_angle=tochka { ch=180 } if ch>180 { image_angle+=spd } if ch<180 { image_angle-=spd } if image_angle<0 image_angle=359 if image_angle>359 image_angle=0 В коде реализовано так, если игрока в радиусе distance не видно { то рандомом придумывать точку поворота } иначе точка поворота игрок далее определяется оптимальный угол поворота http://www.gamecreating.ru/zuko/МоиПроекты/jacal исходники тут есть

PERLOVKA: Для меня это сложный код. Много чего не понятно, но разбираться я буду не много поже. У меня другой вопрос. В платформере как сделать что бы враг изменял свой спрайт в зависимости куда он идёт?

D(e)N: Писал как-то очень хитрый код на эту тему, но приведу слегка упрощенный :) Используй draw_sprite_ext(). в нем есть такой аргумент как xscale. Это растяжение спрайта по оси x. Если его значение равно 1, то спрайт рисуется как обычно. Если присвоить значение -1, то спрайт будет рисоваться наоборот. Проверить в какую сторону движется враг можно с помощью x и xprevios. Вотъ) Если сам не поймешь как сделать, то сделаю примерчик.

sanchez: Тупой вопрос, а когда выйдет ГМ 9?

D(e)N: Думаю не скоро) Еще не все баги в 8.1 исправили, так что..

PERLOVKA: sanchez пишет: Тупой вопрос Ну тупой не тупой я всё же новичок )

sanchez: PERLOVKA да я не про твой вопрос говорю) не подумай)

PERLOVKA: А это про Gm 9, ну тогда понятно )

PERLOVKA: Вобще я нарисовал два спрайта. И решил эту проблему так. Если A.I. у врага вот такой: if distance_to_object(o_player)<300 { direction=point_direction(x,y,o_player.x,o_player.y) speed=3 vspeed=0 } то ниже надо прописать: if direction>90 { sprite_index=s_enemy_1_1 } if direction<90 { sprite_index=s_enemy_1_2 } И всё заработало

D(e)N: Проверь ситуацию, когда игрок справа-снизу от врага. По-моему, в этом случае враг будет не в ту сторону смотреть :)

PERLOVKA: А ну тогда код полностью будет такой: if distance_to_object(o_player)<300 { direction=point_direction(x,y,o_player.x,o_player.y) speed=3 vspeed=0 } if direction>90 && direction<270 { sprite_index=s_enemy_1_1 } if direction<90 { sprite_index=s_enemy_1_2 } if direction>270 { sprite_index=s_enemy_1_2 }



полная версия страницы