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=3617)

CRACK 13.06.2007 17:32

Удаление частиц
 
Добрый день, в поиске почему-то я по конкретному вопросу не нашел... В общем пишу систему частиц(типа шлейф за чем-нибудь) для небольшой аркады. Смысл такой - рисуется пять спрайтов за один цикл на месте 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

H@NON 13.06.2007 18:08

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

Nord 13.06.2007 18:21

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


CRACK 13.06.2007 18:27

Re: Удаление частиц
 
Что-то он p\entity найти не может...

alcoSHoLiK 13.06.2007 18:31

Re: Удаление частиц
 
Не делай, как говорит Nord)
Можно заранее сделать массив, как у тебя. Тогда при достижении счетчика максимального значения, обнуляй его. При этом самые страые спрайты, которые уже наверняка не видно, будут подставляться вместо новых. Естественно, надо задать каждому спрайту время жизни, чтобы он не болтался вечно.

Можно через тип создавать каждый раз необходимое количество. Этот подход может быть проще. Опять же каждому спрайту задавай значение жизни, отнимай его каждый кадр и удаляй спрайт, когда жизнь = 0.
Только ни в коем случае нельзя грузить картинку в главном цикле. Тут или CopySprite, или лучше реализовать первый вариант: создать вначале определенное количество спрайтов, а потом их прятать, когда жизнь = 0. При этом будет лучше производительность. А в конце программы все удалить.

Nord 13.06.2007 18:34

Re: Удаление частиц
 
Нечайно lens.jpg.bmp прописал. Пробуй, сейчас всё работает.
alcoSholik, может объяснишь мне на будущее чем мой вариант плох. Я вроде это же и сделал:
Цитата:

Можно через тип создавать каждый раз необходимое количество. Этот подход может быть проще. Опять же каждому спрайту задавай значение жизни, отнимай его каждый кадр и удаляй спрайт, когда жизнь = 0.
Только ни в коем случае нельзя грузить картинку в главном цикле.

CRACK 13.06.2007 18:45

Re: Удаление частиц
 
Спасибо Nord, сейчас все работает отлично, поменял loadsprite на copy и все замечательно... и производительность хорошая!

alcoSHoLiK 13.06.2007 20:12

Re: Удаление частиц
 
Nord
"Низя грузить" ты уже потом сделал. А так, действительно, это тот же второй вариант, о котором я упомянул.

Diplomat 14.06.2007 00:03

Re: Удаление частиц
 
[offtоp]
Следует отвлеченно заметить, что в случае, когда необходимое кол-во партиклов довольно велико, заранее известно, количество создавамых партиклов должно ограничиваться неким максимальным числом- использование группы обычных одномерных массивов вместо типов даст преимущество в скорости просчёта логики от 10% до 30% в зависимости от метода реализации. Если используются простейшие сингсёрфейсные партиклы, количество которых ограничено по определению- массивы тоже весьма удобны.
Однако, использование массивов в данной конкретной специфике всё же следует признать скорее своеобразным финтом ушами, - местами неудобным, местами "непедагогичным", и как правило не дающим значительного прироста скорости. Потому начинающему пользователю, который еще довольно смутно представляет суть происходящих процессов лучше от использования массивов воздержаться.

P.S. я же массивы люблю и уважаю.
[/offtоp]


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

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