在其中心旋转图形位图

Bre*_*eyG 8 c# graphics

我正在为学校做项目,我们需要在不使用XNA的情况下在C#中进行基本的自上而下的比赛.首先让我告诉你,到目前为止我们学到的关于编程的东西与制作甚至远程看起来像一场比赛的东西没什么关系.它没有比数组,循环等更难.所以我们没有学习图形或类似的东西.

说完所有我有以下问题.

我们创建了一个Graphics对象,然后使用DrawImage并使用car.jpg中的位图.

graphics = e.Graphics;
graphics.RotateTransform(angle);
graphics.DrawImage(car, xPos, yPos, car.Width, car.Height);
Run Code Online (Sandbox Code Playgroud)

然后我们等待按键,例如右键

case Keys.Right:
  if (angle != 360)
  {
    angle += 10;
  }
  else
  {
    angle = 0;
  }
  this.Refresh();
  break;
Run Code Online (Sandbox Code Playgroud)

我们遇到的问题是旋转的枢轴点位于左上角.因此,只要我们将汽车移动到类似的东西(20,25)并开始旋转它,它就会(0,0)用作旋转中心.我们想要实现的是将中心旋转点置于汽车的中心位置.

我们试图寻找各种方法来改变centerXcenterYRotateTransform,但得出的结论是,这是不可能的位图.我们一直在努力解决这个问题超过2天,似乎无法找到任何解决方案来实现我们想要的东西.

有没有什么我们在创建Graphics对象时做错了,还是有一种完全不同的方式来改变centerXcenterY为汽车?

TaW*_*TaW 5

要绘制旋转,Bitmap您需要执行几个步骤来准备Graphics对象:

  • 首先,将其原点移动到旋转的中点
  • 然后你旋转所需的角度
  • 接下来你把它移回去
  • 现在你可以画了 Bitmap
  • 最后你重置了 Graphics

这需要为每个位图完成.

以下是绘制Bitmap bmpat position(xPos, yPos)的代码中的步骤:

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();
Run Code Online (Sandbox Code Playgroud)

还有一个可能的并发症:如果你Bitmap有不同的dpi分辨率比屏幕即比Graphics你必须首先调整Bitmapdpi设置!

为了适应Bitmap平常,96dpi你可以简单地做一个

bmp.SetResolution(96,96);
Run Code Online (Sandbox Code Playgroud)

为了为将来的类视网膜显示做好准备,您可以创建一个在启动时设置的类变量:

int ScreenDpi = 96;
private void Form1_Load(object sender, EventArgs e)
{
  using (Graphics G = this.CreateGraphics()) ScreenDpi = (int)G.DpiX;
}
Run Code Online (Sandbox Code Playgroud)

并在加载后使用它Bitmap:

bmp.SetResolution(ScreenDpi , ScreenDpi );
Run Code Online (Sandbox Code Playgroud)

像往常一样,该DrawImage方法使用左上角Bitmap.您可能需要使用不同Points的旋转点,也可能需要使用不同的汽车虚拟位置,可能在它的正面中间..