如何在随机y值绘制静态长度线

时间:2015-11-08 12:52:08

标签: c# graphics line draw windows-forms-designer

我正在尝试创建一个迷你游戏,你必须使用“炮塔”射击目标。目前我被困在我的目标线上。我的目标是让它以设定的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

1 个答案:

答案 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);
}