Как упростить остановку движения изображения в пределах порога цели - PullRequest
2 голосов
/ 16 января 2010

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

        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] может быть положительным или отрицательным. Я придумал несколько сравнений, которые работают для положительных значений, но не для отрицательных. Я считаю, что в его нынешнем состоянии он вообще не работает.

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

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 16 января 2010

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

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

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

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

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

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

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

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

1 голос
/ 16 января 2010

Попробуйте использовать 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]);
}
...