Huricane, Спасибо, да, там явно косячное место было, я в разных примерах смотрел реализацию и что-то слепить пытался. Разобрался, сделал по-другому, без доп. состояния атаки.
if alarm[0] <= 0{ state = choose(state_enemy_wander, state_enemy_idle); alarm[0] = room_speed*irandom_range(1, 2); targetx = irandom(room_width); targety = irandom(room_height); }
и scr_check_player
Код
if (instance_exists(o_hero)) { var dis; dis = point_distance(x, y, o_hero.x, o_hero.y); if (dis < sight ) { state = state_enemy_chasing; targetx = o_hero.x; targety = o_hero.y;
} else { state_enemy_choose_next(); }
} else { state_enemy_choose_next(); }
и событие collision для врага и ГГ
Код
if (state != state_enemy_stall){ var dir; dir = point_direction(other.x,other.y, x, y); var xdir; xdir = lengthdir_x(1, dir); var ydir; ydir = lengthdir_y(1, dir); var damage; damage = instance_create(other.x+xdir, other.y+ydir, o_enemy_damage); damage.creator = id; state = state_enemy_stall; alarm[1] = room_speed; }
И все было бы здорово, если бы не следующие ситуации:
ситуация 1: иногда противник может атаковать с явно преувеличенной дистанции. при этом ударить нас он не может, а мы его вполне себе можем бить
ситуация 2: - самая главная проблема Заскринить не могу, но могу описать суть - персонаж противника после атаки внезапно начинает оббегать ГГ либо убегать непонятно куда, атакуя через секунду забежав к персонажу с рандомной стороны. как бы можно сказать что это фича, но это жутко раздражает, если честно
Опять же, необходимый код для других событий/объектов/скрипты могу предоставить
Уверен что проблема дурацкая и легко решаемая, но я уже не знаю как. Пробовал вместо mp_potential_step(o_hero.x, o_hero.y, sp, false); следующие варианты: move_towards_point(targetx, targety,sp); // просто после атаки пробегает сквозь персонажа, разворачивается и бежит сквозь персонажа в обратном направлении mp_potential_step_object(targetx, targety, sp, 0); //не заметил разницы с mp_potential_step и x += sign(targetx - x); //ужасно дрыгаясь прибегает к персонажу, атакует и так же ужасно дрыгаясь начинает оббегать y += sign(targety - y);
Лучше не стало. Увы. Надеюсь на вашу помощь
Сообщение отредактировал Daedros - Пятница, 29 Июля 2016, 00:36
BrightSpot, при изначальном движении к сундуку никаких срезов не образуется. Не могу понять причину их возникновения при движении за персонажем
Добавлено (02 февраля 2016, 19:15) --------------------------------------------- Ну тоже очевидно, что срезы образуются из-за косячного расчета пути в момент, когда моб находится на вершине лестницы, но еще не слез с неё, вот и пытается ближайшим образом попасть на твердую поверхность, а уже с неё нормально рассчитывает. Но я уже ума не приложу, как это можно исправить, может у кого-нибудь есть идеи? либо это как-то костыльно решать, убирал твердость у стены при контакте с врагом, он же все равно движется по маршруту и не падает. но уже добравшись до цели шлепается, плюс ГГ проваливается
Сообщение отредактировал Daedros - Вторник, 02 Февраля 2016, 19:23
Рассчитываю пути через сетку, враги исправно бегут к цели, поднимаясь и спускаясь по лестницам. При приближении персонажа, их цель перемещается на него, и путь рассчитывается уже за персонажем. Казалось бы все хорошо, но при спуске-подъеме на лестницу, в момент перехода с неё на твердые блоки, персонажи застревают. 1) Изначально все поняли свой путь, успешно идут по нему, залезают на блоки.
2) Пытаются построить свой путь до объекта игрока - тупят
3) вот такая картина в итоге - стоят и не могут слезть/залезть
maksim1221232, спасибо, хоть и в целом, это было очевидно уже исходя из функции, и того, что она возвращает.
Все еще нужна помощь с рандомом (пусть ИИ стреляет рандомными заклинаниями, исходя из трех возможных). И, видимо, нужны хорошие примеры поведения ИИ для платформера, когда он умеет прыгать по препятствиям двигаясь к цели maksim1221232, спасибо, хоть и в целом, это было очевидно уже исходя из функции, и того, что она возвращает.
Все еще нужна помощь с рандомом (пусть ИИ стреляет рандомными заклинаниями, исходя из трех возможных). И, видимо, нужны хорошие примеры поведения ИИ для платформера, когда он умеет прыгать по препятствиям двигаясь к цели UPD при помощи дебага, проблема с рандомом была решена
Код
xx = random(1); if xx > 0.5 { b = instance_create(x,y,fireball);} if xx < 0.5 {b = instance_create(x,y,frostarrow);}
Разыскиваются примеры движения ИИ:)
Сообщение отредактировал Daedros - Суббота, 30 Января 2016, 21:01
DIDA, Спасибо огромное, сменил название, не знал про instance_nearest() Теперь самое главное разобраться с правильным поведением для ИИ, чтобы прыгали на "пол", спрыгивали. И, поскольку у меня используется if (distance_to_object(hero_o) < 400){move_towards_point(hero_o.x,hero_o.y,5);} ИИ напрочь забывает про гравитацию, просто летит в игрока
Сообщение отредактировал Daedros - Суббота, 30 Января 2016, 11:37
Всем привет. Возникла проблема. Делаю платформер, суть в двух словах - есть враги, которые при старте комнаты идут к сундукам, адекватно перепрыгивая препятствия. Подходят к сундучку, "грабят" его, идут к следующему, если они еще остались. Главный герой должен защитить сундуки на уровне, соответственно, если его убьют либо полностью ограбят - поражение. Помимо этого, враги при дистанции, пусть будет условно, 400, бегут за ГГ, а при дистанции, опять же, условно, 200 - начинают кидать в него заклинания. А теперь что, собственно, меня беспокоит - объект сундук (chest) у меня один. Поэтому все ИИ начинают бежать к одному и тому же экземпляру объекта, потом бегут к следующему и т.д. в том порядке, в котором я их добавил в в комнату. Подскажите, как заставить их бежать к ближайшему экземпляру объекта? Применять костыль из нескольких сундуков плохо, потому что придется еще делать несколько одинаковых ИИ, только с разным порядком обхода сундуков. Дальше, прибежав к одному сундуку, все ИИ кучкуются, и в итоге после нескольких обходов сундуков совсем сливаются. Все мои попытки их отталкивать друг от друга, привели к тому, что они просто тупят. Не думаю что это как-то сложно исправить, особенно, если заставить их бегать отдельно, но хотелось бы и от этой фигни избавиться. Ну и на засыпку - адекватные пути. ИИ должны прыгать на блоки, спрыгивать с них при необходимости, чтобы добраться до сундуков. Перерыл кучу примеров, выбрал на мой взгляд самый адекватный - http://rghost.ru/6fxcN7yJv (называется platform_exampl.gmk) В этом примере ИИ "агрится" на ГГ и преследует его, перепрыгивая препятствия, чтобы сделать выстрел. Пытался разобраться и переделать под конкретно свой случай - мои ИИ сразу поворачивают направо и бегут до упора, потом успешно застревают И последнее, пытался чтобы вместо одних лишь фаерболов, враги могли кидать и другие заклинания. Но они просто прекратили вообще что-то делать и перешли врукопашную. ЧЯДНТ?
Без проблем могу скинуть куски кода проекта, либо сам целиком. Надеюсь, форум еще жив и мне помогут) Последний раз делал что-то на гейммейкере года 4 назад)
Step для enemy
Код
if (place_free(x,y+1)) { gravity_direction = 270; gravity = 1; } if (vspeed > 12) { vspeed = 12; }
if (distance_to_object(hero_o) < 400) { move_towards_point(hero_o.x,hero_o.y,5); if distance_to_object(hero_o) < 200 if can_shoot = true { speed = 0 b = instance_create(x,y,fireball) can_shoot = false alarm[0] = 40 } }
Alexis-63, а вот это уже неплохо звучит, спасибо, потом попробую подумать в этом направлении. у меня рисуется спрайт, можно изменять его размер при условии, что расстояние до стены = n?
Добавлено (10.11.2012, 02:42) --------------------------------------------- но получится не совсем то. заденет краем спрайт света, и все, дальше не пойдет
Alexis-63, я выкрутился по-другому, коридоры - по толстым черным стенам не понятно, просвечивает ли фонарик хотя в углах можно просветить так, что свет входит в стену и выходит сквозь, но делать заплатками я не смогу, т.к. работать с сурфейсами не умею вообще.
draw_healthbar(x1,y1,x2,y2,amount,backcol,mincol,maxcol,direction,showback,showborder) Используя эту функцию, Вы можете нарисовать healthbar (индикатор здоровья) (или любую другую область, которая указывает некоторую величину, например - ущерб). Аргументы x1, y1, x2 и y2 указывают общую область. amount - указывает процент области, которая должна быть закрашена (должно быть между 0 и 100). backcol - цвет фона для области. mincol и maxcol - указывает цвет, когда значение 0 и 100 соответственно. Между ними рисуется градиент. Итак, Вы можете легко нарисовать область, которая будет, например: от зелёного до красного цвета. direction - является направлением, в котором рисуется область. 0 - указывает, что область фиксируется слева, 1 - справа, 2 - вверху и 3 - внизу. Наконец showback - указывает, должен ли блок фона быть отображён, и showborder - указывает должны ли они иметь чёрную граничную линию.
объект, создающий сурфейс: if lighter = true and global.fonarikenergy>0 { draw_set_blend_mode(bm_subtract) draw_sprite_ext(spr_light,-1,o_hero.x,o_hero.y,1,1,o_hero.image_angle,c_white,0.6) global.usefonarik=1 }
который, при условии что заряд фонарика больше нуля, дает переменной, отвечающей за использование фонарика значение true
объект ГГ, в степе: if global.usefonarik=1 alarm[1]=30
скорость комнаты - 30
в аларме, соответственно:
global.fonarikenergy-=1 if global.fonarikenergy<0 global.fonarikenergy=0 if global.fonarikenergy>0 and global.usefonarik=1 alarm[1]=30
и есть инвентарь из примера Dva_kota, в котором case obj_battery: global.fonarikenergy=100; break; ну то есть при использовании из инвентаря батарейки заряд восполняется.
это должно работать, но мне надо показать пользователю, что заряд батарейки уменьшается со временем. и я не знаю как это делать, а из справки не понял. помогите, пожалуйста. нужен индикатор типа полоски хп, над o_hero, но с переменной fonarikenergy
Добавлено (06.11.2012, 23:54) --------------------------------------------- Hamster099, о, норм, работает. просто из рук валится все сегодня весь день. спасибо) репа не повышается Т_Т
Сообщение отредактировал Daedros - Вторник, 06 Ноября 2012, 23:54
Здравствуйте, подскажите, пожалуйста, как сделать так, что бы объект создавался и всегда находился в точке view_xview+8,view_yview+60 и никуда от туда не девался? я решил сделать объект невидимым, заставить его всегда идти в эту точку, а поверх рисовать спрайт этого объекта, так как я знаю, как заставить спрайт оставаться в той точке, но наверняка есть решение проще
Hamster099, фонарик на F включается сверху значек глаза - "моргометр", каждые 10 секунд персонаж моргает. но это уже к делу не относится) спасибо, попробую сейчас
Добавлено (05.11.2012, 14:13) --------------------------------------------- Hamster099, все работает, большое спасибо, держи +
прикреплю пример http://zalil.ru/33926553 удалил все, что связано с кашлем, но звук там есть может быть кто-то сможет придумать что-нибудь еще и с освещением, что бы свет не проходил сквозь стены
Здравствуйте, вопрос заезженный, смотрел, как надо делать, но не получается (Т_Т) как реализовать следующие вещи: 1) есть фоновая музыка. работает 2) ГГ попадает на объект, создается эффект дым, должен проигрываться звук кашель - не работает, выключается фоновая музыка, жутко лагает, выхожу из дыма - работает кашель 3) появляется монстр - проигрывается звук - после тестов с кашлем даже не стал пробовать
Здравствуйте, у меня возникла проблема, а как ее решить я не знаю, потому что с ГМ не имел дел более года. Суть - TDS, есть фонарик через сурфейсы, есть спрайт с "освещением". Проблема - фонарик светит "сквозь" стену. Как сделать так, что бы освещение при контакте со стеной не светило "внутрь", а как обрезалось что ли, надеюсь, вы поняли. Вот, собственно, примерчик: http://zalil.ru/33923534
Сообщение отредактировал Daedros - Воскресенье, 04 Ноября 2012, 18:59