Я хочу нарисовать графический объект из метода (paint), который я создал в отдельном классе (Paintball). Я хочу, чтобы он рисовал в картинке только тогда, когда я левой кнопкой мыши с помощью мыши, и я хочу, чтобы точка, в которой я стрелял, была сохранена в списке. Когда я пытаюсь выполнить код ниже, он не стреляет. Ниже представлен класс Paintball.
{
private List<Point> myClick;
public Paintball()
{
myClick = new List<Point>();
}
public void add(Point location)
{
myClick.Add(location);
}
public void paint(Graphics g, Point point)
{
g.FillEllipse(Brushes.Blue, point.X, point.Y, 20, 20);
}
}
}
Это форма 1 ниже.
namespace AmazingPaintball
{
public partial class Form1 : Form
{
Random positionX = new Random();
Random positionY = new Random();
Target einstein;
int count;
List<Point> ballList = new List<Point>();
Paintball gun;
public Form1()
{
InitializeComponent();
Point point = new Point(positionX.Next(0, 638), positionY.Next(0, 404));
einstein = new Target(point);
ptrEinstein.Location = point;
gun = new Paintball();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
ptrEinstein.Location = einstein.Move(e.KeyData);
pictureBox1.Update();
pictureBox1.Refresh();
}
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
count++;
gun.add(e.Location);
pictureBox1.Refresh();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
foreach (var Paintball in ballList)
{
gun.paint(e.Graphics, this.PointToClient(Cursor.Position));
pictureBox1.Refresh();
}
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
pictureBox1.Refresh();
}
}
}
Пожалуйста, дайте мне знать, знаете ли вы, что нужно отредактировать/создать. Спасибо
В вашем исходном коде много ошибок. Попробуйте упростить то, что вы делаете, и решить, просто хранить список точек и рисовать их в окне изображения.
public partial class Form1 : Form
{
List<Point> ballList = new List<Point>();
public Form1()
{
InitializeComponent();
}
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
ballList.Add(e.Location);
pictureBox1.Refresh();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
foreach (Point pBall in ballList)
{
e.Graphics.FillEllipse(Brushes.Blue, pBall.X, pBall.Y, 20, 20);
}
}
}
Здесь у нас есть список, мы добавляем точки клика к нему в обработчик кликов и красим их в обработчике красок. Как только вам станет комфортно, возможно, перейдите к следующей задаче в своей программе и задайте новый вопрос, если вы застрянете со следующей функцией.
Хорошо, у меня есть немного времени, поэтому давайте посмотрим на ваш класс пейнтбола. Я переименовал его в Paintballs
так как он содержит многие из них, и это имя более подходит. Если вы хотите, чтобы список точек был закрыт, это нормально. Вы пытаетесь реализовать метод Paint
в классе, но он принимает аргумент Point
как аргумент и не работает ни в одном из состояний экземпляра класса - это, вероятно, не то, что вы хотите. Рассмотрим теперь:
public class Paintballs
{
private List<Point> myClick;
public Paintballs()
{
myClick = new List<Point>();
}
public void Add(Point location)
{
myClick.Add(location);
}
public void Paint(Graphics g)
{
foreach (Point p in myClick)
{
g.FillEllipse(Brushes.Blue, p.X, p.Y, 20, 20);
}
}
}
Здесь у нас есть открытый метод Paint
который будет рисовать все пейнтбольные шары в классе на любой графический экземпляр, который вы передаете ему. Теперь ваш код формы будет выглядеть так:
public partial class Form1 : Form
{
Paintballs pBalls = new Paintballs();
public Form1()
{
InitializeComponent();
}
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
pBalls.Add(e.Location);
pictureBox1.Refresh();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
pBalls.Paint(e.Graphics);
}
}
Поэтому мы упростили код формы, нажав метод рисования в сам класс пейнтбола. Это заставляет класс отвечать за знание того, как выглядят пейнтболы, сколько их там, где они есть, и как привлечь их к объекту Graphics
. Это шаг 1, заключающий ответственность.
Вы рисуете из списка точек, хранящихся в этой переменной ballList. Однако вы никогда не добавляли никаких точек в этот список.
Сделать список myClick в Paintball общедоступным, а в методе pictureBox1_Paint
- перебирать этот список вместо ballList
.
Refresh
в обработчикеPaint
- это вызовет бесконечный цикл. Ваш класс по пейнтболу - это просто список, но вы не выставляете элементы, ваш список ballList никогда не используется, но вы пытаетесь нарисовать его содержимое ... предлагаю вам решить более простую задачу и решить каждую из них по мере изучения. Вы пытаетесь сделать слишком много одновременно и делаете так много ошибок, что вы действительно не можете исправить этот код, не начав заново с нуля.