Обработка - метод столкновения эллипса / прямой - PullRequest
0 голосов
/ 05 октября 2018

Я программирую какую-то игру, которую было бы довольно долго объяснять, но вкратце игрок - ellipse () и следует за мышью, в то время как rect () - это препятствие, которое движется вниз по экрану и должно быть уклонено игроком, в противном случае игра окончена.Существует несколько прямоугольников, поскольку я использую ArrayList для хранения каждого объекта препятствия.

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

tldr ;Мне нужно выяснить, как заставить работать эллипс / прямоугольное столкновение (в своем собственном методе).У меня есть только 1 неделя опыта обработки / Java.Я вырезал большую часть кода, который вам не нужен, в основном просто сохранил переменные, используемые для определения фигур, и код для фигур на тот случай, если вам это нужно.Кроме того, если возможно, метод столкновения мог бы быть помещен в Класс врага .

Класс врага (всепеременные, используемые для определения прямоугольника)

class Enemy {

  int enemyNumber; // used to determine enemy type

  //VARIABLES FOR ENEMY
  boolean redEnemy = false; // determine enemy colour
  color enemyColour = color(#B9B9E8); // sets default colour to blue
  PVector position, velocity;
  float xDist, yDist; // x and y distance for Bar
  float smallCircleRad, bigCircleRad; // radius for circles

   // **************************************************************************

  Enemy() { //CONSTRUCTOR
    position = new PVector(width/2, random(-300000, -250));
    //println(position.y);
    velocity = new PVector(0, 10);
    smallCircleRad = 200;
    bigCircleRad = 400;
    xDist = width;
    yDist = 200;
    enemyNumber = int(random(1, 6));
  }

   // **************************************************************************

  void redBar(float xPos, float yPos, float xDist, float yDist) {
    redEnemy = true;
    noStroke();
    enemyColour = color(#E38585);
    fill(enemyColour);
    rect(xPos, yPos, xDist, yDist);
  }

  void blueBar(float xPos, float yPos, float xDist, float yDist) {
    redEnemy = false;
    noStroke();
    enemyColour = color(#B9B9E8);
    fill(enemyColour);
    rect(xPos, yPos, xDist, yDist);
  }

Класс игрока (все переменные, используемые для определения эллипса)

class Player {

  int r = 50; //player radius
  float playerX = width/2; //starting x coordinate
  float playerY = height/2+500; //starting y coordinate
  float speed = 20; //player speed
  float angle; //angle used to calculate trajectory for player

  void playerChar() { //method for player model and general rules
    stroke(10);
    rectMode(CENTER);
    fill(playerColour);
    ellipse(playerX, playerY, r*2, r*2);
  }

1 Ответ

0 голосов
/ 05 октября 2018

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

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

Некоторые основные Googleрезультаты поиска возвращают эти результаты:

Если по какой-то причине вам абсолютно необходимо, чтобы игрок был кругом при расчете столкновения, то я бы начал с того, что что-то гуглилнапример, «обнаружение столкновения прямоугольника с окружностью».

Если вы все еще не можете выяснить это, пожалуйста, напишите MCVE в новом вопросе, и мы пойдем оттуда.Удачи.

...