Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
3-1138807330
Neo Trinitron
2006-02-01 18:22
2006.04.23
Поиск в поле CLOB (Oracle)


15-1142582621
default
2006-03-17 11:03
2006.04.23
Пятничная задачка


3-1141450048
-САша-
2006-03-04 08:27
2006.04.23
Delphi with fbclient.dll


6-1136967701
sain
2006-01-11 11:21
2006.04.23
Работа с сетью


1-1142275219
:-))
2006-03-13 21:40
2006.04.23
Кусок Webbrowser в Bitmap





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский