Форум: "Игры";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
ВнизЗамучался с углами - sin256 и просто sin.... Найти похожие ветки
← →
greenrul (2002-10-04 13:59) [0]Есть угол player1.ugol и объект snarad, который должен вылететь под углом player1.ugol и лететь под действием силы тяжести. Пишу в snarad.DoMove:
1 версия:
angle:=Round(ArcTan2(sin(ugol/(180/pi))+(time/5),cos(ugol/(180/pi)))*180/pi);
y:=Player1.Y+20*sin(ugol/(180/pi))*(time/5) + (((time*time)/25)/2);
x:=Player1.x+20*cos(ugol/(180/pi))*(time/5);
как я понял, просто sin/cos выдает значение в радианах, значит нужно разделить на 180/pi. Но потом нашел один пример:y:=y+sin256(Angle)*speed;
почитал хелп про sin256/cos256 и скачал модифицированный DxSprite.pas. Попробовал записать так:
2 версия:
angle:=Round(ArcTan2(sin256(ugol)+time/5,cos256(ugol))*180/pi);
y:=Player1.Y+20*sin256(ugol)*(time/5) + (((time*time)/25)/2);
x:=Player1.x+20*cos256(ugol)*(time/5);
В первом случае снаряд летит с почти постоянным angle=80-90, хотя выглядит на 60-70...
Как высчитать правильный угол снаряда?
Где я ошибку допустил? time/5 - это время, просто если без деления то снаряд слишком быстро летит.
← →
k (2002-10-04 15:35) [1]
>>как я понял, просто sin/cos выдает значение в радианах
да ну! син/кос возвращают значения как и положено нормальному син и кос от -1 до 1 без размерности.
и ч-то не пойму зачем так
sin(ugol/(180/pi))+(time/5)- это здесь зачем?
чего ты не хочешь по стандартному?
то есть
var x,y,//текущие координаты
vx,vy:double;//компонента скорости
ay :double;//uskorebie svob padeniya
при броске
задать x,y, ay<0;
v - начальная скорость
vx := v*sin(ugol/(180/pi));
vy := v*cos(ugol/(180/pi));
обработка DoMove
vy := vy + ay;
x := x + vx;
y := y + vy;
← →
greenrul (2002-10-04 16:19) [2]что-то я не понял....
DoMove-
if (isButton1 in MainForm.DXInput1.States) and not(visible) then
begin
Visible:=true;
vx := 5*sin(Player1.ugol/(180/pi));
x:=Player1.X;
y:=Player1.y;
vy := 5*cos(Player1.ugol/(180/pi));
end;
if Visible=true then
begin
vy := vy + 0.00005*y;
x := x + vx;
y := y - vy;
end;
снаряд взлетает ПРЯМО вверх и падает тудаже...
вы наверное чего-то напутали....
Снаряд бросают с земли ПОД УГЛОМ...
← →
k (2002-10-04 16:26) [3]ну да напутал. cos i sin поменяй местами...
и еще
if Visible=true then
begin
vy := vy + 0.00005* ay{ускорение};
x := x + vx;
y := y - vy;
end;
а так снаряд взлетает? падает? с силой тяжести разобрались.
проверь угол и нач условия. все должно работать (скорее всего:))
← →
greenrul (2002-10-04 16:47) [4]я обнаружил веселую фигню: угол в TImageSpriteEx считается НЕПРАВИЛЬНО - считайте сами, при угле в 0 он параллелен оХ, а при 180 чуть ли не диагонален, так что все мои беды от него....
Чем это лечится?
← →
greenrul (2002-10-04 16:50) [5]опять муть - он летит совсем не в ту сторону....
короче лучше оставить мое уравнение движения. Путь оно и тупое, но рабочее. А вот что делать с разворотом снаряда?????
← →
cyborg (2002-10-05 11:25) [6]Дело в том, что градусов в sin256 не 360, а 256, т.е. что будет 180 градусов, то в программе должно быть 128.
← →
хм (2002-10-05 22:09) [7]>я обнаружил веселую фигню: угол в TImageSpriteEx считается >НЕПРАВИЛЬНО - считайте сами, при угле в 0 он параллелен оХ, а >при 180 чуть ли не диагонален, так что все мои беды от него....
>Чем это лечится?
дело в том, что в делфих в окружности 256 градусов, а не 180 "как везде". Поэтому и переводить sin и cos надо не с помощью sin(ugol/(180/pi)), а c помощью sin(ugol/( 256/pi)); ну или просто использовать sin256
← →
greenrul (2002-10-06 12:34) [8]Ну хорошо, а почему тогда все равно угол кривой?
1:angle:=Round(RadToDeg(ArcTan2(cos(Player1.ugol/(256/pi)),sin(Player1.ugol/(256/pi))+(time/6))));
2:angle:=Round(RadToDeg(ArcTan2(sin(Player1.ugol/(256/pi))+(time/6)бcos(Player1.ugol/(256/pi)))));
← →
Mirovodin (2002-10-06 13:11) [9]Не нужно использовать ни какие sin256 и т.д. если нужно, постройте таблицу cos[0..359]. А потом получайте значение cos или sin по элементу в массиве. Такой способ быстрее всего. Delphi дает значения sin и cos в радианах!
Перевод :
a(град)=(a(рад)*180)/PI и соответственно:
a(рад)=(PI*a(град))/180
вот и всё.
← →
greenrul (2002-10-07 15:43) [10]Это-то тоже можно, но ведь по идее
Snarad.angle:=Round(RadToDeg(ArcTan2(cos(Player1.ugol/(256/pi)),sin(Player1.ugol/(256/pi))+(time/6))));
ДОЛЖЕН работать... но не работает
← →
MBo (2002-10-07 18:19) [11]набросок, боеголовка смотрит по вектору скорости ;)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, ExtCtrls,math;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
Button1: TButton;
Timer1: TTimer; //100
SpinEdit1: TSpinEdit; //45
SpinEdit2: TSpinEdit; //60
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure DrawS;
private
{ Private declarations }
public
{ Public declarations }
end;
const
g=10;
var
Form1: TForm1;
an0:double;
v0:integer;
t:integer;
x,y:integer;
vx,vy,vy0,angle:double;
coeff:double=0.1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
t:=0;
doublebuffered:=true;
an0:=DegToRad(spinedit1.Value);
v0:=spinedit2.Value;
timer1.enabled:=true;
vx:=v0*cos(an0);
vy0:=v0*sin(an0);
paintbox1.canvas.Pen.mode:=pmXor;
paintbox1.canvas.Pen.color:=clAqua;
end;
procedure TForm1.DrawS;
var
y0:integer;
begin
y0:=paintbox1.height-y-1;
with paintbox1.canvas do begin
moveto(x,y0);
lineto(round(x+15*cos(pi+0.3-angle)),round(y0+15*sin(pi+0.3-angle)));
lineto(round(x+15*cos(pi-0.3-angle)),round(y0+15*sin(pi-0.3-angle)));
lineto(x,y0);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if t=0 then
PaintBox1.Canvas.FillRect(paintbox1.clientrect)
else
DrawS;
inc(t);
vy:=vy0-g*t*coeff;
x:=trunc(vx*t*coeff);
y:=trunc(vy0*t*coeff-g*sqr(t*coeff)/2);
if y<0 then begin
timer1.enabled:=false;
exit;
end;
angle:=arctan2(vy,vx);
DrawS;
end;
← →
greenrul (2002-10-07 20:58) [12]Спасибо, конечно что расписал, но проблема в другом - почему снаряд вертится, когда летит:
Snarad.angle:=Round(RadToDeg(ArcTan2(snarad_speed*sin256(Player1.ugol) + g*time/speed,snarad_speed*cos256(Player1.ugol))));
Нужно чтоб угол его был по касательной к траектории...
может дело в отрицательном угле/тангенсе?
← →
MBo (2002-10-07 21:20) [13]>Нужно чтоб угол его был по касательной к траектории
Именно так я и сделал
← →
greenrul (2002-10-08 17:18) [14]Так у меня то же самое написано почти, а снаряд через одно место летит =(
← →
greenrul (2002-10-08 17:43) [15]НАШЕЛ ОТВЕТ!!! ВОТ ЭТО - СЧАСТЬЕ!
t:=Round(RadToDeg(ArcTan2(snarad_speed*sin(DegToRad(Player1.ugol)) + g*time/speed,snarad_speed*cos(DegToRad(Player1.ugol)))));
Snarad.angle:=Round((256*t)/360);
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c