Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

Поворот спрайта в сторону курсора (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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.67 c
15-1143617296
Kerk
2006-03-29 11:28
2006.04.23
[Юзабилити] Формы создания/настройки


2-1144402600
cautur
2006-04-07 13:36
2006.04.23
Разноцветный TLabel или TMemo


2-1144405733
zorik
2006-04-07 14:28
2006.04.23
Станартные функции работы со строками


15-1144225435
ocean
2006-04-05 12:23
2006.04.23
Перезагрузить ADSL-модем


2-1144318090
Рафик
2006-04-06 14:08
2006.04.23
ADO