Форум: "Игры";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
ВнизПоворот спрайта в сторону курсора (DelphiX) Найти похожие ветки
← →
KOT_BEGEMOT (2005-09-19 23:07) [0]Мне надо чтоб спрайт повернулся в сторону курсора... Я видел много исходников, но все они неточные, тоесть спрайт бывает смотрит левее указателя или правее... А мне бы точную формулу... Есть х, у курсора и х, у спрайта ПЛИЗ ПОМОГИТЕ!
← →
WonderfulDay © (2005-09-19 23:59) [1]if (player.y+centergoody+player.attach.y<>mousef.y) then player.angle:=round(arctan2((mousef.y-player.attach.y-player.y-centergoody),(mousef.x-player.attach.x-player.x-centergoo dx))*128/pi)-64;
attach - это точка кручения относительно персонажа, centergood - смещение экрана. Попробуй сначала для нулевых значений. И добавь uses math;
← →
KOT_BEGEMOT (2005-09-19 23:59) [2]НУ ПЛИЗ! ХОТЬ КИНЬТЕ КТО-ТО КОД, КАК ВООБЩЕ СПРАЙТУ НАДА ЗАДАВАТЬ УГОЛ
← →
KOT_BEGEMOT (2005-09-20 00:01) [3]2 WonderfulDay пасиба!
а как значение angle применить к спрайту. У него такого свойства нету
← →
WonderfulDay © (2005-09-20 01:39) [4]tdximagelist.items[].drawrotate(....,angle), блин.
← →
Zer0 © (2005-09-20 01:47) [5]основы математеки и arctan2 должны помоч. как вариант:
{факингдертищит, но работает}
Function GetAngle(cX, cY, tX, tY : single) : single;
Var Dx,Dy : single;
Alfa : single;
function ArcTan2(const y, x : Single) : Single;
asm
FLD Y
FLD X
FPATAN
end;
Begin
If tX=cX then begin { аутовдиапазон - апстену }
If tY>cY then GetAngle:=270 else GetAngle:=90; Exit;
End;
If tY=cY Then Begin { пйом йад }
If tX>cX then GetAngle:=0 else GetAngle:=180; Exit;
End;
Dy:=tY-cY; Dx:=(tX-cX);
Alfa:=-ArcTan2(Dy,Dx)*180/Pi;
{а тут ваще фпадлу было думать =)}
while Alfa>360 do
Alfa := Alfa -360;
while Alfa<0 do
Alfa := Alfa +360;
result := Alfa;
End;
на выходе угол в градусах. код можно оптимизировать =)
← →
KOT_BEGEMOT (2005-09-20 09:11) [6]а можешь плиз написать тоже, тока
х мыши:=xcur
y мыши:=ycur
x спрайта := fx
y спрайта :=fy
alpha:=angle1
причем все переменные - это integer;
← →
A22 © (2005-09-20 12:07) [7]2 KOT_BEGEMOT, ты если готовый код под INTEGER переписать не можешь, лучше вообще не пиши
← →
KOT_BEGEMOT (2005-09-20 16:31) [8]Признаю, я - ламер в delphi... Но учиться никогда не поздно.
это правельно:
прировнять можно так integer:=round(extended)
и еще
tx, ty - это координаты мыши
сx, cy - это координаты спрайта... да?
но чета не фурычит((( и еще в delphix максимальный угол 256 а тут в примере 360... как перевести?
← →
A22 © (2005-09-20 18:45) [9]как перевести 256 в 360... а как перевести градусы в радианы? Разделить на верхнюю границу текущего интервала и домножить на верхнюю границу требуемого. предвидя тяжелый случай:
x = x*(360/256);
:(
← →
KOT_BEGEMOT (2005-09-20 19:49) [10]объясните плиз эту строку:
DXImagelist2.Items[1].DrawRotate(DXdraw1.Surface,fx,fy,0,0,0,0.5,0.67,angle1);
← →
Zer0 © (2005-09-20 21:26) [11]йаду хочешь? ;)
← →
KOT_BEGEMOT (2005-09-20 21:29) [12]Шо вы меня все обсыраете!?!?!
← →
Oo_ (2005-09-20 21:53) [13]
uses Math;
/////
type
TPoint4 = record
X1, Y1, X2, Y2, X3, Y3, X4, Y4 : Single;
////////
///////.................
///////
function pRotate4( Point4: TPoint4; Cx, Cy: Single; Angle: Extended): TPoint4;
var
sin, cos: Extended;
Tmp: TPoint4;
begin
SinCos( DegToRad( Angle ), sin, cos );
Tmp := Point4;
Tmp.X1 := Tmp.X1 - Cx;
Tmp.Y1 := Cy - Tmp.Y1;
Tmp.X2 := Tmp.X2 - Cx;
Tmp.Y2 := Cy - Tmp.Y2;
Tmp.X3 := Tmp.X3 - Cx;
Tmp.Y3 := Cy - Tmp.Y3;
Tmp.X4 := Tmp.X4 - Cx;
Tmp.Y4 := Cy - Tmp.Y4;
Result.X1 := Tmp.X1*cos + Tmp.Y1*sin + Cx;
Result.Y1 := Cy + Tmp.X1*sin - Tmp.Y1*cos;
Result.X2 := Tmp.X2*cos + Tmp.Y2*sin + Cx;
Result.Y2 := Cy + Tmp.X2*sin - Tmp.Y2*cos;
Result.X3 := Tmp.X3*cos + Tmp.Y3*sin + Cx;
Result.Y3 := Cy + Tmp.X3*sin - Tmp.Y3*cos;
Result.X4 := Tmp.X4*cos + Tmp.Y4*sin + Cx;
Result.Y4 := Cy + Tmp.X4*sin - Tmp.Y4*cos;
end;
TPoint4 - (x1,y1) - координаты левого верхнего, (x2,y2) - правого верхнего, (x3,y3) - правого нижнего, (x4,y4) - левого нижнего.
(Cx,Cy) - координаты точки, относительно которой вращаем, Angle - угол в градусах
← →
Oo_ (2005-09-20 21:54) [14]Блин, сорри, не сразу заметил, что DelphiX...
Поздно уже, невнимательно прочитал вопрос =( еще раз сорри.
← →
WonderfulDay © (2005-09-20 22:16) [15]KOT_BEGEMOT, чем тебе мой пример не угодил :) ?
И ваще, купи себе книгу.
← →
KOT_BEGEMOT (2005-09-20 22:36) [16]2 WonderfulDay та не)))) угодил))) объясни плиз как это смещение экрана?
← →
Micke © (2005-09-20 23:19) [17]Получите. Распишитесь.
function AngleX(x, y: Real): Real;
begin
if Abs(x) < 1E-6 then
if y >= 0 then AngleX := Pi / 2
else AngleX := -Pi / 2
else
if x > 0 then AngleX := ArcTan(y / x)
else if y >= 0 then AngleX := ArcTan(y / x) + Pi
else AngleX := ArcTan(y / x) - Pi
end;
Использовать так:
angle:=Trunc((AngleX(x1 - x2, y1 - y2) * 180 / Pi) / 1.4);
x1,y1 - координаты первой точки,
x2,y2 - второй.
Если увидишь, что угол смещён, прибавишь/отнимишь от angle сколько надо.
← →
KOT_BEGEMOT (2005-09-21 16:09) [18]А чтоб спрайт двигался к курсору пойдет такая формула?:
gox:=3*cos((angle+64)*pi/128);
goy:=3*sin((angle+64)*pi/128);
x:=x+gox;
y:=y+goy;
← →
KOT_BEGEMOT (2005-09-22 22:58) [19]Все равно летит по-разному. Все примеры пробовал. Все работали, но спрайт летел не точно в ту сторону куда надо((( постоянно косил то вправо, то влево(((((
← →
KOT_BEGEMOT (2005-09-23 08:09) [20]Плиз, дайте свое мыло, я скину исходник, может кто-то что-то исправит
← →
Zer0 © (2005-09-23 19:09) [21]типа сам разобраться не хочешь?
← →
KOT_BEGEMOT (2005-09-23 19:39) [22]2 Zer0
очень хочу! Знал бы ты как хочу!
но пробовал все примеры, все работают, но там спрайт по-прежнему не точно летит(((((((
скиньте плиз кто-то исходник на:
iradchenko@bigmir.net
← →
ПЁС_ПЫЛЕСОС (2005-09-23 21:00) [23]
> но пробовал все примеры, все работают, но там спрайт по-
> прежнему не точно летит(((((((
Может, недостаточно точно вычисляется угол. Может попробовать запоминать точку назначения для твоего спрайта и рассчитывать угол заново на каждом шаге?
← →
KOT_BEGEMOT (2005-09-23 21:36) [24]>Может, недостаточно точно вычисляется угол. Может попробовать >запоминать точку назначения для твоего спрайта и рассчитывать угол >заново на каждом шаге?
а это, кстати, идея! нада попробовать
← →
П7 (2005-09-24 00:02) [25]Ещё бы он точно летел, при целом значении угла, да ещё и урезанном до 256 значений.
Как вариант хранить single-угол и byte-угол. Расчёты вести по первому, а рисовать по второму!
← →
KOT_BEGEMOT (2005-09-24 00:20) [26]
> Как вариант хранить single-угол и byte-угол. Расчёты вести
> по первому, а рисовать по второму!
эта как?
← →
KOT_BEGEMOT (2005-09-24 00:38) [27]П7, мож мне на мыло исходник кинуть если есть?
← →
KOT_BEGEMOT (2005-09-26 01:22) [28]АП! )))
← →
Петр (2005-09-26 01:33) [29]блин ну неужели всё так сложно..
это ж геометрия из начальной школы..
я так понимаю что для поворота спрайта в DelphiX используется угол из 256 градусов :) Ну вот, вычисляешь угол, запоминаешь его в какую-нибудь переменную типа Double например. преобразовываешь к byte, запоминаешь в другую переменную.
для перемещения используешь вещественную, для поворота - типа byte.
и усё!
← →
OSokin © (2005-09-29 18:35) [30]function GetAngle(X, Y: Real): Real;
begin
GetAngle := -(ArcSin(X / Sqrt((X * X + Y * Y))))) / PiDiv2;
end;
Следует отметить, что точка должна находиться относительно центра координат в (0;0). Таким образом, для получения угла между точками нужно подставить значения X-X0, Y-Y0.
← →
OSokin © (2005-09-29 18:36) [31]Это из моей новой статьи. Переодически отправляю на исходники.ру
← →
oO (2005-09-29 20:10) [32]> OSokin © (29.09.05 18:35) [30]
божественно!
← →
Servelat © (2005-10-01 13:14) [33]2 Осокин
А где линк на статью? Не особо понятно, в чем выдается ответ (видимо в количествах пи-пололам поместившихся в нужном угле)?
Вообще ИМХО лучше арктангенс юзать, там тебе не надо лишних рассчетов производить, оба катета известны (X и Y), а так твое Sqrt((X * X + Y * Y)) вычисляется довольно долго.
← →
Zer0 © (2005-10-01 17:55) [34][30] OSokin ©
принимать апстенуголовой наружно до просветления
← →
OSokin © (2005-10-03 19:38) [35]Линк не дам - не вышел еще выпуск. Ответ считается в градусах, PiDiv2 - это заморочки с переводом. Вместо этого можно использовать RadToDeg
← →
A22 © (2005-10-04 12:23) [36]я все никак не пойму, чем плох арктангенс? вышел из моды?..
← →
OSokin © (2005-10-09 11:20) [37]А я его изучал? Нет еще. Значит буду пользоваться тем, что знаю.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.016 c