我目前正在进行战舰游戏,但我遇到了一个问题。到目前为止,我已设法绘制网格。绘制方法的目的是绘制图像当我左键单击时,(不知道如何/可以为某个表面着色)网格中的正方形内部。 这里的问题是,即使图像的大小是25x25(正方形的大小),它占据了屏幕的一半,当它工作时它就是50%的时间。发生了,另外50%它会在屏幕中间绘制一个巨大的图像,无论光标位于何处或是否左键单击。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Paint += new PaintEventHandler(form1_paint);
}
private void form1_paint(object sender, PaintEventArgs e)
{
draw(e);
}
int x,y;
private void draw(PaintEventArgs e)
{
if (MouseButtons.Left != 0)
{
x = Cursor.Position.X;
y = Cursor.Position.Y;
Image poza = Image.FromFile("D://C//12E//c#//yellow4.jpg");
if (x < 301 && x > 24 && y < 301 && y > 24)
{
PointF coltz = new PointF(x / 25 * 25, y / 25 * 25);
e.Graphics.DrawImage(poza, coltz);
}
}
}
有谁知道我怎么能解决这个问题?或者如果有人对战舰网格有更好的想法,我愿意接受建议。谢谢!
答案 0 :(得分:2)
最重要的是,这行代码:Cursor.Position.X
为您提供光标在屏幕上的全局位置,而不是在游戏窗口中。我建议您处理MouseMove
事件以获取相对于您应用内容的排名。
第二件事是您从计算机上的文件加载图像。我认为将图片添加到您应用的资源会更好,因此您可以更轻松地加载它,只需按名称调用它,例如:AppName.Properties.Resources.ImageName
- 它会返回Image
对象你可以立即使用。
还有一件事。此if (MouseButtons.Left != 0)
不会检查是否按下鼠标左键。您必须检查MouseButtons
属性是否等于System.Windows.Forms.MouseButtons.Left
。
这里有适合我的完整代码:
public partial class Form1 : Form
{
private int x, y;
public Form1()
{
InitializeComponent();
Paint += Form1_Paint;
MouseMove += Form1_MouseMove;
MouseDown += Form1_MouseMove;
}
void Form1_Paint(object sender, PaintEventArgs e)
{
Draw(e);
}
private void Draw(PaintEventArgs e)
{
if (MouseButtons == System.Windows.Forms.MouseButtons.Left)
{
if (x < 301 && x > 24 && y < 301 && y > 24)
{
PointF coltz = new PointF(x / 25 * 25, y / 25 * 25);
e.Graphics.DrawImage(AppName.Properties.Resources.ImageName, coltz);
}
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;
Invalidate();
}
}
结果如下:
当用户点击按钮而不移动光标时,我还订阅了MouseDown
事件以显示黄色矩形。
答案 1 :(得分:0)
public Form1()
{
InitializeComponent();
Paint += Form1_Paint;
MouseMove += Form1_MouseMove;
MouseDown += Form1_MouseMove;
}
private int x,y;
void Form1_Paint(object sender, PaintEventArgs e)
{
Draw(e);
}
private void Draw(PaintEventArgs e)
{
if (MouseButtons == System.Windows.Forms.MouseButtons.Left)
{
if (x < 301 && x > 24 && y < 301 && y > 24)
{
PointF coltz = new PointF(x / 25 * 25, y / 25 * 25);
e.Graphics.DrawImage(battleships.Properties.Resources.yellow4, coltz);
}
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g;
g = e.Graphics;
Pen pen = new Pen(Color.Black);
pen.Width = 1;
for (int i = 25; i <= 300; i = i + 25)
{
g.DrawLine(pen, i, 25, i, 300);
g.DrawLine(pen, 25, i, 300, i);
}
}
}