forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Удаление типа и ссылок на него. (http://forum.boolean.name/showthread.php?t=17713)

CRASHER 03.01.2013 23:29

Удаление типа и ссылок на него.
 
Возьмем простой пример коровы и их пища трава. Трава растет кустами. Куст создается типом Grass. Удалить ее не сложно, корова рядом? тогда Delete grs.Grass. Но дело в том, что у меня для каждой коровы, из большого числа кустов, набираются в личный массив самые близкие кусты(записывается Энтити). Я удаляю ссылку на энтити для одной коровы которая подошла первая, как можно удалить и другие ссылки? Пытался проверять на Null или "0" тех коров которые не нашли куст но его уже съела другая. Если делать Хендлами то вроде проблемы не будет, но код переписывать не охото. Мож есть какие способы понять удален ли энтитя? Прошу прощения за коровы и кусты если они вам показались глупым примером :)

ABTOMAT 03.01.2013 23:32

Ответ: Удаление типа и ссылок на него.
 
Цитата:

Мож есть какие способы понять удален ли энтитя?
Nein. Только Handle-Object, только жёсткое ядро.

CRASHER 03.01.2013 23:37

Ответ: Удаление типа и ссылок на него.
 
Ну ведь блитз как то понимает что энтитя не найдена, и сообщает мемори ацесс... а если у него перехватить возможность? И часть кода перепрыгнуть где энтитя используется и удалить ссыль на которой споткнулся. Так нельзя не?)

tormoz 03.01.2013 23:44

Ответ: Удаление типа и ссылок на него.
 
А что за проблема проверить во всех возможных местах, и если хендл совпадает, удалить ?

CRASHER 03.01.2013 23:46

Ответ: Удаление типа и ссылок на него.
 
tormoz,ну))) я так понимаю ты хочеш сказать следующее: пробежатся по циклу из 999 кустов у каждой из 300 коров. Причем при почти каждом проходе основного кода, не жирно ли?))

Черный крыс 04.01.2013 00:05

Ответ: Удаление типа и ссылок на него.
 
разбей поле на сектора и пробегайся по нужным тебе секторам.

CRASHER 04.01.2013 00:21

Ответ: Удаление типа и ссылок на него.
 
Diablo1909, я вродеб хотел так сделать, но здесь у меня нет опыта в построении подобных структур, не хочется делать ряд секторов просто по цифре. Хочется сделать, по присутствии в одном из них хотябы одного животного, генерацию новых прилегающих секций. А значит заморачиваться с тем как определить с какой стороны от данной секции есть еще секции а с какой нет. Проще уж хендлами.

Черный крыс 04.01.2013 01:00

Ответ: Удаление типа и ссылок на него.
 
Сделать двухмерный массив списков, в которых хранятся травинки. Список - это и есть сектор. А двумерный массив - это дробление поля. А описпанная тобой проблема легко решается проверкой на "вылет" за пределы массива. И все, больше это дело не трогается.

Обновляем только коров, по их координатам XZ очень быстро определяем в каком секторе (списке) она находится, и обходим этот список, можно еще обойти соседние для верности.

Другое дело, что в Блиц3Д - это реализуется черезжоперно.
В БлицМаксе это делается легко и элегантно за 3 минуты.

CRASHER 04.01.2013 01:24

Ответ: Удаление типа и ссылок на него.
 
Diablo1909, не совсем понял. Если мы посмотрим конкретно сектор (0,0) он будет иметь свой центр с координатами?

Черный крыс 04.01.2013 01:39

Ответ: Удаление типа и ссылок на него.
 
да.

Для начала определяем размер сектора

Код:

Const SIZE% = 100
После всех инициализаций, определяем в каком секторе стоит корова :

Код:

Local cow_x% = Int(EntityX(cow), True)
Local cow_y% = Int(EntityY(cow), True)

'Пореводим координаты коровы в координаты сектора

Local sector_x% = Int(cow_x / SIZE)
Local sector_y% = Int(cow_y / SIZE)

'Сектор, где стоит корова

Local sector:TList = array[sector_x, sector_y]

У сектора (0,0) координаты будут такими же, это просто квадрат [0, 0, SIZE, SIZE]

SBJoker 04.01.2013 01:41

Ответ: Удаление типа и ссылок на него.
 
Запоминать каждому кусту его корову, и кусты уже отданные одной корове не давать остальным. Простейшее решение.
Или создать отдельный тип-посредник, тип посредник знает где его куст, и знает жив ли куст. Коровы запоминают тип-посредника, который знает куст.
Когда куст съеден корова говорит посреднику что куста больше нет. Посредник запоминает это и удаляет траву. Корова забывает посредника, но не удаляет его.
Другая корова помнящая этого же посредника спрашивает у него куст, а посредник рапортует что куста больше нет, - корова непытается есть этот куст и просто забывает посредника.

В конце когда игра закончена или закончен уровень удаляем всех посредников через Delete Each Type

Примерно так.

Еще можно у посредника сделать список коров которые его знают, тогда когда любая корова съела куст то посредник сообщает всем коровам что куста нет, и после дохнет сам.

CRASHER 04.01.2013 01:51

Ответ: Удаление типа и ссылок на него.
 
SBJoker, по поводу первого, наверно не то. А вот второй вариант с посредником интересный, скорее всего обычный пивот подойдет на эту роль) Пасыб!)

CRASHER 04.01.2013 01:57

Ответ: Удаление типа и ссылок на него.
 
Diablo1909, я правильно понимаю, что сектроа с координатами (-1,0);
(-1,-1); (0,-1) не может быть? Я это и имел в виду что "не хочу привязывать к числу". Если уж делать то динамическую систему, ну уж очень у меня лежит ко всему подобному)

tormoz 04.01.2013 06:02

Ответ: Удаление типа и ссылок на него.
 
Цитата:

Сообщение от CRASHER (Сообщение 248236)
tormoz,ну))) я так понимаю ты хочеш сказать следующее: пробежатся по циклу из 999 кустов у каждой из 300 коров. Причем при почти каждом проходе основного кода, не жирно ли?))

нет.
в переборе коровы когда она съела куст запускаешь функцию удаления экземпляра типа травы, передавая в функцию хендл для поиска в списке травы. Если "еда" занимает больше одного прохода, прогони еще и всех коров, если еще какая ест тот же куст - переведи в другое состояние и обнули переменную.
Твоя проблема в кривой реализации логики, а не в недостатках блитца.

Черный крыс 04.01.2013 08:25

Ответ: Удаление типа и ссылок на него.
 
2tormoz

Предже, чем сьесть куст - его надо еще найти... перебирать всю поляну?

Если куст находится в списке - значит он еще не сьеден. Как только корова начинает его есть - его сразу же необходимо удалять из списка, чтоб другая корова не смогла сьесть по сути уже жующийся куст. ( ну или флаг состояния менять )

2CRASHER

Правильно. Но можно и обойти это ограничение, путем сдвига координат.

RBK 04.01.2013 14:23

Ответ: Удаление типа и ссылок на него.
 
Цитата:

Как только корова начинает его есть - его сразу же необходимо удалять из списка, чтоб другая корова не смогла сьесть по сути уже жующийся куст.
возможен вариант что несколько коров могут есть один и тот-же куст.

Цитата:

Мож есть какие способы понять удален ли энтитя?
Ответ на этот вопрос я тут пока не видел, потому отвечу.
Код:

;создаем обьект
cube = CreateCube()

;удаляем
FreeEntity cube
cube = 0

;проверяем существование
if cube <> 0
  ;обьект существует
end if

P.S. список можно также проверять:
Код:

Type Mytype
 Field ent
End Type

;создаем обьект
tmp.Mytype = new Mytype

;удаляем
Delete tmp

;проверяем существование
if tmp <> Null
  ;обьект существует
end if


tormoz 04.01.2013 17:27

Ответ: Удаление типа и ссылок на него.
 
Цитата:

Сообщение от Diablo1909 (Сообщение 248260)
2tormoz

Предже, чем сьесть куст - его надо еще найти... перебирать всю поляну?

Если куст находится в списке - значит он еще не сьеден. Как только корова начинает его есть - его сразу же необходимо удалять из списка, чтоб другая корова не смогла сьесть по сути уже жующийся куст. ( ну или флаг состояния менять )

2CRASHER

Правильно. Но можно и обойти это ограничение, путем сдвига координат.

не надо.
Правильно организованный код:
в апдейте травы только трава, рост и тд. Лучше по таймеру.
в апдейте коров - поиск травы, еда, удаление. Запуск функции удаления ТОЛЬКО по условию (не каждый цикл).
перебирать траву в функции удаления не обязательно, экземпляр типа находить можно обжектхендлом, а вот перебрать коров придется, но тормозов не будет - функция вызывается по событию.

CRASHER 05.01.2013 02:53

Ответ: Удаление типа и ссылок на него.
 
Народ, я решил переделать на хендлы. При попытке коровы назначить ближайщий куст "аппетитным" происходит проверка хендла на Null. Дописал еще возможность 3 коровам одновременно кушать один куст.

RBK, об этом и еж в тумане осведомлен)) А вот трабла то с ссылкой. Прированяй элемент массива из типа "корова" к типу "трава", то есть...
Тип корова
филд вкусные кусты[99]
енд тип

вкусные кусты[i]=трава\Энтити

удали трава\Энтити и проверь трава\Энтити и ссылку на него
имеем
трава\Энтити=0
кусты[i]=432579357

следственно только хендлы или через пивот, что наверно все таки сложнее чем хендл.

CRASHER 05.01.2013 02:57

Ответ: Удаление типа и ссылок на него.
 
Diablo1909, При сдвиге наверно нужно будет переназначать секторам где какая трава была. Тоесть в секторе (0,0) было 3 куста, в секторе (1,1) 2 куста. Смещаем, получается в новом (0,0) нет кустов, в (1,1) 3 куста, в (2,2) 2 куста. так?)

CRASHER 05.01.2013 03:02

Ответ: Удаление типа и ссылок на него.
 
tormoz, а что ты имеешь в виду говоря "Лучше по таймеру" ?
Я сделал на апдейт коров ограничение, если превышен лимит времени, то выполняется Exit из For и записывается последний индекс, с которого в следующем глобальном проходе продолжается цикл. Ты не это хотел сказать?

RBK 05.01.2013 03:37

Ответ: Удаление типа и ссылок на него.
 
Цитата:

Сообщение от CRASHER (Сообщение 248332)

RBK, об этом и еж в тумане осведомлен)) А вот трабла то с ссылкой. Прированяй элемент массива из типа "корова" к типу "трава", то есть...
Тип корова
филд вкусные кусты[99]
енд тип

вкусные кусты[i]=трава\Энтити

удали трава\Энтити и проверь трава\Энтити и ссылку на него
имеем
трава\Энтити=0
кусты[i]=432579357

Что-то ты не то придумал
Код:

Type grass
Field ent ;модель травы
End Type

Type cow
Field eat.grass[99]
End Type

;создаем траву
mygrass.grass=New grass

;создаем корову
my.cow=New cow

;запоминаем траву
my\eat[1]=mygrass

;удаляем траву
Delete mygrass

;здесь my\eat[1] будет равно Nul
If my\eat[1] <> Null
  ;обьект существует если не удалили
 my\eat[1]\ent  ;модель травы
End If

спрашивай если что не понятно.

tormoz 05.01.2013 04:08

Ответ: Удаление типа и ссылок на него.
 
Цитата:

Сообщение от CRASHER (Сообщение 248334)
tormoz, а что ты имеешь в виду говоря "Лучше по таймеру" ?
Я сделал на апдейт коров ограничение, если превышен лимит времени, то выполняется Exit из For и записывается последний индекс, с которого в следующем глобальном проходе продолжается цикл. Ты не это хотел сказать?

Заведи таймер и апдейть траву не каждый проход, а каждые 200-400 мс.
А сектора и прочие извраты тут не нужны- попытайся вкурить что я выше написал

CRASHER 05.01.2013 04:40

Ответ: Удаление типа и ссылок на него.
 
RBK, вопрос звучит как?) "Удаление типа и ссылки на него". В первом посте сказал что делал не через хендлы. Теперь уже переделал на хендлы, и да, проверить их на Null легко. Я думал что ссылку моно тоже как то... того... при ошибке(не выводя саму ошибку). А я элемент как у тебя my\eat[1] приравнивал к самому энтиту. Из за этого и еррор. Спасибо конечно)) За старание!)

Черный крыс 05.01.2013 04:44

Ответ: Удаление типа и ссылок на него.
 
CRASHER

Все кусты заносятся в сектора на стадии инициализации. И все смещения определяются заранее.

Цитата:

А сектора и прочие извраты тут не нужны- попытайся вкурить что я выше написал
Не спорю, в случае с Blitz3D - это будет извратом. =)

CRASHER 05.01.2013 05:11

Ответ: Удаление типа и ссылок на него.
 
Diablo1909, а ты знашыт меня на из врат толкаешь да?)

Черный крыс 05.01.2013 05:19

Ответ: Удаление типа и ссылок на него.
 
CRASHER

Я тебя толкаю бросить этот недо-язык, и пересесть хотя бы на BlitzMAX. Там такой метод не будет извратом.

CRASHER 05.01.2013 05:56

Ответ: Удаление типа и ссылок на него.
 
Diablo1909, не но ведь B3D для чего то же существует? Ведь есть же разница между ними, и что же в Бмаксе такого особенного чего нет в B3D? Хors с директом в B3D есть и вроде достатошно))

Черный крыс 05.01.2013 06:55

Ответ: Удаление типа и ссылок на него.
 
Запорожец тоже для чего то существовал... но сегодня на нем почти никто не ездит.

Все тонкости описаны здесь : http://g3d-program.narod.ru/stat/beginer_blitz.htm

CRASHER 05.01.2013 17:41

Ответ: Удаление типа и ссылок на него.
 
Diablo1909, мне кажется или на БМ мало кто сидит? Я какой пример ни качну с булки, все на B3D)))


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

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