我正在为学校做一个项目,我们需要在不使用 XNA 的情况下用 C# 制作一个基本的自上而下的赛车游戏。 首先让我告诉你,到目前为止我们学到的关于编程的知识与制作一些看起来像赛车游戏的东西几乎没有关系。它并没有比数组、循环等更难。 所以我们没有学习图形或类似的东西。
说了这么多,我遇到了以下问题。
我们创建了一个 Graphics 对象,然后使用 DrawImage 并使用来自 car.jpg 的位图。
graphics = e.Graphics;
graphics.RotateTransform(angle);
graphics.DrawImage(car, xPos, yPos, car.Width, car.Height);
然后我们等待按键,例如 Right
case Keys.Right:
if (angle != 360)
{
angle += 10;
}
else
{
angle = 0;
}
this.Refresh();
break;
我们遇到的问题是旋转的轴心点在左上角。因此,一旦我们将汽车移动到类似 (20,25)
的地方并开始旋转它,它就会使用 (0,0)
作为旋转中心。我们想要实现的是让旋转的中心点位于我们汽车的中心。
我们已经尝试寻找改变 RotateTransform
的 centerX
和 centerY
的方法,但得出的结论是这不是可能与位图。
我们已经为这个问题苦苦挣扎了 2 天多,似乎找不到任何解决方案来实现我们想要的东西。
是我们在创建 Graphics 对象时做错了什么,还是有一种完全不同的方法来改变汽车的 centerX
和 centerY
?
最佳答案
要绘制旋转的位图
,您需要执行几个步骤来准备Graphics
对象:
- 首先将其原点移动到旋转的中点
- 然后旋转所需的角度
- 接下来你把它移回去
- 现在您可以绘制
位图
- 最后你重置了
Graphics
这需要为每个位图完成。
以下是在位置 (xPos, yPos
) 绘制 Bitmap bmp
的代码步骤:
float moveX = bmp.Width / 2f + xPos;
float moveY = bmp.Height / 2f+ xPosf;
e.Graphics.TranslateTransform(moveX , moveY );
e.Graphics.RotateTransform(angle);
e.Graphics.TranslateTransform(-moveX , -moveY );
e.Graphics.DrawImage(bmp, xPos, yPos);
e.Graphics.ResetTransform();
有一种可能的复杂情况:如果您的位图
具有与屏幕不同的dpi
分辨率,即与图形
不同,您必须首先调整位图
的dpi
设置!
要使位图
适应通常的96dpi
,你可以简单地做一个
bmp.SetResolution(96,96);
要为将来的类似视网膜的显示器做好准备,您可以创建一个在启动时设置的类变量:
int ScreenDpi = 96;
private void Form1_Load(object sender, EventArgs e)
{
using (Graphics G = this.CreateGraphics()) ScreenDpi = (int)G.DpiX;
}
并在加载Bitmap
后使用它:
bmp.SetResolution(ScreenDpi , ScreenDpi );
像往常一样,DrawImage
方法使用Bitmap
的左上角。您可能需要为旋转点使用不同的 Points
,也可能需要为汽车的虚拟位置使用不同的 Points
,可能在汽车前部的中间。
关于c# - 在其中心旋转图形位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525965/