Как правильно нарисовать объекты на Bitmap, чтобы можно было получить цвет пикселя?
Есть аквариум со скалами, в нём плавают рыбы. Рисую в picturebox. Вот прорисовка аквариума(в классе Aquarium):
public void Init(Graphics g) /*здесь в параметр я пытался ставить Bitmap bp, поэтому ниже использовано using*/
{
//using (Graphics g = Graphics.FromImage(bp))
//{
g.Clear(Color.Aquamarine);
SolidBrush rocks = new SolidBrush(Color.Gray);
g.FillPolygon(rocks, new Point[]
{
new Point(30, 400), new Point(50, 330), new Point(80, 400), //это скалы
new Point(120, 300), new Point(180, 400), new Point(270, 300),
new Point(300, 400), new Point(350, 350), new Point(400, 400),
new Point(430, 370), new Point(500, 400)
});
//}
}
А вот рыба(тоже в своём классе):
protected override void Draw(int x, int y, int size, string dir, Graphics g)
{
//using (Graphics g = Graphics.FromImage(bp))
//{
double halfbase = size * N / Math.Tan(Math.PI / 3);
SolidBrush brushpike = new SolidBrush(Color.Red);
Point[] points = new Point[3];
points[0] = new Point(x, y);
switch (dir)
{
case "Вверх":
points[1] = new Point((int)(x - halfbase), y + size * N);
points[2] = new Point((int)(x + halfbase), y + size * N);
break;
case "Вниз":
points[1] = new Point((int)(x - halfbase), y - size * N);
points[2] = new Point((int)(x + halfbase), y - size * N);
break;
case "Влево":
points[1] = new Point(x + size * N, (int)(y - halfbase));
points[2] = new Point(x + size * N, (int)(y + halfbase));
break;
case "Вправо":
points[1] = new Point(x - size * N, (int)(y - halfbase));
points[2] = new Point(x - size * N, (int)(y + halfbase));
break;
}
g.FillPolygon(brushpike, points);
//}
}
Ну и вот как пишу в главном классе Form1, только я уже запутался совсем, перепробовал много вариантов:
public partial class Form1 : Form
{
Bitmap bp;
Graphics g;
public Form1()
{
InitializeComponent();
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
bp = new Bitmap(pictureBox1.Image);
g = Graphics.FromImage(bp);
}
Aquarium Taquarium = new Aquarium();
//Graphics g;
private void button1_Click(object sender, EventArgs e) /*рисовать аквариум нужно в этом событии*/
{
button1.Visible = false;
groupBox1.Visible = true;
groupBox2.Visible = true;
//bp = new Bitmap(pictureBox1.Image);
Taquarium.Init(g);
}
Вот рисование рыбы в другом событии(нажатие другой кнопки):
Pike TPike = new Pike();
using (Graphics g = Graphics.FromImage(bp))
{
TPike.Init(Convert.ToInt32(textBox1.Text), //метод, задающий поля рыбы
Convert.ToInt32(textBox2.Text),
Convert.ToInt32(textBox3.Text),
Convert.ToInt32(textBox4.Text),
domainUpDown1.Text, g);
}
Раньше всё работало хорошо, за исключением того, что не мог получить цвет пикселя по ходу движения рыбы, а когда начал работать с Bitmap, рыбы вовсе перестали появляться на картинке, только аквариум рисуется. Не знаю, что делать, на одном сайте вообще прочитал, что рисовать надо в событии Paint, но мне надо по нажатию кнопки. Что можете подсказать?