Как упростить остановку движения изображения в пределах порога цели

2

Я уже пытался объяснить, что я пытаюсь сделать с другими, и потерпел неудачу. Поэтому, если вы извините меня, я просто покажу вам код и попытаюсь немного объяснить.

        if (MovePetMoving)
        {
            if (MovePetSlope[0] > 0)
            {
                if (MovePetSlope[1] > 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] <= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] <= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] > 0 and MovePetSlope[1] > 0", "");
                }
                else if (MovePetSlope[1] < 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] <= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] >= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] > 0 and MovePetSlope[1] < 0", "");
                }
                else
                {
                    MovePetMoving = false;
                    //MsgBox("Error", "");
                }
            }
            else if (MovePetSlope[0] < 0)
            {
                if (MovePetSlope[1] > 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] >= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] <= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] < 0 and MovePetSlope[1] > 0", "");
                }
                else if (MovePetSlope[1] < 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] >= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] >= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] < 0 and MovePetSlope[1] < 0" + Convert.ToString(pictureBoxPet.Location.X) + MovePetSlope[0] + MovePetTarget[0], "");
                }
                else
                {
                    MovePetMoving = false;
                    //MsgBox("Error", "");
                }
            }
        }

    }

Вот оно. Если вы задаетесь вопросом обо всех ссылках на "домашнее животное", я делаю тамогочи (или, как бы вы его не пишете), как игра для моей маленькой сестры.

Проблема заключается в том, что значение MovePetSlope [1] или [0] может быть положительным или отрицательным. Я придумал некоторые сравнения, которые работают для положительных значений, но не для отрицательных значений. Я считаю, что в этом текущем состоянии он вообще не работает.

Любая помощь будет принята с благодарностью.

Спасибо заранее!

  • 0
    Что вы пытаетесь достичь в точности? Что бы это ни было, я сомневаюсь, что ответом будут другие вопросы и ответы.
  • 0
    Я пытаюсь заставить изображение перестать двигаться, как только оно достигнет цели. Изменение исходного поста; текущий код на самом деле работает, я думал о другом, который я пробовал.
Показать ещё 2 комментария
Теги:
target
comparison
move

2 ответа

1
Лучший ответ

Попробуйте использовать Math.Abs, чтобы упростить сравнение. В общем, домашнее животное должно продолжать движение до Math.Abs(pictureBoxPet.Location.X-MovePetTarget[0]) < Math.Abs(MovePetSlope[0]) и аналогично для Y и 1. Вы должны получить гораздо более простой код.

Если ваш питомец движется прямо к цели, это должно сделать трюк:

if (MovePetMoving)
{
    if (Math.Abs(pictureBoxPet.Location.X-MovePetTarget[0]) < Math.Abs(MovePetSlope[0]))
        MovePetMoving = false;
    else
        MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
}
  • 0
    Спасибо Мик, я попробую это прямо сейчас. Я посмотрю "рефрактор" тоже. РЕДАКТИРОВАТЬ: ха-ха, рефрактор для упрощения. :)
  • 0
    Это просто означает переписать один и тот же код таким образом, чтобы его было легче просматривать и обслуживать, или он просто более элегантный или полезный.
Показать ещё 1 комментарий
1

Другая стратегия:

  • определить переменную типа Rectangle, которая содержит границы целевых объектов в координатах экрана: при необходимости увеличивайте границы по определенной пороговой переменной.

  • определить обработчики событий MouseUp и MouseDown для PictureBox

  • определить логическую переменную (в области формы), которая установлена ​​в true, когда мышь опускается (в обработчике событий MouseDown) в PictureBox и false в обработчике MouseUp для PictureBox.

  • определить обработчик события MouseMove для PictureBox, в котором:

    а. если логическая переменная истинна (мышь опущена)

    • используйте метод Rectangle.IntersectsWith, чтобы увидеть, перекрываются ли текущие границы PictureBox с прямоугольником целевых границ. MSDN Rectangle.IntersectsWith: если вы знаете, что можете остановить.

imho, используя эту страгию, вы можете написать очень упрощенный код.

  • 0
    Спасибо BillW, я тоже посмотрю на это. Хотя я не использую мышь, «советы по стратегии» № 1 и 4b будут работать для меня. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню