03 июня 2011

lanza-chamas

За неимением фантазии название сообщения на галисийском языке. "lanza-chamas" - в переводе с галисийского - огнемёт. А речь пойдёт о том, как я его осуществлял(ох... как слово то не понравилось).
Не буду ходить вокруг да около, а напишу вкратце.
Первым делом "нафотошопил" рисунок огонька:





кхм... огонёк называется

Завёл класс TFire:

TFire = class(TGameObject)
   public
    speed : single;
    time  : single;
    fPrm  : TFireParams;
    constructor Create(aID :DWORD); override;
    procedure MakeStep(dt:single); override;
   end;


speed - скорость, а точнее как далеко "улетит" огонёк.
time   - сколько времени прошло.
fPrm   - параметры огонька: высот(опять же влияет на дальность отлёта) и ширина "разброса" пламени.


В конструкторе помещаем в нужный DummyCube, присваиваем нужный материал.
А также:


    up   := дедок.Up; // пламя летит туда, куда смотрит дед
    pos := дедок.Position.AsVector; // получаем позицию деда
    fPrm := дедок.fPrm; // получаем от негоже параметры огня
    position.x := pos[0]  + (0.9*fPrm.width)*up.X+(Random-0.5)*fPrm.width; // для разброса пламени
    position.y := pos[1]  + (0.9*fPrm.width)*up.Y+(Random-0.5)*fPrm.width; // для той же цели
    scale.SetVector(1.5, 1.5); // тут и так понятно:)
    speed := fPrm.height;
    time := -0.2;


А в процедуре MakeStep - такая каша:


procedure TFire.MakeStep(dt: single);
var
 vec :TVector; 
begin
  inherited;
 
  speed  := speed - 6*dt;  // "гасим" скорость
  time   := time + dt;  // увеличиваем время
  factor := (-0.01*(time*time)-8*time)*0.05;   // об этом, буквально, пару слов чуть ниже
 
  vec:=Scale.AsVector;
 
  if (Scale.X>=0) then
   AddVector(vec, 0.5*factor) else IsRemove := true;  // проверяю не надо ли "убивать" объект 
 
  scale.AsVector:=vec;
 
 if Speed > 0 then
  Lift(speed*dt);  // двигаем вперёд
 
end;



Интересующая строчка :
 factor := (-0.01*(time*time)-8*time)*0.05;
Решил особо не заворачиваться и просто изменял размеры огонька по параболе.
y = -0.01x^2 - 8x; третий член уравнения отпустил.


В итоге получаем вот такую картинку:




Конечно, есть уйма способов сделать намного лучше, но я пока доволен и тем что имеется, т.к. до всего
этого "дошёл своим умом".


Вот и всё, что я хотел сказать.

2 комментария:

  1. Ты молодец. Принялся за игру, а не как Марцелл - за чистое проектирование :)
    Очень классный блог, новичкам будет полезен. Да и профи тоже :)

    "Зафрендил" блог или как это тут называется :)

    ОтветитьУдалить