Как сделать так, чтобы 2 прямоугольника обнаруживали друг друга, когда они касаются Java? - PullRequest
0 голосов
/ 09 мая 2020
  if(rect3.a+30>rect2.a){


        ballright=false;
        bounce++;
    }
     if(rect3.a-30<rect1.a){

        ballright=true;
        bounce++;
    }

 public void paint(Graphics g){
    super.paint(g);
    Graphics2D g2d=(Graphics2D) g;
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, 1080, 760);

    g2d.setColor(Color.WHITE);
   // g.fillOval(x, y, 30, 30);
   g2d.fillRect(rect3.a, rect3.b, 30, 30);


    g2d.setColor(Color.WHITE);
    g2d.fillRect(rect1.a, rect1.b, 30, 200);

    g2d.setColor(Color.WHITE);
    g2d.fillRect(rect2.a, rect3.b-50, 30, 200);

    g2d.fillRect(520, 0, 10, 760);

Итак, у меня есть эти прямоугольники, чтобы быть объектами для игры в понг. За исключением того, что я, кажется, не могу понять, как заставить мяч (rect3) отскакивать от лопастей (rect1,2) и, если лопастей нет go, к краю окна, чтобы набрать очко. В моем нынешнем виде он просто отскакивает от всей оси y в точках 0 и 1080. Есть ли способ заставить его отскакивать только тогда, когда ракетка есть, и если она не набирает очко?

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Давайте начнем с базовых c объектов здесь:

  1. Левый манипулятор (left: top: height: width = x1, y1, h, w)
  2. Правый манипулятор (left: top: height: width = x2, y2, h, w)
  3. Ball (centreXpos: centreYpos: radius = bx, by, r)
  4. Доска (слева: top: height : width = boardX, boardY, boardH, boardW)

Примечание: - ширина здесь относится к короткой стороне - высота относится к длине длинной стороны прямоугольника

Теперь, когда у нас есть объекты, давайте определим края, с которыми вы хотите обнаружить столкновение:

1. Left Paddle - поверхность столкновения будет длинной правой стороной (т.е. все пиксели от x = (слева + ширина) y = сверху до x = (слева + ширина) y = (сверху + высота))

2. Правая ракетка - поверхность столкновения будет длинной левой стороной (т.е. все пиксели от x = (слева) y = сверху до x = (слева) y = (сверху + высота))

3. Ball - поверхность столкновения - это все пиксели на краю круга, поэтому bx +/- радиус и +/- радиус

4. Доска - Поверхность столкновения - это края доски - Длинные края должны заставлять вас отскакивать - короткие края должны завершать ралли

Обнаружение столкновений - если поверхность столкновения шара > = поверхность столкновения правой ракетки или - если поверхность столкновения шара <= поверхность столкновения левой ракетки </p>

Что делать при обнаружении столкновения? - если столкновение обнаружено с левым рычагом измените направление, чтобы двигаться вправо (измените шаг на bx и by, чтобы он принял другое направление) - если обнаружено столкновение с левым концом, но не с анимацией остановки весла - если обнаружено столкновение с правым рычагом, измените направление для движения налево - если обнаружено столкновение с правым концом, но не с анимацией остановки лопасти

Предложение вокруг объектов

Было бы полезно, если бы вы смоделировали свои объекты, а затем в своей анимации l oop называется детектором столкновений с каждой интересующей вас поверхностью Столкновение d Затем etector может ответить перечислением. У вас может быть другая функция, основанная на перечислении

Из того, что я вижу до сих пор, вам понадобится

GameObjects
|-- Ball
|-- Paddle
    |-- Left
    |-- Right
|-- Board

, вы можете выбрать использование наследования.

CollisionDetector

  • перебирать все игровые объекты и определять, столкнулся ли мяч с любыми интересующими вас поверхностями
  • Здесь вы можете получить оба объекта, скажем, Ball и Left-Paddle и иметь определенные c подпрограммы столкновения, написанные для каждого

( BTW .... с этим вы даже можете написать тестовые примеры для обнаружения столкновений и движения мяча, а не пытаться воспроизводить его каждый раз, чтобы посмотреть, работает ли он должным образом )

Я считаю, что это упростит задачу. Если у вас есть работающая копия где-то на github, я буду рад помочь вам с этим.

Повторное чтение вышесказанного кажется длинным объяснением того, что вы искали, и кое-чего еще.

Вышесказанное не зависит от Java .. вы можете сделать это практически на любом языке.

Надеюсь, это поможет :)

0 голосов
/ 09 мая 2020

вы проверяете только, если ball.x + ball.width> paddle.x, вы также должны учитывать случай, когда ball.y находится между paddle.y и paddle.y + paddle.height

...