Понедельник, 25 Ноября 2024, 10:34

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Передвижение бота
AGDMFGДата: Пятница, 01 Июля 2011, 21:44 | Сообщение # 1
участник
Сейчас нет на сайте
Приветствую.
Имеется персонаж и враг. Последний движется в сторону игрока по банальному:
Code
move_towards_point (player.x, y , 1)

Умеет взбираться и опускаться по лестнице с помощью
Код:
Code
у-=1
у+=1

если игрок неподалеку.

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

http://s016.radikal.ru/i335/1106/89/9c5045fe7451.png
GameMixДата: Пятница, 01 Июля 2011, 21:48 | Сообщение # 2
старожил
Сейчас нет на сайте
AGDMFG, можно сделать алгоритм, по которому бот будет искать ближайшую лестницу, идти к ней и подниматься, пока не окажется примерно на одном уровне с игроком по оси Y.

Steel Standoff - 2D аркада.
Мои статьи
AGDMFGДата: Пятница, 01 Июля 2011, 22:03 | Сообщение # 3
участник
Сейчас нет на сайте
аТнОтХоАн
Бот все это делает до поры до времени. Вернее до того (показано на рисунке) как окажется на одной х координате с игроком. После чего просто "трясется на месте".

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

у-=1  
  у+=1

Просто хотел послушать другие версии, ведь эта слабо годна в комнате с кучей платформ.
GameMixДата: Пятница, 01 Июля 2011, 22:09 | Сообщение # 4
старожил
Сейчас нет на сайте
Quote (AGDMFG)
После чего просто "трясется на месте".

Это можно исправить просто (в событии Step бота):
Code
if x>o_player.x-5 && x<o_player.x+5 {Действие}


Steel Standoff - 2D аркада.
Мои статьи
DemeronДата: Пятница, 01 Июля 2011, 23:10 | Сообщение # 5
User created in C++
Сейчас нет на сайте
Помоему, если будут ещо и препядствия, то всё это будет уж слишком неправильно и некрасиво... Лудше создать пару путей для карты и добавить координаты лесниц, после этого определять случайный (не самый короткий а случайны, для того чтобы красивее смотрелося) путь и идем к нужной леснице, чтобы добраться до игрока.
kasheyДата: Суббота, 02 Июля 2011, 02:03 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Quote (AGDMFG)
move_towards_point (player.x, y , 1)

А как ему не трястись, ведь условия то выполнены. Враг находится на своей у-координате, и х-координата совпадает с координатой игрока.

Как то вот так:

if player.y=y //можно задать и диапазон, если координаты не всегда совпадают
move_towards_point(player.x, y , 1)
else
{
if !place_meeting(x,y,stairs)
move_towards_point(instance_nearest(x,y,stairs).x, y , 1) // если ближайшая лестница находится над врагом а не сбоку, то лучше проверять еще и положение ее у-координаты относительно врага
else y+=1 // тут нужно еще добавить проверку на спуск/подъем по лестнице
}

Не совсем уверен что нигде не ошибся, но принцип думаю понятен?

Добавлено (02.07.2011, 00:30)
---------------------------------------------
Вот еще какая штука пришла в голову, вот только не смог решить каким образом выбирать в какую сторону идет поиск лестницы. Ну и конечно если на линии по х-координате нет лестницы по обе стороны - это гарантированный висяк. Хотя можно ограничить поиск координатами комнаты: 0>x_stairs>room_width

var x_stairs=x
while !position_meeting(x_stairs,y,stairs) x_stairs+=1
stairs_instance_nearest=instance_position(x_stairs,y,stairs)
move_towards_point(stairs_instance_nearest.x, y , 1)

Добавлено (02.07.2011, 02:03)
---------------------------------------------
Допер как сделать выбор направления.
Вместо одной переменной считаем две. Например stairs_left и stairs_right.
Получаем следующую последовательность:

var stairs_left=x; stairs_right=x;

while !position_meeting(stairs_left,y,stairs)||stairs_left>0 stairs_left-=1 ;
while !position_meeting(stairs_right,y,stairs)||stairs_right<room width stairs_right+=1 ;

if x-stairs_left>stairs_right-x&&stairs_left>0
{stairs_instance_nearest=instance_position(stairs_left,y,stairs)
move_towards_point(stairs_instance_nearest.x, y , 1)};

if x-stairs_left<stairs_right-x&&stairs_right<room_width x-=1
{stairs_instance_nearest=instance_position(stairs_right,y,stairs)
move_towards_point(stairs_instance_nearest.x, y , 1)};

Я уже не уверен что сам понял что написал, время то позднее. Ну вдруг поможет кому нибудь, будет здорово smile

AGDMFGДата: Суббота, 02 Июля 2011, 02:35 | Сообщение # 7
участник
Сейчас нет на сайте
По-мойму
Code
move_towards_point(instance_nearest
будет работать ни чуть не хуже, той на вид, страшной последовательности, что датируется (02.07.2011, 02:03) smile
Спасибо, что напомнил про него.
Оставил свой вариант - вопрос исчерпан.
kasheyДата: Суббота, 02 Июля 2011, 15:58 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Ближайшая лестница не всегда находится на одной высоте с врагом. Так что instance_nearest() может сработать так же как и твой move_towards_point. Враг будет пробуксовывать находясь над лестницей.
  • Страница 1 из 1
  • 1
Поиск:

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