0

ProgressBarヘルスバーとして使用しようとしていたことをシミュレートする Windows フォーム上に描画を作成しようとしています。を に等しくProgressBar設定すると、開始時に塗りつぶしがアニメートされるため、は好きではありませんでした。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);
      }
  }

50msごとにフォームを再描画するタイマーがあります。

最初は黒い四角形の内側にある赤い四角形がうまく描画されるという問題がありますが、キャラクターがダメージを受けてCurrentHealth未満になるMaxHealthと、 の結果が72*(p1.CurrentHealth/p1.MaxHealth)0 に戻り、四角形が画面、幅0で描画されていると思います...

0 を返すこの計算で何が問題なのかわかりません。デバッガーをたくさん実行したところ、最初は両方とも 30 と 30 になり、次に 28 のような値になりました。次回は30で、値は0になります...

4

1 に答える 1

1

とは整数でCurrentHealthありMaxHealth、整数除算を行っているとします。6 を 10 で除算すると、0.6 ではなく 0 になります。

これを試してください:

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 に答える