За неимением фантазии название сообщения на галисийском языке. "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, спасибо =)
ОтветитьУдалить