我正在尝试创建一个迷你游戏,你必须使用“炮塔”射击目标。目前我被困在我的目标线上。我的目标是让它以设定的X值生成,但每当我按下重绘按钮时它会以随机的Y值生成。但是我的代码遇到了问题。它不是总是具有相同的长度并且随机Y值产生,而是以随机长度和随机Y值产生。如果有人能帮我弄清楚哪里出错了那将是完美的。
相关变量为Date dob1 = new SimpleDateFormat("yyyy-MM-dd")).parse(date);
,xTarget
(行的前y值)yTarget
(行的第二个y值)yTargetEnd
(静态长度)对于targetLine
的{{1}}方法调用。
在我脑海里,我设置它的方式很有意义,但似乎并没有按照我的预期进行。我尝试将DrawLine()
设置为随机数,然后将targetLine
设置为yTarget
,因此它的长度应始终为50,但这似乎根本不起作用?
yTargetEnd
Designer生成的代码:
yTarget + targetLine
答案 0 :(得分:0)
基本问题归结为代码与您的预期不匹配。你写道:
我尝试将
yTarget
设为随机数,然后将yTargetEnd
设为yTarget + targetLine
但实际上并不是代码的作用。你的代码以相反的顺序完成这两件事。因此,yTargetEnd
值始终基于上一个目标位置,而不是新选择的位置。
您的代码应该是这样的:
private void btnRedraw_Click(object sender, EventArgs e)
{
yTarget = rnd.Next(100, 500);
yTargetEnd = yTarget - targetLine;
}
即。编写代码以使其符合您的规范。 :)
回答后,您的代码中还有一些其他重要问题需要解决:
Refresh()
事件处理程序中调用Update()
,Invalidate()
或Paint
。相反,你应该在某个地方有单独的逻辑,例如基于计时器,后台线程等处理数据状态(即您的游戏世界)的控制,如果数据以需要它们的方式发生变化,则会使相关窗口或控件无效重新绘制。Pen
对象,如果不可能,请处置自定义Pen
对象或将其存储在某处以供重复使用。例如:
private static readonly Pen _firedLine =
new Pen(Color.Blue) { DashPattern = new [] { 5f, 2f } };
private void LineDrawEvent(object sender, PaintEventArgs paint)
{
Graphics drawSurface = paint.Graphics;
Pen turretLine = Pens.Blue;
Pen graphHorizontal = Pens.Red;
Pen graphVertical = Pens.Red;
Pen targetLine = Pens.Black;
drawSurface.DrawLine(graphVertical, (int)xOrigin, (int)yOrigin, (int)xHor, (int)yHor);
drawSurface.DrawLine(graphHorizontal, (int)xOrigin, (int)yOrigin, (int)xVert, (int)yVert);
drawSurface.DrawLine(_firedLine, (int)xOrigin, (int)yOrigin, (int)xFire, (int)yFire);
drawSurface.DrawLine(targetLine, (int)xTarget, (int)yTarget, (int)xTarget, (int)yTargetEnd);
double angleInRadians = ConvertDegsToRads((double)trckBarAngle.Value);
xEnd = xOrigin + lineLength * Math.Cos(angleInRadians / 2.0);
yEnd = yOrigin - lineLength * Math.Sin(angleInRadians / 2.0);
drawSurface.DrawLine(turretLine, (int)xOrigin, (int)yOrigin, (int)xEnd, (int)yEnd);
}