Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2009, 17:20   #11
KorDum
Пользователь
 
Аватар для KorDum
 
Регистрация: 27.06.2009
Сообщений: 35
По умолчанию

Здравствуйте, решил не создавать еще одну тему, посвященную этому же сабжу. Все сделал, как надо бы, но вот картинка поворачивается на промежутке [-90; 90] нормально, но вот если значение angle выходит за пределы этого промежутка, поворот картинки инвертируется. Такое случается, если курсор находится сзади исходной картинки.
Пожалуйста, помогите.
Код:
function TForm1.getAngle(Y, X: Real):Real;
begin
    result := ArcSin(Y/Sqrt(X*X + Y*Y)) * 180/Pi;
end;

// Где-то в какой-то процедуре

mAngle := getAngle((ymouse-yPlayer), (xmouse-xPlayer));
dum spiro, spero
Мой блог
KorDum вне форума Ответить с цитированием
Старый 27.06.2009, 23:29   #12
KorDum
Пользователь
 
Аватар для KorDum
 
Регистрация: 27.06.2009
Сообщений: 35
По умолчанию

или же вот аналог:
Код:
mAngle := arcTan((ymouse-yPlayer)/(xmouse-xPlayer))*180/Pi;
эффект от обоих случаев одинаковый. В ходе проверки, какие же значения могут быть у mAngle, установилось, что mAngle должно принадлежать промежутку [-135; 135]. Должно, но не принадлежит...
dum spiro, spero
Мой блог
KorDum вне форума Ответить с цитированием
Старый 28.06.2009, 07:06   #13
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

используй ArcTan2(y, x);
ArcTan2(0,1) - 0 радиан
ArcTan2(0,-1) - 3,14 радиан

mAngle := arcTan2((ymouse-yPlayer),(xmouse-xPlayer))*180/Pi;

А это комментарии к функциям в самой библиотеке Math:

Код:
{ Trigonometric functions }
function ArcCos(const X: Extended): Extended;  { IN: |X| <= 1  OUT: [0..PI] radians }
function ArcSin(const X: Extended): Extended;  { IN: |X| <= 1  OUT: [-PI/2..PI/2] radians }

{ ArcTan2 calculates ArcTan(Y/X), and returns an angle in the correct quadrant.
  IN: |Y| < 2^64, |X| < 2^64, X <> 0   OUT: [-PI..PI] radians }
function ArcTan2(const Y, X: Extended): Extended;
+ Пользуйся Help'ом
Kostia вне форума Ответить с цитированием
Старый 28.06.2009, 14:55   #14
KorDum
Пользователь
 
Аватар для KorDum
 
Регистрация: 27.06.2009
Сообщений: 35
По умолчанию

теперь угол правильного обзора увеличился, но вот наблюдается сильное искажение поворота, когда курсор приближается к задней части спрайта. И если mAngle переходит границу, где значение становится меньше -180 или больше 180, то оно инвертируется, то есть -180 становится 180 и наоборот.
dum spiro, spero
Мой блог
KorDum вне форума Ответить с цитированием
Старый 28.06.2009, 15:21   #15
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Можно ведь выполнить проверку на координаты курсора, и применять разное вычисление угла.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 28.06.2009, 15:28   #16
KorDum
Пользователь
 
Аватар для KorDum
 
Регистрация: 27.06.2009
Сообщений: 35
По умолчанию

Была такая идея, конечно же, но реализовать ее не получилось. Можете помочь?
dum spiro, spero
Мой блог
KorDum вне форума Ответить с цитированием
Старый 28.06.2009, 15:42   #17
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Координаты на экране объекта поворота есть? ...координаты мыши - есть, ...делаем условие, как вы сказали: "если курсор сзади картинки", то одно вычисление, иначе - другое, ...я не видел кода, где это "сзади" или "спереди" смутно представляю, и поэтому все чисто теоретически, стоит проверить.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 28.06.2009, 15:51   #18
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

ЫЫ. Я что-то совсем не понимаю, попробуй поменять разность мышки и игрока
mAngle := arcTan2((yPlayer-ymouse),(xPlayer-xmouse))*180/Pi;
Kostia вне форума Ответить с цитированием
Старый 28.06.2009, 15:54   #19
KorDum
Пользователь
 
Аватар для KorDum
 
Регистрация: 27.06.2009
Сообщений: 35
По умолчанию

пардон, не совсем сзади, слева от спрайта. если mAngle = 0, то спрайт повернут вправо. Поэтому можно считать, что сзади = слева
а код простой:
Код:
//инициализация
clip := Form1.DXImageList1.Items[0];

//сама формула вывода
mAngle := arcTan2((ymouse - yClip), (xmouse - xClip)) * 180/PI;

//вывод спрайта clip
DXImageList1.Items[0].DrawRotate(DXDraw1.Surface, xClip, yClip,
          clip.Width, clip.Height, 0, 0.5, 0.5, trunc(mAngle));
вот как-то так. Это просто вырезки из кода, но, я думаю, вы поймете логически, что в какой процедуре должно находиться
dum spiro, spero
Мой блог
KorDum вне форума Ответить с цитированием
Старый 28.06.2009, 17:00   #20
KorDum
Пользователь
 
Аватар для KorDum
 
Регистрация: 27.06.2009
Сообщений: 35
По умолчанию

Kostia, ваша поправка просто инвертировала управление спрайтом - поворот и переднюю часть
dum spiro, spero
Мой блог
KorDum вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот картинки delphin100 Мультимедиа в Delphi 5 14.04.2008 10:43
Поворот матрицы Cartman18 Помощь студентам 2 07.02.2008 11:11
timage, поворот ERASERROR Мультимедиа в Delphi 1 05.02.2008 12:10
как организовать поворот еллипса в С++ ? Снайп Помощь студентам 1 01.12.2007 17:19
Поворот картинки PAVEL315 Общие вопросы Delphi 3 24.12.2006 12:47