Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
15-1182541836
ArtemESC
2007-06-22 23:50
2007.07.22
Спамеры уже добрались до телефонов...


2-1182776449
Kolan
2007-06-25 17:00
2007.07.22
ovaerload конструктор &amp;#151; что получится?


2-1182614540
cossak
2007-06-23 20:02
2007.07.22
переменная баг d7?


15-1182833764
pavel_guzhanov
2007-06-26 08:56
2007.07.22
Есть тут спецы по php и iis?


15-1182807961
4ell
2007-06-26 01:46
2007.07.22
3 вопроса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский