|
3D-программирование Вопросы, касающиеся программирования 3D мира |
13.06.2007, 17:32
|
#1
|
AnyKey`щик
Регистрация: 15.02.2007
Сообщений: 18
Написано 0 полезных сообщений (для 0 пользователей)
|
Удаление частиц
Добрый день, в поиске почему-то я по конкретному вопросу не нашел... В общем пишу систему частиц(типа шлейф за чем-нибудь) для небольшой аркады. Смысл такой - рисуется пять спрайтов за один цикл на месте player'a, и так как он у меня с постоянной скоростью перемещается(что-то типа летящего самолетика подбитого), то этого в полне хватает визуально. Но проблема в другом - спрайты у меня вырисовываются через массив и я никак не могу избавиться от переполнения массива. Ну а если делать просто через нью тайп, то не получается удалять лишний хвост. А библиотеки левые прикручивать не хочу. Вот простой исходничек, посмотрите пожалуйста:
Dim particle(20000)
Graphics3D 1024,768,32,1
light=CreateLight()
TurnEntity light, 45,45,0
Player=CreateCube()
PositionEntity Player,0,5,15
cam=CreateCamera()
PositionEntity cam,14,0,-20
CameraRange cam,0.1,110000
plane=CreatePlane()
PositionEntity plane,0,-20,0
EntityColor plane,20,120,20
asp = LoadTexture("media/tex.jpg")
ScaleTexture asp, 50, 50
EntityTexture plane, asp
hvost = LoadSprite("media/lens.jpg")
Repeat
For b=1 To 5
i=i+1
particle(i) = CopyEntity(hvost,particle(i))
PositionEntity particle(i),EntityX(Player)+Rnd(-1,1),EntityY(Player)+Rnd(-0.5,0.5),EntityZ(Player)
If i>150 Then HideEntity particle(i-150)
Next
MoveEntity cam,1,0,0
MoveEntity player,0,-0.3,0
MoveEntity player,1,0,0
If KeyDown(200) Then MoveEntity player,0,0.4,0
If KeyDown(1) Then Exit
UpdateWorld
RenderWorld
Text 10,14,"Array "+i
Flip
Forever
|
(Offline)
|
|
13.06.2007, 18:08
|
#2
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Re: Удаление частиц
Так у тебя счетчик все время увеличивается. Сделай лимит чтоли или или уменьшай его. А вообще нужно создать еще один цикл и усе.
For b=1 To 5
For i=0 to 19999
particle(i) = CopyEntity(hvost,particle(i))
PositionEntity particle(i),EntityX(Player)+Rnd(-1,1),EntityY(Player)+Rnd(-0.5,0.5),EntityZ(Player)
If i>150 Then HideEntity particle(i-150)
Next
|
(Offline)
|
|
13.06.2007, 18:21
|
#3
|
Знающий
Регистрация: 07.10.2006
Сообщений: 269
Написано 22 полезных сообщений (для 30 пользователей)
|
Re: Удаление частиц
если делать просто через нью тайп, то не получается удалять лишний хвост
|
Время жизни партиклам делай и усё.
Graphics3D 1024,768,32,1
Type particle
Field entity, age#
End Type
light=CreateLight()
TurnEntity light, 45,45,0
Player=CreateCube()
PositionEntity Player,0,5,15
cam=CreateCamera()
PositionEntity cam,14,0,-20
CameraRange cam,0.1,110000
plane=CreatePlane()
PositionEntity plane,0,-20,0
EntityColor plane,20,120,20
asp = LoadTexture("media/tex.jpg")
ScaleTexture asp, 50, 50
EntityTexture plane, asp
hvost=LoadSprite("media/lens.jpg")
Repeat
For i=1 To 5
p.particle = New particle
p\entity=CopyEntity(hvost,p\entity)
p\age=25
PositionEntity p\entity,EntityX(Player)+Rnd(-1,1),EntityY(Player)+Rnd(-0.5,0.5),EntityZ(Player)
Next
For w.particle =Each particle
w\age=w\age-1
If w\age<=0 Then : FreeEntity w\entity : Delete w :EndIf
Next
MoveEntity cam,1,0,0
MoveEntity player,0,-0.3,0
MoveEntity player,1,0,0
If KeyDown(200) Then MoveEntity player,0,0.4,0
If KeyDown(1) Then Exit
UpdateWorld
RenderWorld
Flip
Forever
|
(Offline)
|
|
13.06.2007, 18:27
|
#4
|
AnyKey`щик
Регистрация: 15.02.2007
Сообщений: 18
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Удаление частиц
Что-то он p\entity найти не может...
|
(Offline)
|
|
13.06.2007, 18:31
|
#5
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: Удаление частиц
Не делай, как говорит Nord)
Можно заранее сделать массив, как у тебя. Тогда при достижении счетчика максимального значения, обнуляй его. При этом самые страые спрайты, которые уже наверняка не видно, будут подставляться вместо новых. Естественно, надо задать каждому спрайту время жизни, чтобы он не болтался вечно.
Можно через тип создавать каждый раз необходимое количество. Этот подход может быть проще. Опять же каждому спрайту задавай значение жизни, отнимай его каждый кадр и удаляй спрайт, когда жизнь = 0.
Только ни в коем случае нельзя грузить картинку в главном цикле. Тут или CopySprite, или лучше реализовать первый вариант: создать вначале определенное количество спрайтов, а потом их прятать, когда жизнь = 0. При этом будет лучше производительность. А в конце программы все удалить.
|
(Offline)
|
|
13.06.2007, 18:34
|
#6
|
Знающий
Регистрация: 07.10.2006
Сообщений: 269
Написано 22 полезных сообщений (для 30 пользователей)
|
Re: Удаление частиц
Нечайно lens.jpg.bmp прописал. Пробуй, сейчас всё работает.
alcoSholik, может объяснишь мне на будущее чем мой вариант плох. Я вроде это же и сделал:
Можно через тип создавать каждый раз необходимое количество. Этот подход может быть проще. Опять же каждому спрайту задавай значение жизни, отнимай его каждый кадр и удаляй спрайт, когда жизнь = 0.
Только ни в коем случае нельзя грузить картинку в главном цикле.
|
|
(Offline)
|
|
13.06.2007, 18:45
|
#7
|
AnyKey`щик
Регистрация: 15.02.2007
Сообщений: 18
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Удаление частиц
Спасибо Nord, сейчас все работает отлично, поменял loadsprite на copy и все замечательно... и производительность хорошая!
|
(Offline)
|
|
13.06.2007, 20:12
|
#8
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: Удаление частиц
Nord
"Низя грузить" ты уже потом сделал. А так, действительно, это тот же второй вариант, о котором я упомянул.
|
(Offline)
|
|
14.06.2007, 00:03
|
#9
|
Дэвелопер
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений (для 164 пользователей)
|
Re: Удаление частиц
[offtоp]
Следует отвлеченно заметить, что в случае, когда необходимое кол-во партиклов довольно велико, заранее известно, количество создавамых партиклов должно ограничиваться неким максимальным числом- использование группы обычных одномерных массивов вместо типов даст преимущество в скорости просчёта логики от 10% до 30% в зависимости от метода реализации. Если используются простейшие сингсёрфейсные партиклы, количество которых ограничено по определению- массивы тоже весьма удобны.
Однако, использование массивов в данной конкретной специфике всё же следует признать скорее своеобразным финтом ушами, - местами неудобным, местами "непедагогичным", и как правило не дающим значительного прироста скорости. Потому начинающему пользователю, который еще довольно смутно представляет суть происходящих процессов лучше от использования массивов воздержаться.
P.S. я же массивы люблю и уважаю.
[/offtоp]
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:07.
|