0

我正在尝试在 Windows 窗体上创建一个图形,该图形将模拟我尝试ProgressBar使用用作健康栏的操作。我不喜欢 ,因为当我将equalProgressBar设置为 时,它会在开始时为填充设置动画。ValueMaximum

这是我的方法

private void Battlefield_Paint(object sender, PaintEventArgs e)
  {
      using (SolidBrush blackBrush = new SolidBrush(Color.Black))
      using (SolidBrush redBrush = new SolidBrush(Color.Red))
      using (Graphics formGraphics = this.CreateGraphics())
      {
          formGraphics.FillRectangle(blackBrush, new Rectangle(12, 12, 76, 23));
          formGraphics.FillRectangle(redBrush, new Rectangle(14, 14, 72*(p1.CurrentHealth/p1.MaxHealth), 19));
          int result = 72 * (p1.CurrentHealth / p1.MaxHealth);
          Console.WriteLine(result);
      }
  }

我有一个计时器每 50 毫秒重绘一次表单。

我有一个问题,黑色矩形内的红色矩形一开始会画得很好,但是一旦我的角色受到伤害并且CurrentHealth小于MaxHealth,结果72*(p1.CurrentHealth/p1.MaxHealth)返回为 0,并且矩形甚至不会出现在屏幕,因为我认为它是用 0 宽度绘制的......

我不知道这个计算出了什么问题会导致它返回 0。我已经通过调试器运行了一堆,输入的值看起来都是正确的,起初都是 30 和 30,然后是 28, 30 下一次通过,我得到的值为 0...

4

1 回答 1

1

我想CurrentHealthMaxHealth是整数,并且您正在进行整数除法,当您将 6 除以 10 时,您得到 0,而不是 0.6

你应该试试这个:

private void Battlefield_Paint(object sender, PaintEventArgs e)
  {
      using (SolidBrush blackBrush = new SolidBrush(Color.Black))
      using (SolidBrush redBrush = new SolidBrush(Color.Red))
      {
          e.Graphics.FillRectangle(blackBrush, new Rectangle(12, 12, 76, 23));
          e.Graphics.FillRectangle(redBrush, new Rectangle(14, 14, (int)(72.0*((double)p1.CurrentHealth/(double)p1.MaxHealth)), 19));
          int result = (int)(72.0*((double)p1.CurrentHealth/(double)p1.MaxHealth));
          Console.WriteLine(result);
      }
  }

此外,您应该使用而不是每次都e.Graphics制作新对象。Graphics

于 2012-11-15T23:31:53.470 回答