forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Избежание погрешностей (AI) (http://forum.boolean.name/showthread.php?t=3814)

Fant 04.07.2007 11:36

Избежание погрешностей (AI)
 
Вложений: 2
Вообщем сделал я простенький ИИ для игры, но когда он "поворачивает" то координаты, по которым он "ездит" сбиваются немного

На картинке показано, что Position_X = 69,9995
Как мне избежать таких погрешностей?

moka 04.07.2007 11:39

Re: Избежание погрешностей (AI)
 
Position_X=Int(Position_X)
обратно всё исправит. Это баг блица, уже не раз обсуждалось.
О! Мак? Как вообще на маках живётся? ;)

Fant 04.07.2007 11:42

Re: Избежание погрешностей (AI)
 
Цитата:

Сообщение от MoKa
Position_X=Int(Position_X)
обратно всё исправит. Это баг блица, уже не раз обсуждалось.
О! Мак? Как вообще на маках живётся? ;)

Windows...тяжко живется)
Попробую по твоему совету щас сделать...

moka 04.07.2007 11:45

Re: Избежание погрешностей (AI)
 
Но! Делать не постоянно, а например когда нужно, например:
If Int(Position_X)-Position_X<.001 Position_X=Int(Position_X)
Или лучше самому прописывать в с определённым условием, более стабильным.

Fant 04.07.2007 11:47

Re: Избежание погрешностей (AI)
 
Цитата:

Сообщение от JohnK
Округляй до целого. (int) переменная.

Какую именно переменную округлять?

Вот так он у меня "ходит"

en1\timer#=en1\timer#+en1\speed#
If en1\timer#<=10 Then en1\speed#=.1 Else en1\speed#=0

If en1\timer#>=10 And en1\understand_f=0 Then en1\timer#=0
если таймер больше 10 и впереди свободно, то таймер опять на 0

И впринципе это работает без погрешностей, но вот когда ИИ производит поворот (из-за стены) или упирается в стену, то тут начинается...

Fant 04.07.2007 11:48

Re: Избежание погрешностей (AI)
 
Цитата:

Сообщение от MoKa
Но! Делать не постоянно, а например когда нужно, например:
If Int(Position_X)-Position_X<.001 Position_X=Int(Position_X)
Или лучше самому прописывать в с определённым условием, более стабильным.

То есть если погрешность, то через positionEntity ставить его на место?

moka 04.07.2007 12:02

Re: Избежание погрешностей (AI)
 
Тут уже нужно делать проверку на текущее положение в определённой оси, т.к. как понял у тебя всё поле будет поделено на вертикальные и горизонтальные оси, поэтому и проверяй, а при несоответствии координат к оси, уже двигай.
Еслу у тебя они двигаються и не налезают на перегородки, то и колизия вообще не нужна, т.к. с ней гемороя на свою голову только.
Если погрешность, то менять координаты и ставить на место.

Fant 04.07.2007 12:12

Re: Избежание погрешностей (AI)
 
Цитата:

Сообщение от MoKa
Тут уже нужно делать проверку на текущее положение в определённой оси, т.к. как понял у тебя всё поле будет поделено на вертикальные и горизонтальные оси, поэтому и проверяй, а при несоответствии координат к оси, уже двигай.
Еслу у тебя они двигаються и не налезают на перегородки, то и колизия вообще не нужна, т.к. с ней гемороя на свою голову только.
Если погрешность, то менять координаты и ставить на место.

Коллизия у меня есть. За перегородки и на кубики ИИ не влезает. Вот только не понял как ты мне предлагаешь его двигать? Может как-то можно сдлелать ИИ без этих проверок?

У меня ИИ сделан через массив. И проверяется, если впереди 0, то свободно.

johnk 04.07.2007 12:13

Re: Избежание погрешностей (AI)
 
Fant, сорри, это применимо к C\C#\C++.
А почему бы тебе просто не использовать целые числа? Целые прибавлять, целые отнимать. И все у тебя будет int :crazy:

Raiter 04.07.2007 12:18

Re: Избежание погрешностей (AI)
 
Может ему нужна скорость 0.04, а не 1, например ? ;)

Fant 04.07.2007 12:19

Re: Избежание погрешностей (AI)
 
Цитата:

Сообщение от JohnK
Fant, сорри, это применимо к C\C#\C++.
А почему бы тебе просто не использовать целые числа? Целые прибавлять, целые отнимать. И все у тебя будет int :crazy:

Что бы ИИ корректно ездил, я должен
1. Проверить есть ли препядствие
2. Пустить таймер до 10.

Тогда он уткнется в стенку
Таймер у меня целый. От 1 до 10 считает (>=10)
А вот скорость ИИ должна быть .1 иначе быстро получается

moka 04.07.2007 12:21

Re: Избежание погрешностей (AI)
 
Значит у тебя двух мерный массив - карта проходимости.
Тогда зачем таймер? Если можно просто двигать его, и проверять в карте проходимости: стоит ли по направлению объект, если да, то поворачивать, тут стадия бота с "Идти", меняется на "Поворачивать "+тут нужно проверять по карте проходимости, если справа пусто то "90", если слева пусто "-90", если и там и там пусто, то или то или другое, а если занято, то 180 или -180, и параметр, в который запишешь начальный градус перед поворотом, он будет делиться на 90, дальше в цикле, выбираем режим поворота, и соответственно, положительное\отрицательное, в ту сторону и крутим, и проверяем на разницу текущего градуса и начального перед началом поворота, если она (разница), будет больше\меньше (зависит положительное или отрицательное), то поворачивать его опять только на тот же градус (малоли погрешность), и переходить в режим "Двигать".
Надеюсь система понятна? ;)

Цитата:

2. Пустить таймер до 10.
Не факт, ты его юзаешь т.к. проходя эти 10, бот будет какраз в координате перекрёстка, а это можно проверить координатами.

Цитата:

Может ему нужна скорость 0.04, а не 1, например ?
Нельзя использовать такие большие координаты, придерживайтесь масштаба (Проверено!), это удобно и лишняя головная боль не будет тревожить! Масштаб: 10Единиц = 1Метр

Fant 04.07.2007 12:21

Re: Избежание погрешностей (AI)
 
Цитата:

Сообщение от Raiter
Может ему нужна скорость 0.04, а не 1, например ? ;)

А разница?

Fant 04.07.2007 12:27

Re: Избежание погрешностей (AI)
 
Цитата:

Сообщение от MoKa
Значит у тебя двух мерный массив - карта проходимости.
Тогда зачем таймер? Если можно просто двигать его, и проверять в карте проходимости: стоит ли по направлению объект, если да, то поворачивать, тут стадия бота с "Идти", меняется на "Поворачивать "+тут нужно проверять по карте проходимости, если справа пусто то "90", если слева пусто "-90", если и там и там пусто, то или то или другое, а если занято, то 180 или -180, и параметр, в который запишешь начальный градус перед поворотом, он будет делиться на 90, дальше в цикле, выбираем режим поворота, и соответственно, положительное\отрицательное, в ту сторону и крутим, и проверяем на разницу текущего градуса и начального перед началом поворота, если она (разница), будет больше\меньше (зависит положительное или отрицательное), то поворачивать его опять только на тот же градус (малоли погрешность), и переходить в режим "Двигать".
Надеюсь система понятна? ;)

Понятно) я так хотел еще полгода назад сделать. Дело в том что у меня с массивом так:
Local obj_x = Int((EntityX (obj)/10))
Local obj_z = Int ((EntityZ (obj)/10))
Округление)
И получается, что когда ИИ (или даже игрок) зайдет большей половиной на клетку, то происходит проверка и он останавливается на полпути ИБО дальше не идет так как там якобы "препядствие". Для этого я установил таймер. Когда срабатывает "якобы препядствие" я отсчитываю еще 10 и получаю что ИИ упирается в стенку

Fant 04.07.2007 12:35

Re: Избежание погрешностей (AI)
 
Вот игрок у меня, например, без всяких погрешностей. Но там и константы (просто движения игрока не я делал и я в принципе на 100% не разобрался как там сделали так, что он без проблем ходит)


Часовой пояс GMT +4, время: 04:37.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot