За неимением фантазии название сообщения на галисийском языке. "lanza-chamas" - в переводе с галисийского - огнемёт. А речь пойдёт о том, как я его осуществлял(ох... как слово то не понравилось).
Не буду ходить вокруг да около, а напишу вкратце.
Первым делом "нафотошопил" рисунок огонька:
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 - такая каша:
Интересующая строчка :
factor := (-0.01*(time*time)-8*time)*0.05;
Решил особо не заворачиваться и просто изменял размеры огонька по параболе.
y = -0.01x^2 - 8x; третий член уравнения отпустил.
В итоге получаем вот такую картинку:
Конечно, есть уйма способов сделать намного лучше, но я пока доволен и тем что имеется, т.к. до всего
этого "дошёл своим умом".
Вот и всё, что я хотел сказать.
Не буду ходить вокруг да около, а напишу вкратце.
Первым делом "нафотошопил" рисунок огонька:
|  | 
| кхм... огонёк называется | 
Завёл класс 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; третий член уравнения отпустил.
В итоге получаем вот такую картинку:
Конечно, есть уйма способов сделать намного лучше, но я пока доволен и тем что имеется, т.к. до всего
этого "дошёл своим умом".
Вот и всё, что я хотел сказать.
 

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