Инициализация bool мешает моей логике

#c# #.net #visual-studio #xna

#c# #.net #visual-studio #xna

Вопрос:

Я работаю над этим методом, который занимается обнаружением столкновений. У меня возникла проблема с инициализацией direction bool значением true. Иногда при запуске объекта угол меняется на противоположный, потому что он ожидает, что bool будет false .

Если объект изначально направлен влево (между 0 и 350 в моем коде), bool должен быть true. Если он направлен вправо (между 350 и 700), bool должен быть false.

Как я могу установить для начального bool соответствующее значение true / false, не вмешиваясь в последующее обнаружение столкновений?

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

 //Move bubble
    public void MoveBubble(Bubble bubble, Vector2 distance)
    {
        if (bubble.stop == false)
        {
            velocityX = speed * distance.X;
            velocityY = speed * distance.Y;

            bubble.X  = velocityX;

            //Problem section
            if (bubble.Y > 0 amp;amp; bubble.Y < 350)
                direction = true;

            if (bubble.Y > 350 amp;amp; bubble.Y < 700)
                direction = false;
            //End Problem section

            if (direction == true)
                bubble.Y  = velocityY;

            if (direction == false)
                bubble.Y -= velocityY;

            if (bubble.Y <= 0 || bubble.Y >= 350)
                direction = !direction;
        }
    }    
  

Исправлен код:

     //Move bubble and reverse it's velocity if it collides with a wall
    internal void MoveBubble(Bubble bubble, Vector2 distance)
    {
        if (bubble.stopped == false)
            if (bubble.Y < 0 || bubble.Y > 350)
                bubble.velocityY = -bubble.velocityY;

            bubble.Y  = bubble.velocityY;
            bubble.X  = bubble.velocityX;
    }
  

Комментарии:

1. Как direction в настоящее время инициализируется?

2. Если объект изначально направлен влево (между 0 и 225 в моем коде), bool должен быть true. — почему бы вам не сделать именно это? Инициализировать direction перед «запуском»?

3. На самом деле не имеет смысла иметь двумерное «расстояние» — если бы я увидел метод, который принимает пузырь и вектор, я бы предположил, что метод смещает / перемещает пузырь на этот вектор.

4. Хайнци, direction просто устанавливается в true при инициализации. Я удалил свои неудачные попытки установить его из кода выше. Боже, когда я создаю эти инструкции if, это портит код дальше вниз, и вместо того, чтобы мои объекты отскакивали от стен взад и вперед, они прилипают к стенам при движении вверх.

Ответ №1:

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

Объяснение того, что я имею в виду

То, что я вижу, что вы здесь делаете, это:

  1. Ищу направление, в котором вы собираетесь двигаться
  2. Переместите пузырь
  3. Проверьте, должен ли пузырь изменить направление

По моему мнению, то, что вам нужно сделать, это

  1. Проверьте направление, которому нужно следовать
  2. Переместите пузырь

Когда вы начнете другое движение, вы проверите направление, которое должен принять пузырь

Комментарии:

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

2. Вы должны удалить последнее условие, чтобы изменить расстояние, таким образом, вы вычисляете направление, в котором пузырь должен следовать на этом шаге. Точно так же, как «Давайте посмотрим, куда вам теперь нужно идти», это то, на что я ссылаюсь.

3. Извините, я не понимаю, что вы здесь имеете в виду.

4. Посмотрите, что я отредактировал: P

Ответ №2:

Я бы сказал, что вам следует использовать не логическое значение, а перечисление:

  enum Direction
 {
     Unknown,
     Left,
     Right
 }
  

Таким образом, вы можете инициализировать его как unknown и проверить это в своем коде.

Комментарии:

1. Как может направление физического объекта быть неизвестным?

2. Андерс прав. Не будет ситуации, когда я имею дело с неизвестным. Я просто не могу понять, как проверять влево или вправо только один раз, а не при каждом перемещении объекта.