#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. Я думаю, проблема в том, что когда я пытаюсь проверить, каким должно быть направление, а затем задать его, я непреднамеренно накладываю ограничения на объекты. Я не могу понять, как разделить эти два. В идеале проверка между 0 и 350 и проверка между 350 и 700 должна выполняться только один раз, но они проверяются каждый раз при вызове метода, и это вызывает проблему.
2. Вы должны удалить последнее условие, чтобы изменить расстояние, таким образом, вы вычисляете направление, в котором пузырь должен следовать на этом шаге. Точно так же, как «Давайте посмотрим, куда вам теперь нужно идти», это то, на что я ссылаюсь.
3. Извините, я не понимаю, что вы здесь имеете в виду.
4. Посмотрите, что я отредактировал: P
Ответ №2:
Я бы сказал, что вам следует использовать не логическое значение, а перечисление:
enum Direction
{
Unknown,
Left,
Right
}
Таким образом, вы можете инициализировать его как unknown и проверить это в своем коде.
Комментарии:
1. Как может направление физического объекта быть неизвестным?
2. Андерс прав. Не будет ситуации, когда я имею дело с неизвестным. Я просто не могу понять, как проверять влево или вправо только один раз, а не при каждом перемещении объекта.