Форум: "Игры";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизГРАВИТАЦИЯ В КОСМОСЕ2 Найти похожие ветки
← →
xman © (2004-04-29 12:43) [0]Привет всем!
Этот вопрос продолжает тему ГРАВИТАЦИЯ В КОСМОСЕ http://delphimaster.net/view/9-1083143091/
вот как я делаю. Подскажите как мне избежать неправильный полет пули
она поначалу летит нормально, но как только вырывается из гравитационного поля
планеты сразу набирает скорость и поворачивает в ту сторону в которую была выпущена пуля
в начальном положении.
X,Y - координаты пули
ANGL1 - первоначальный угол
ANGL2 - Угол направленный от пули к планете
SILA - сила выстрела
mojno - разрешение на изменение силы BOOLEAN
klick- значит mojno привышает sila
RAST- растояние от планеты к пуле
PCX,PCY - координаты планеты
PLG - Cила гравитационного поля планеты
в TIMER.ontimer
x:=x+cos(angl1*pi/180)*sila;
y:=y-sin(angl1*pi/180)*sila;
if (mojno/2>0) then
begin
x:=x+cos(angl2*pi/180)*mojno/2;
y:=y-sin(angl2*pi/180)*mojno/2;
end;
rast:=sqrt(sqr(x+5-pcx)+sqr(y+5-pcy));
mojno:=plg/rast;
if (pcx>x+5) and (pcy>y+5) then
begin
chetwert:=1;
angl:=(pcy-y+5)/rast;
angl2:=-arcsin(angl)*180/pi;
end;
if (pcx>x+5) and (pcy<y+5) then
begin
chetwert:=3;
angl:=(y+5-pcy)/rast;
angl2:=sin(angl)*180/pi;
end;
if (pcx<x+5) and (pcy<y+5) then
begin
chetwert:=4;
angl:=(y+5-pcy)/rast;
angl2:=180-arcsin(angl)*180/pi;
end;
if (pcx<x+5) and (pcy<y+5) then
begin
chetwert:=2;
angl:=(pcy-y+5)/rast;
angl2:=180+arcsin(angl)*180/pi;
end;
← →
Yar-Com (2004-04-29 13:49) [1]
type
TVector = record
x,y,z : Single;
end;
TRaketa = class
Force, Velocity, Position : TVector;
Mass : Single;
procedure Integrate(dt : Single);
procedure AddForce(AForce : TVector);
end;
procedure TRaketa.Integrate(dt:single);
begin
Position := VectorAdd(Position, VectorScale(Velocity, dt));
Velocity := VectorAdd(Velocity, VectorScale(Force, dt/ Mass));
Force := MakeVector(0,0,0);
end;
procedure AddForce(AForce : TVector);
begin
Force := VectorAdd(Force, AForce);
end;
....................................
var
Ray : TVector;
RayLen : Single;
begin
for i := 0 to PlanNum - 1 do
begin
Ray := VectorSubtract(Plane[i].Position, Rocket.Position);
RayLen := VectorLength(Ray);
Ray := VectorNormalize(Ray);
Fs := G * Rocket.Mass * Planet[i].Mass / RayLen;
Rocket.AddForce(VectorScale(Ray,Fs));
end;
Rocket.Integrate(0.001);
end;
Я бы как-нибуть так сделал, все просто и понятно.
PS все что тут написано не проверял, могут быть баги :)
← →
xman © (2004-05-02 20:50) [2]У меня Delphi 3. vectorAdd не понимает
есть какието еще идеи или может нужно какойто модуль подключать?
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.053 c