Форум: "Игры";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];
ВнизСистема частиц в GLScene... В смысле огонь надо сделать :) Найти похожие ветки
← →
Galiaf © (2006-08-25 13:58) [0]Здорово, тут проблемка есть одна, у меня огонь пока сделан только тот, что придлагает GLS но он уж сильно тормозной. ФПС у меня в среднем 60, но при взрыве одной бомбы я теряю половину, а уж если поставить их штук 5 в кучу, то програмка может и повиснуть совсем. Помню когда-то г-н Fosgen упоминал что система частит в GLS не хорошо сделана и он делал сам себе по потребности но так уж вышло что я не знаю как сделать свою систему частиц которая делала бы только простенький огонь(я вообщн не знаю как ее сделать) вот и решил для начала сделать на том что есть. Приблизительно у меня это выглядит так:
for di:=0 to 3 do begin
{создаются 4 даммикуба, налаживается на них огонь и они все отправляются в 4 стороны(каждый в свою, di - направление)}
new:=tgldummycube(eff.AddNewChild(tgldummycube));
new.Position.SetPoint(b[0],0.5,b[1]);
with GetOrCreateSourcePFX(new) do begin
manager:=GLPerlinPFXManager1;
effectscale:=1;
ParticleInterval:=0.001;
PositionDispersion:=1;
case di of //расстягиваю огонь в направлении движения
0,1: PositionDispersionRange.SetPoint(0.5,0.1,0.1);
2,3: PositionDispersionRange.SetPoint(0.1,0.1,0.5);
end;
velocitymode:=svmrelative;
enabled:=true;
end;
for hh:=0 to high(effects) do
//плохой массив хранящий в себе состояния всех эффектов
if effects[hh].free then begin
effects[hh].obj:=new;
effects[hh].di:=di;
effects[hh].timer:=players[lev[b[0],b[1]].who].power*2;
effects[hh].tip:=0;
effects[hh].free:=false;
break
end;
end
После создания в каденсере происходит постоянная проверка массива effects и если он не свободен то определяется тип эффекта и что с ним делать:
procedure TForm1.handleeffects;
var
i, j: integer;
rox, roz, rpx, rpz: byte;
begin
for i:=0 to high(effects) do
if effects[i].free=false then
with effects[i] do begin
case tip of
0:
if timer>0 then begin
case di of
0: obj.Position.X:=obj.Position.X+0.5;
1: obj.Position.X:=obj.Position.X-0.5;
2: obj.Position.z:=obj.Position.z+0.5;
3: obj.Position.z:=obj.Position.z-0.5;
end;
dec(timer);
rox:=round(obj.Position.X);
roz:=round(obj.Position.z);
for j:=0 to countplayers-1 do begin
rpx:=round(players[j].player.Position.x);
rpz:=round(players[j].player.Position.z);
if (rpx=rox) and (rpz=roz) then begin
players[j].life:=false
end
end;
if (rox>-1) and (roz>-1) and (rox<maxx) and (roz<maxz) then
case lev[rox,roz].tip of
0:
begin
free:=true;
obj.Destroy;
obj:=nil;
lev[rox,roz].tip:=-1;
lev[rox,roz].obj.Destroy;
lev[rox,roz].obj:=nil;
end;
1:
begin
free:=true;
obj.Destroy;
obj:=nil;
end;
2:
begin
free:=true;
obj.Destroy;
obj:=nil;
addtoa(rox, roz);
end
end//case
end
else begin
effects[i].free:=true;
effects[i].obj.Destroy;
effects[i].obj:=nil;
end;
else
if effects[i].timer>1 then
dec(effects[i].timer)
else begin
effects[i].free:=true;
effects[i].obj.Destroy;
end;
end;//case
end
end;
Массив effects должен быть длинной около полу тысячи но для одного игрока хватает и пол сотни(пока).
А, о чем это я? :) на самом деле мне нужно просто сделать замену GLS"овской системе частиц, так что бы она выполняла только роль огня и возможно не жрала бы столько ресурсов. Код привел на всякий случай, может я в чем-то сделал некрасивую ошибку и из-за этого когда появится проблема с производительностью.
Теперь жутко извиняюсь за громозткость моей просьбы. Может есть у кого идеи чем можно заменить систему частиц. Только не придлагать перечитывать Краснова, я уже этим занимаюсь :).
← →
Galiaf © (2006-08-30 14:57) [1]Я перечитал несколько статей по системам частиц, понял чего именно мне надо, но никак не пойму как нарисовать частицу чтобы она была не просто какого-то цвета, а например в центре желтая а по краям красная, полупрозрачная. Можно конечо попробовать рисовать не точку а полигон с разными значениями цвета вершин но это по-моему извращение, или может надо соответствующую текстуру ложить на точку, тоже не то. Если можно хотелось бы услышать как это рисуется правильно т.к. я не собираюсь делать по-своему если не уверен в правильности подхода.
← →
a22 © (2006-08-30 16:12) [2]полигон
← →
tButton © (2006-08-31 09:32) [3]а ммм... я не уверен в своей правоте, но для частицы берётся полигон, разворачивается перпендикулярно оси камеры и на сий полигон текстура кладётся.
← →
Galiaf © (2006-08-31 13:40) [4]
> разворачивается перпендикулярно оси камеры
А разве нет такой опции в OpenGL для отображения полигонов(всех объектов) все время фронтальной стороной к камере??? Мне казалось что я видел. Ведь если каждый раз рисовать полигон и рассчитывать его вектор нормали или просто похожий расчет для отображения проводить, то это уже не мало операций, имхо. И еще на сколько вершин полигон делать для того что бы на него можно было бы положить текстуру так что бы выглядел он как круглая ровная частица, наверное и трех хватит если правильно текстуру нарисоват? Я никогда подобного не делал так что даже не знаю как эту самую текстуру нарисоват, это надо в редакторе (фотошоп например) края делать прозрачными(не знаю как) или делать края другого цвета а в програме указывать этот цвет как прозрачный? Хотелось бы подробнее этот момент услышать. Есть еще в GLScene такие примеры как Particles, хотелось бы узнать не потеряю я в скорости если использую это. Спрайты еще есть, тот же вопрос, что быстрее будет выполняться?
← →
tButton © (2006-08-31 13:57) [5]взрыв. то бишь огонь. делаем текстуру в фотошопе.
берём чёрный квадрат.
берём инструмент "градиент" переключаем его в режим "радиальный градиент".
берём цвет переднего плана rgb(80,40,10), заднего плана - rgb(0,0,0)
делаем градиентную заливку от центра квадрата к краю
собстна всё.
добавляем шум по вкусу.
если нужен альфа-канал - обесцвечиваем и делаем "auto levels"
> разве нет такой опции в OpenGL для отображения полигонов(всех
> объектов) все время фронтальной стороной к камере???
эт не ко мне вопрос =)
но, емнип, есть такое
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.043 c