Метод, который проверяет четыре ребра шара один за другим, чтобы увидеть, не столкнулся ли он со стеной - PullRequest
0 голосов
/ 28 октября 2019

Добавьте в ваш код метод, который проверяет каждую из четырех граней шара по очереди, проверяя, столкнулась ли эта грань с кромкой окна. Если так, это должно изменить направление соответственно. Например, если шар двигался на северо-восток (↗), а верхний край достиг верхней части экрана, он изменил бы направление на юго-восток (↘), так что мяч, казалось бы, отскочил от края. (Помните, что если мяч попадет прямо в угол в диагональном направлении, два края могут ударить одновременно, заставив его отскочить прямо назад в противоположном диагональном направлении.)

Я не уверен, как получить четырекрая овала. У меня есть другие 4 направления (вверх, вниз, влево, вправо), но я не уверен, как обращаться с углами окна.

public void move()
  {
   //direction right
   if(dir == 1)
   {
       int x = ball.getX();
       int y = ball.getY();
       ball.setLocation(x + 1,y);        
            if(x>425)
            {
                dir = 2;                           
            }
   }           
   //direction left
   if(dir == 2)
   {
       int x = ball.getX();
       int y = ball.getY();
       ball.setLocation(x - 1,y);          
            if(x<0)
            {
                dir = 1;
            }
   }           
   //direction down
   if(dir == 3)
   {
       int x = ball.getX();
       int y = ball.getY();
       ball.setLocation(x,y + 1);               
            if(y>425)
            {
                dir = 4;
            }
   }       
   //direction up
   if(dir == 4)
   {
       int x = ball.getX();
       int y = ball.getY();
       ball.setLocation(x ,y - 1);         
            if(y<0)
            {
                dir = 3;
            }
   }           
   //direction bottom right corner
   if(dir == 5)
   {
       int x = ball.getX();
       int y = ball.getY();
       ball.setLocation(x + 1,y + 1);                           
   }           
   //direction upper right corner
   if(dir == 6)
   {
       int x = ball.getX();
       int y = ball.getY();
       ball.setLocation(x + 1,y - 1);
   }       

   //direction bottom left corner
   if(dir == 7)
   {
       int x = ball.getX();
       int y = ball.getY();
       ball.setLocation(x - 1,y + 1);
   }       
   //direction upper left corner
   if(dir == 8)
   {
       int x = ball.getX();
       int y = ball.getY();
       ball.setLocation(x - 1,y - 1);      
   }
}

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

1 Ответ

0 голосов
/ 29 октября 2019

Не думай слишком много о том, чтобы быть овалом. Для целей данного назначения это может быть также поле. Единственная разница между случаем для углов по сравнению со случаем для ребра состоит в том, что вам необходимо различать 4 результата:

  1. Вы попали в горизонтальную и вертикальную стену: измените направление на противоположное диагоналидвижение.
  2. Вы попали в горизонтальную стену: удерживайте вертикальное направление и переключите горизонтальное в противоположное.
  3. Вы попали в вертикальную стену: сохраните горизонтальное направление и переключите вертикальное в противоположное.
  4. Вы совсем не попадаете в стену: ничего не делаете.

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

В моем примере я представляю метод changeDirection(), который только проверяет, попала ли какая-либо граница, а затем поворачивает вас, но никакого реального движения не происходит. ,Вам все еще нужно реализовать move() и позаботиться об этом, но вы можете просто вызвать этот метод и предположить, что после этого мяч движется в правильном направлении.

Кроме того, код становится легче понять, как только выввести именованные константы для ссылки на направления:

  private static final int RIGHT = 1;
  private static final int LEFT = 2;
  private static final int DOWN = 3;
  private static final int UP = 4;
  private static final int DOWN_RIGHT = 5;
  private static final int UP_RIGHT = 6;
  private static final int DOWN_LEFT = 7;
  private static final int UP_LEFT = 8;

  private static final int WIDTH = 425;
  private static final int HEIGHT = 425;

  public void changeDirection()
  {
    int x = ball.getX();
    int y = ball.getY();

    switch ( dir )
    {
      case RIGHT:
        if ( x >= WIDTH )
        {
          dir = LEFT;
        }
        break;
      case LEFT:
        if ( x <= 0 )
        {
          dir = RIGHT;
        }
        break;
      case DOWN:
        if ( y >= HEIGHT )
        {
          dir = UP;
        }
        break;
      case UP:
        if ( y <= 0 )
        {
          dir = DOWN;
        }
        break;
      case DOWN_RIGHT:
        if ( y >= HEIGHT )
        {
          if ( x >= WIDTH )
          {
            dir = UP_LEFT;
          }
          else
          {
            dir = UP_RIGHT;
          }
        }
        else if ( x >= WIDTH )
        {
          dir = DOWN_LEFT;
        }
        break;
      case UP_RIGHT:
        if ( y <= 0 )
        {
          if ( x >= WIDTH )
          {
            dir = DOWN_LEFT;
          }
          else
          {
            dir = DOWN_RIGHT;
          }
        }
        else if ( x >= WIDTH )
        {
          dir = UP_LEFT;
        }
        break;
      case DOWN_LEFT:
        if ( y >= HEIGHT )
        {
          if ( x <= 0 )
          {
            dir = UP_RIGHT;
          }
          else
          {
            dir = UP_LEFT;
          }
        }
        else if ( x <= 0 )
        {
          dir = DOWN_RIGHT;
        }
        break;
      case UP_LEFT:
        if ( y <= 0 )
        {
          if ( x <= 0 )
          {
            dir = DOWN_RIGHT;
          }
          else
          {
            dir = UP_LEFT;
          }
        }
        else if ( x <= 0 )
        {
          dir = UP_RIGHT;
        }
        break;
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...