Как вернуть любую точку в пределах прямоугольника при обработке? - PullRequest
1 голос
/ 22 января 2020

Я новичок в java, к вашему сведению. Я использую обработку, и я делаю игру со змеями. Мой следующий шаг - перевести еду sh в новую позицию, как только змея съест ее. Проблема в том, что «змеиная голова» должна быть полностью выровнена с «пищевым» прямоугольником для обновления; в основном, мышь должна находиться над точным центром пищи, а не просто прикасаться к ней. Как я могу настроить его так, чтобы, как только мышь касалась прямоугольника «еда», она обновлялась? Я попытался возиться с rectMode (), но это получило weird.lol. Это то, что у меня есть, и простите, если код tra sh. Как я уже сказал, совершенно новый для java.

class Snake {

    //variables
    int len;
    int wid;
    int xcord;
    int ycord;

    //constructor
    Snake(int x,int y, int len, int wid) {
        this.len = len;
        this.wid = wid;
        this.xcord = x;
        this.ycord = y;
        rect(xcord, ycord, len, wid);
    }

    //clear screen
    void  update() {
        background(255);
        rect(mouseX, mouseY, len, wid);
    }    
}

class Food {

    //variables
    int xcord;
    int ycord;

    //constructor
    Food() {
        this.xcord = int(random(width));
        this.ycord = int(random(height));
        rect(xcord, ycord, 10, 10);
    }

    //update food position. This seems like the issue code block
    void update() {
        if( mouseX == xcord && mouseY == ycord) {
            xcord = int(random(width));
            ycord = int(random(height));
        }
    }

    //display food
    void displayFood() {
        rect(xcord, ycord, 10, 10);
    }
}

Snake s;
Food f;
void setup() {
background(255);
    s = new Snake(mouseX, mouseY, 10, 10);
    f = new Food();
}

void draw() {
    s.update();
    f.update();
    f.displayFood();
}

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Чтобы проверить столкновение с прямоугольниками, необходимо проверить, перекрываются ли прямоугольники в обоих измерениях.

Для каждого измерения существуют следующие возможные случаи (пример для измерения x):

Не перекрывается:

x1      x1+w1
  +----+
            +----+
          x2      x2+w2
           x1      x1+w1
             +----+
  +----+
x2      x2+w2

Перекрывается

x1                x1+w1
  +--------------+
       +----+
     x2      x2+w2
     x1      x1+w1
       +----+
  +---------------+
x2                 x2+w2
x1           x1+w1
  +---------+
       +----------+
     x2            x2+w2
     x1            x1+w1
       +----------+
  +----------+
x2            x2+w2

Это означает, что диапазоны перекрываются, если

x1 < x2+w2 AND x2 < x1+w1

Это приводит к следующему условию в методе update

class Food {
    // [...]

    void update() {

        if( mouseX < xcord+10 && xcord < mouseX+10 &&
            mouseY < ycord+10 && ycord < mouseY+10) {

            xcord = int(random(width));
            ycord = int(random(height));
        }
    }

    // [...]
}
0 голосов
/ 22 января 2020

У вас есть игровой обработчик класса, в котором вы управляете Снейком и едой? Вы можете проверить isFoodIntersectSnake(). И генерируйте новое положение пищи, пока пища не пересекает тело змеи.

И для правильного refre sh еды вы должны проверить, является ли голова змеи в одном и том же прямоугольнике с едой:

boolean isSnakeEatFood(Snake snake, Food food){
    return snake.xcord == food.xcord &&  snake.ycord == food.ycord
}
...