Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Закрытая тема
 
Опции темы
Старый 04.07.2007, 11:36   #1
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Избежание погрешностей (AI)

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

На картинке показано, что Position_X = 69,9995
Как мне избежать таких погрешностей?
(Offline)
 
Старый 04.07.2007, 11:39   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Избежание погрешностей (AI)

Position_X=Int(Position_X)
обратно всё исправит. Это баг блица, уже не раз обсуждалось.
О! Мак? Как вообще на маках живётся?
(Offline)
 
Старый 04.07.2007, 11:42   #3
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Избежание погрешностей (AI)

Сообщение от MoKa
Position_X=Int(Position_X)
обратно всё исправит. Это баг блица, уже не раз обсуждалось.
О! Мак? Как вообще на маках живётся?
Windows...тяжко живется)
Попробую по твоему совету щас сделать...
(Offline)
 
Старый 04.07.2007, 11:45   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Избежание погрешностей (AI)

Но! Делать не постоянно, а например когда нужно, например:
If Int(Position_X)-Position_X<.001 Position_X=Int(Position_X)
Или лучше самому прописывать в с определённым условием, более стабильным.
(Offline)
 
Старый 04.07.2007, 11:47   #5
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
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

И впринципе это работает без погрешностей, но вот когда ИИ производит поворот (из-за стены) или упирается в стену, то тут начинается...
(Offline)
 
Старый 04.07.2007, 11:48   #6
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Избежание погрешностей (AI)

Сообщение от MoKa
Но! Делать не постоянно, а например когда нужно, например:
If Int(Position_X)-Position_X<.001 Position_X=Int(Position_X)
Или лучше самому прописывать в с определённым условием, более стабильным.
То есть если погрешность, то через positionEntity ставить его на место?
(Offline)
 
Старый 04.07.2007, 12:02   #7
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Избежание погрешностей (AI)

Тут уже нужно делать проверку на текущее положение в определённой оси, т.к. как понял у тебя всё поле будет поделено на вертикальные и горизонтальные оси, поэтому и проверяй, а при несоответствии координат к оси, уже двигай.
Еслу у тебя они двигаються и не налезают на перегородки, то и колизия вообще не нужна, т.к. с ней гемороя на свою голову только.
Если погрешность, то менять координаты и ставить на место.
(Offline)
 
Старый 04.07.2007, 12:12   #8
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Избежание погрешностей (AI)

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

У меня ИИ сделан через массив. И проверяется, если впереди 0, то свободно.
(Offline)
 
Старый 04.07.2007, 12:13   #9
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений
(для 568 пользователей)
Re: Избежание погрешностей (AI)

Fant, сорри, это применимо к C\C#\C++.
А почему бы тебе просто не использовать целые числа? Целые прибавлять, целые отнимать. И все у тебя будет int
(Offline)
 
Старый 04.07.2007, 12:18   #10
Raiter
Гигант индустрии
 
Регистрация: 04.08.2006
Сообщений: 2,642
Написано 53 полезных сообщений
(для 92 пользователей)
Re: Избежание погрешностей (AI)

Может ему нужна скорость 0.04, а не 1, например ?
(Offline)
 
Старый 04.07.2007, 12:19   #11
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Избежание погрешностей (AI)

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

Тогда он уткнется в стенку
Таймер у меня целый. От 1 до 10 считает (>=10)
А вот скорость ИИ должна быть .1 иначе быстро получается
(Offline)
 
Старый 04.07.2007, 12:21   #12
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Избежание погрешностей (AI)

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

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

Может ему нужна скорость 0.04, а не 1, например ?
Нельзя использовать такие большие координаты, придерживайтесь масштаба (Проверено!), это удобно и лишняя головная боль не будет тревожить! Масштаб: 10Единиц = 1Метр
(Offline)
 
Старый 04.07.2007, 12:21   #13
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Избежание погрешностей (AI)

Сообщение от Raiter
Может ему нужна скорость 0.04, а не 1, например ?
А разница?
(Offline)
 
Старый 04.07.2007, 12:27   #14
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Избежание погрешностей (AI)

Сообщение от MoKa
Значит у тебя двух мерный массив - карта проходимости.
Тогда зачем таймер? Если можно просто двигать его, и проверять в карте проходимости: стоит ли по направлению объект, если да, то поворачивать, тут стадия бота с "Идти", меняется на "Поворачивать "+тут нужно проверять по карте проходимости, если справа пусто то "90", если слева пусто "-90", если и там и там пусто, то или то или другое, а если занято, то 180 или -180, и параметр, в который запишешь начальный градус перед поворотом, он будет делиться на 90, дальше в цикле, выбираем режим поворота, и соответственно, положительное\отрицательное, в ту сторону и крутим, и проверяем на разницу текущего градуса и начального перед началом поворота, если она (разница), будет больше\меньше (зависит положительное или отрицательное), то поворачивать его опять только на тот же градус (малоли погрешность), и переходить в режим "Двигать".
Надеюсь система понятна?
Понятно) я так хотел еще полгода назад сделать. Дело в том что у меня с массивом так:
Local obj_x = Int((EntityX (obj)/10))
Local obj_z = Int ((EntityZ (obj)/10))
Округление)
И получается, что когда ИИ (или даже игрок) зайдет большей половиной на клетку, то происходит проверка и он останавливается на полпути ИБО дальше не идет так как там якобы "препядствие". Для этого я установил таймер. Когда срабатывает "якобы препядствие" я отсчитываю еще 10 и получаю что ИИ упирается в стенку
(Offline)
 
Старый 04.07.2007, 12:35   #15
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Избежание погрешностей (AI)

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com