Есть форма, в которой с помощью клавиш ездит пикчербокс:
private void Form3_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.W)
{
up();
}
if (e.KeyData == Keys.S)
{
down();
}
if (e.KeyData == Keys.A)
{
left();
}
if (e.KeyData == Keys.D)
{
right();
}
if (e.KeyData == Keys.Q)
{
stop();
}
}
private void right()
{
m = 1;
}
private void left()
{
m = 2;
}
private void up()
{
m = 3;
}
private void down()
{
m = 4;
}
private void stop()
{
m = 5;
}
private void timer5_Tick(object sender, EventArgs e)
{
if (m == 1)
{
pictureBox21.Location = new Point(pictureBox21.Location.X + 1, pictureBox21.Location.Y);
}
if (m == 2)
{
pictureBox21.Location = new Point(pictureBox21.Location.X - 1, pictureBox21.Location.Y);
}
if (m == 3)
{
pictureBox21.Location = new Point(pictureBox21.Location.X, pictureBox21.Location.Y - 1);
}
if (m == 4)
{
pictureBox21.Location = new Point(pictureBox21.Location.X, pictureBox21.Location.Y + 1);
}
if (m == 5)
{
pictureBox21.Location = new Point(pictureBox21.Location.X, pictureBox21.Location.Y);
}
По границам расположены лэйблы, за которые он не должен заезжать, реализовал это путём следующего кода:
if (pictureBox21.Location.Y < 97)
{
stop();
pictureBox21.Location = new Point(pictureBox21.Location.X, pictureBox21.Location.Y + 1);
}
if (pictureBox21.Location.X < 15)
{
stop();
pictureBox21.Location = new Point(pictureBox21.Location.X+1, pictureBox21.Location.Y);
}
То есть когда пикчербокс достигает например верхней границы, он оставнавливается и смещается на один пиксель вниз. Вопрос в следующем: как реализовать возможность того, чтобы пикчербокс не заезжал на объекты в середине формы? Они будут в виде прямоугольных пикчербксов. Если просчитывать каждую сторону и ставить условия будет очень долго и нерационально. Может кто подскажет более верный и элегантный способ? Спасибо заранее.
Как верно заметили в коментариях, можно реализовать матрицу - так будет правильнее. Логика выполнятся по матрице - view можно сделать от неё не зависимым.
Но конкретно в вашем случае, я думаю, можно обойтись добавлением высоты и ширины картинки к проверкам.
if (pictureBox21.Location.Y + pictureBox21.Height < 97)
{
stop();
pictureBox21.Location = new Point(pictureBox21.Location.X, pictureBox21.Location.Y + 1);
}
if (pictureBox21.Location.X + pictureBox21.Width < 15)
{
stop();
pictureBox21.Location = new Point(pictureBox21.Location.X+1, pictureBox21.Location.Y);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть 2 модели, назовем их условно Model1 и Model2Model1: