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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2011, 13:30   #1
Corus
Пользователь
 
Аватар для Corus
 
Регистрация: 27.07.2011
Сообщений: 15
По умолчанию Поворот боевых единиц

Приветствую, игроделы!
Пишу простую игру жанра "Стратегия". Вопрос в том, какими средствами реализовать поворот боевых единиц (на любой угол). Понимаю, что поворачивать нужно их изображения, но как?
Использую C++/Win32/GDI+.
Пробовал использовать метод DrawImage класса Graphics, который принимает три точки, как описано здесь:
http://www.rsdn.ru/article/gdi/gdiplus2mag.xml#EPDAE (пункт 2), но изображение не только поворачивается, но еще и растягивается.
Corus вне форума Ответить с цитированием
Старый 28.07.2011, 16:01   #2
invizor
Пользователь
 
Аватар для invizor
 
Регистрация: 15.11.2010
Сообщений: 53
По умолчанию

математика поворота- умножение на матрицу поворота то есть x:=x*cos(t)+y*sin(t), y:=-x*sin(t)+y*cos(t), и многие так и пушут, вот лично нагугленное правда на delphi
http://www.programmersforum.ru/showt...F2%E8%ED%EA%E8
http://www.delphisources.ru/pages/fa...ate_image.html
http://www.cyberforum.ru/delphi-begi...read52559.html
Есть простой эмпирический способ сдвинуть изоражение,повернуть, потом передвинуть. Думаю расширение отпадет если отцентрировать изображение от начала координат, или в начало поставить точку А
Герои меча и магии собственного производства http://invizor007.000webhostapp.com/...1/hi_v1_3a.rar
Личный сайт http://invizor007.000webhostapp.com/
invizor вне форума Ответить с цитированием
Старый 28.07.2011, 16:29   #3
Corus
Пользователь
 
Аватар для Corus
 
Регистрация: 27.07.2011
Сообщений: 15
По умолчанию

Я пробовал использовать матрицу поворота в GDI+. Но так прокатывает только с графической поверхностью (класс Graphics), т.е. поворачивается она, а мне нужно, чтобы поворачивалось только изображение.
Код:
Graphics g(hdc);
g.SetPageUnit(Unit::UnitPixel);
Matrix matrix;
matrix.Rotate(30);
g.SetTransform(&matrix);
Как осуществить что-то подобное с классом Image?
Знатоки GDI+, отзовитесь!

Цитата:
Сообщение от invizor Посмотреть сообщение
Есть простой эмпирический способ сдвинуть изоражение,повернуть, потом передвинуть. Думаю расширение отпадет если отцентрировать изображение от начала координат, или в начало поставить точку А
Спасибо, попробую так, если в ближайшее время стандартных методов для поворота не найду.

Последний раз редактировалось Corus; 28.07.2011 в 16:35.
Corus вне форума Ответить с цитированием
Старый 28.07.2011, 16:45   #4
DimaTs
Пользователь
 
Регистрация: 14.04.2011
Сообщений: 60
По умолчанию

Возможно проще будет создать несколько разных картинок и просто подгружать их в Image?
DimaTs вне форума Ответить с цитированием
Старый 28.07.2011, 17:41   #5
Corus
Пользователь
 
Аватар для Corus
 
Регистрация: 27.07.2011
Сообщений: 15
По умолчанию

Цитата:
Сообщение от DimaTs Посмотреть сообщение
Возможно проще будет создать несколько разных картинок и просто подгружать их в Image?
Вы предлагаете создать 360 картинок для каждого угла или я вас не понял?
Corus вне форума Ответить с цитированием
Старый 28.07.2011, 17:55   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Ага, и по TImage для каждого юнита
пыщь
JTG вне форума Ответить с цитированием
Старый 28.07.2011, 20:54   #7
DimaTs
Пользователь
 
Регистрация: 14.04.2011
Сообщений: 60
По умолчанию

хм, ну 360 не стоит, можно ограничиться меньшим числом.
Возможно вам и правда нужны все 360 градусов, тогда собственно продолжайте искать функцию поворота или пишите сами)

TImage то для каждого зачем, пусть на буферном кадре изображение рисуется из памяти и выводится на экран, одного объекта вполне достаточно
DimaTs вне форума Ответить с цитированием
Старый 28.07.2011, 21:07   #8
Corus
Пользователь
 
Аватар для Corus
 
Регистрация: 27.07.2011
Сообщений: 15
По умолчанию

Вопрос остается открытым.
Corus вне форума Ответить с цитированием
Старый 28.07.2011, 23:07   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Можно совместить оба варианта - поворот осуществлять не на 360, а на 90 градусов картинку можно обратить симметрично...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.08.2011, 11:27   #10
Format C:
Пользователь
 
Регистрация: 11.03.2007
Сообщений: 92
По умолчанию

2Corus:

Попробуйте этот код. Она даёт три точки отрисовки изображения.
Если вы работаете с заголовочными файлами в которых есть класс TGPGraphics, то используйте функцию
Код:
function TGPGraphics.DrawImage(image: TGPImage; destPoints: PGPPointF; count: Integer): TStatus;
А если непосредственно работаете с API, то тогда
Код:
function GdipDrawImagePoints(graphics: Pointer; image: Pointer; dstpoints: PGPPointF; count: Integer): Status
Код:
Type
  TGPTurnPointsF = Array[0..2] Of TGPPointF;

Function Rotation(Angle, Radius: Extended; Center: TPoint): TGPTurnPointsF;
Begin
  // 0 - вертикально вверх
  // По часовой
  Angle:=DegToRad(Angle-90);

  Result[0].X:=Center.X+Cos(Angle+DegToRad(-45))*Radius;
  Result[0].Y:=Center.Y+Sin(Angle+DegToRad(-45))*Radius;

  Result[1].X:=Center.X+Cos(Angle+DegToRad(-45+90))*Radius;
  Result[1].Y:=Center.Y+Sin(Angle+DegToRad(-45+90))*Radius;

  Result[2].X:=Center.X+Cos(Angle+DegToRad(-45+270))*Radius;
  Result[2].Y:=Center.Y+Sin(Angle+DegToRad(-45+270))*Radius;
End;
Радиус = Sqrt(Sqr(Width)+Sqr(Height))
Format C: вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поворот изображения на форме (либо поворот файла с картинкой) mystiql Microsoft Office Access 2 21.06.2011 22:03
массив из единиц и нулей dodomenos Паскаль, Turbo Pascal, PascalABC.NET 4 03.03.2011 00:08
Найти байтс наибольшим числом единиц и найти байт с наибольшим чилом нулей. Найти разность число единиц м Beren42 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 14.12.2010 17:44
Конвертер денежных единиц vmilyoshin Помощь студентам 6 16.04.2010 11:07
Найти сумма единиц Bayram_662 Паскаль, Turbo Pascal, PascalABC.NET 6 22.10.2009 22:11