{{notification.text}}

MirGames

15.08.08 19:08
0
Доброго времени суток всем. :hi:
Такой вот вопрос у меня возник, ну начну в принципе с примера самого простого:
Вот есть у меня к примеру объект на карте (которым я управляю), щелкнул я на кнопку он и выстрелил. Вот тут и вопрос собственно как реализовать правильно динамическое выделение памяти для пули.
Посмотрел много примеров игр (с исходниками), но везде (в большинстве) реализация тех же пуль или там врагов на карте была сделана через массив, тоесть при компиляции ну или при инициализации игры создавался массив например на 100 объектов пуль, после выстрела просматривалось через цикл пустое место в массиве и при нахождении данного туда заталкивали данные пули, но вдруг я не знаю сколько там будет пуль или ещё чего там может создаться, получается нужна выделять массив большого размера. В других видел (1-2 игры не больше) пуля создавалась через оператор new, задавалось направление и скорость, добавляли на сцену и поехали, но так помоему идёт расход памяти, вот вылетела пуля за карту или там ударилась в стенку она тупо удаляется со сцены а в памяти висит, так как сам себя объект насколько я знаю удалить из памяти не может.
Ну в общем я думаю сделать что то типа менеджера для работы с памятью, типа дал команду он выделил сколько нужно, объект закончил свою деятельность, удалил себя со сцены ну и там все приготовления и записал себя в очередь к менеджеру на удаление.
Ну в общем так.
Може вы чё подскажите, може я в обще иду не в том направлении и не стоит изобретать велосипед, а всё уже давно продуманно и сделано.
#1
15.08.08 19:24
0
Гораздо проще будет сделать в динамическом массиве структур пуль булевое свойство, например Active. При запуске пули просматривать весь массив, если хоть в одной ячейке Active==false--то есть пуля уже пролетела, то ставить новые параметры и Active=true. Если же все пули ещё летят(или размер массива равен 0), то добавлять ещё одну ячейку к массиву.
ЗЫ И при столкновении пули не забудь ставить Active=false))
Отредактировано: 15.08.08 19:28
#2
Хранитель Флейма
15.08.08 19:29
0
Smouking
Ты забыл упомянуть язык на котором ты пишешь, но, насколько, я помню в других ветках ты заикался про Delphi.

Вобщем, ты не повершь! Все уже давно сделано за тебя! ;)

Код

type
  TBullets = array of TBullet;

var
  Bullets : TBullets;
***
if Игрок.Выстрелил then
begin
//* Кроме прочего
  SetLength(Bullets, Length(Bullets) + НужноеКоличествоПулек);
// Курим бамбук
end;
#3
15.08.08 19:40
0
Said,
Цитата

но так помоему идёт расход памяти, вот вылетела пуля за карту или там ударилась в стенку она тупо удаляется со сцены а в памяти висит, так как сам себя объект насколько я знаю удалить из памяти не может.
Отредактировано: 15.08.08 19:41
#4
аксакал
15.08.08 20:06
0
Себя удалять может.
#5
15.08.08 20:29
0
Цитата(Said @ Сегодня, 14:29)
[snapback]84667[/snapback]
Ты забыл упомянуть язык на котором ты пишешь, но, насколько, я помню в других ветках ты заикался про Delphi.

Нет С++

Цитата(XProger @ Сегодня, 15:06)
[snapback]84670[/snapback]
Себя удалять может.


Подскажи тогда как сделать, чтоб класс выделенный через NEW сам сбя удалил и освободил память...
#6
15.08.08 20:49
0
Цитата(Smouking @ 15.08.2008 - 18:29) [snapback]84673[/snapback]

Нет С++
Подскажи тогда как сделать, чтоб класс выделенный через NEW сам сбя удалил и освободил память...

Код
delete this;
#7
15.08.08 21:13
0
А ООП заюзать? Пуля это объект, котрый хранится в списке. И сделать менеджер этих пуль, который будет следить за целостностью..
#8
15.08.08 22:22
0
Цитата(Woolf @ Сегодня, 16:13)
[snapback]84676[/snapback]
А ООП заюзать? Пуля это объект, котрый хранится в списке. И сделать менеджер этих пуль, который будет следить за целостностью..

Я об этом говорил в начале и спрашивал если так сделать насколько это будет правильно с точки зрения приложения (быстродействия).
#9
Хранитель Флейма
15.08.08 22:43
0
Smouking
Из того текста что ты наговорил в стартовом топике не видно что именно ты хочешь.

Что беспокоит пациента?

1) Незнание алгоритма / языка программирования?
2) Быстродействие тех или иных алгоритмов?
3) Желание сделать универсальный инструмент?

Даже если брать эти три пункта то вариантов море:

Ты можешь создать запись с "меткой" существует ли пуля и написать менеджер, который обслуживал бы массив таких записей. Как тебе уже ответили ты можешь выделить начальный массив скажем под сто элементов и "помечать" пули как уничтоженные в нужный тебе момент. Просматривая такой массив менеджер будет определять "свободные" ячейки и записывать новые пули. Если (какой ужас) случица так, что пуль будет больше чем размер массива - радостно выделяй нужное количество элементов массива. Тут тоже вариантов множество: как только при добавлении нового элемента окажется, что "мест" больше нет - можно выделять сразу 2X"Обойму", и работать в том же режиме, пока не окажется, что мест снова нехватает. Все зависит от твоей фантазии и запросов.

Но как показала практика, еще большее зависит от:

а) Умения использовать поиск по форуму (таких вопросов уже было много).
б) Правильной постановки вопроса - незная что именно ты хочешь никто тебе кроме тебя же и не поможет.
#10
16.08.08 02:10
0
Лана спасибки всем кто откликнулся, будем думать и размышлять.
#11
16.08.08 04:24
0
если массив пулек предствляет из себя обычные record - могу делать и списком (tlist), если это классы - обычно выделяю сразу "про запас".

Цитата
Пуля это объект, котрый хранится в списке. И сделать менеджер этих пуль, который будет следить за целостностью..

"ООП ради ООП" :)
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}