![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поворот спрайта в сторону курсора (DelphiX) [Delphi, Windows]
KOT_BEGEMOT © (2005-09-19 23:07:00)Мне надо чтоб спрайт повернулся в сторону курсора... Я видел много исходников, но все они неточные, тоесть спрайт бывает смотрит левее указателя или правее... А мне бы точную формулу... Есть х, у курсора и х, у спрайта ПЛИЗ ПОМОГИТЕ!
Micke (2005-09-20 23:19:00) [21]Получите. Распишитесь.
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-20 22:36:00) [22]2 WonderfulDay та не)))) угодил))) объясни плиз как это смещение экрана?
WonderfulDay (2005-09-20 22:16:00) [23]KOT_BEGEMOT, чем тебе мой пример не угодил :) ?
И ваще, купи себе книгу.
Oo_ (2005-09-20 21:54:00) [24]Блин, сорри, не сразу заметил, что DelphiX...
Поздно уже, невнимательно прочитал вопрос =( еще раз сорри.
Oo_ (2005-09-20 21:53:00) [25]
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 - угол в градусах
KOT_BEGEMOT (2005-09-20 21:29:00) [26]Шо вы меня все обсыраете!?!?!
Zer0 (2005-09-20 21:26:00) [27]йаду хочешь? ;)
KOT_BEGEMOT (2005-09-20 19:49:00) [28]объясните плиз эту строку:
DXImagelist2.Items[1].DrawRotate(DXdraw1.Surface,fx,fy,0,0,0,0.5,0.67,angle1);
A22 (2005-09-20 18:45:00) [29]как перевести 256 в 360... а как перевести градусы в радианы? Разделить на верхнюю границу текущего интервала и домножить на верхнюю границу требуемого. предвидя тяжелый случай:
x = x*(360/256);
:(
KOT_BEGEMOT (2005-09-20 16:31:00) [30]Признаю, я - ламер в delphi... Но учиться никогда не поздно.
это правельно:
прировнять можно так integer:=round(extended)
и еще
tx, ty - это координаты мыши
сx, cy - это координаты спрайта... да?
но чета не фурычит((( и еще в delphix максимальный угол 256 а тут в примере 360... как перевести?
A22 (2005-09-20 12:07:00) [31]2 KOT_BEGEMOT, ты если готовый код под INTEGER переписать не можешь, лучше вообще не пиши
KOT_BEGEMOT (2005-09-20 09:11:00) [32]а можешь плиз написать тоже, тока
х мыши:=xcur
y мыши:=ycur
x спрайта := fx
y спрайта :=fy
alpha:=angle1
причем все переменные - это integer;
Zer0 (2005-09-20 01:47:00) [33]основы математеки и 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;
на выходе угол в градусах. код можно оптимизировать =)
WonderfulDay (2005-09-20 01:39:00) [34]tdximagelist.items[].drawrotate(....,angle), блин.
KOT_BEGEMOT (2005-09-20 00:01:00) [35]2 WonderfulDay пасиба!
а как значение angle применить к спрайту. У него такого свойства нету
WonderfulDay (2005-09-19 23:59:00) [36]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:00) [37]НУ ПЛИЗ! ХОТЬ КИНЬТЕ КТО-ТО КОД, КАК ВООБЩЕ СПРАЙТУ НАДА ЗАДАВАТЬ УГОЛ