我正在尝试在Windows窗体上创建一个图形,该图形将模拟我尝试使用ProgressBar
作为健康栏的操作。我不喜欢ProgressBar
,因为当我将Value
设置为Maximum
时,它会在开头设置填充动画。
这是我的方法
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
,{{1返回为0,矩形甚至没有显示在屏幕上,因为我认为它是用0宽度绘制的......
我不知道这个计算会出现什么问题会导致它返回0.我已经通过调试器运行了一堆并且值看起来正确,一开始是30和30,然后是下次通过28,30时,我得到的值为0 ......
答案 0 :(得分:1)
我认为CurrentHealth
和MaxHealth
是整数,你正在进行整数除法,当你将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
对象。