Взаимодействие двух пикчербоксов

297
17 ноября 2017, 05:29

Есть форма, в которой с помощью клавиш ездит пикчербокс:

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

То есть когда пикчербокс достигает например верхней границы, он оставнавливается и смещается на один пиксель вниз. Вопрос в следующем: как реализовать возможность того, чтобы пикчербокс не заезжал на объекты в середине формы? Они будут в виде прямоугольных пикчербксов. Если просчитывать каждую сторону и ставить условия будет очень долго и нерационально. Может кто подскажет более верный и элегантный способ? Спасибо заранее.

Answer 1

Как верно заметили в коментариях, можно реализовать матрицу - так будет правильнее. Логика выполнятся по матрице - 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);
}
READ ALSO
Поворот объекта к центу другого объекта в Unity3d C#

Поворот объекта к центу другого объекта в Unity3d C#

У меня есть сфераУ меня есть куб

330
Как настроить строку подключения к MSSQL?

Как настроить строку подключения к MSSQL?

Проект использует EntityFramework Code First

249
передать модель через ajax в asp.net mvc

передать модель через ajax в asp.net mvc

У меня есть 2 модели, назовем их условно Model1 и Model2Model1:

335