(Обработка) Как повернуть игрока во время движения и иметь следящую камеру? - PullRequest
2 голосов
/ 13 июля 2020

Я пытаюсь заставить игрока вращаться, но никак не могу понять. Думаю, я еще не подсчитал, ха-ха. Я перейду к делу.

Я пытался заставить моего игрока смотреть на мышь. Если я не перемещаю игрока, поворот в порядке, но когда я начинаю двигаться, игрок движется по кругу.

В моем классе Player У меня есть следующие типы данных:

PApplet parent; //So the program knows which PApplet to draw on, I guess.

private float x,y;

/*
 * For the Camera to follow the player
 */
private float cameraX;
private float cameraY;

и у меня есть метод cameraFollow:

public void cameraFollow() {
    cameraX = x * -1 + parent.width / 2; // Calculates so the camera
    cameraY = y * -1 + parent.height / 2; // follows the player
    parent.translate(cameraX, cameraY); // Translate the window position
}

Теперь перейдем к проблеме, когда я пытаюсь повернуть плеер лицом к мыши. Если я не перемещаю игрока, вращение в порядке, но когда я двигаюсь, игрок начинает двигаться по кругу, когда я двигаю мышью.

public void render() {
    //Rotate towards mouse
    float angle = PApplet.atan2(cameraY-parent.mouseY, cameraX-parent.mouseX);
    parent.pushMatrix();
    parent.translate(x,y);
    parent.rotate(angle-PApplet.HALF_PI);
    
    //Body
    parent.noStroke(); // no black lines around the ellipse
    parent.fill(playerColor.getRGB()); // Sets the color of the player
    parent.ellipseMode(PConstants.CENTER); // Makes the ellipse centered
    parent.ellipse(x, y, 20, 20); // creates an ellipse
    
    //Arms
    parent.stroke(0.5f);
    parent.fill(armsColor.getRGB());
    parent.ellipseMode(PConstants.CENTER);
    parent.ellipse(x-5, y-5, 5, 5);
    parent.ellipse(x+5, y-5, 5, 5);
    
    parent.popMatrix();
}

1 Ответ

1 голос
/ 14 июля 2020

Я изменил код так, чтобы вместо:

float angle = PApplet.atan2(y-parent.mouseY, x-parent.mouseX);

//I did
float angle = PApplet.atan2(parent.mouseY-y, parent.mouseX-x);

, я увидел, что мне пришлось повернуть в совершенно неправильном месте, поэтому вместо поворота перед переводом теперь у меня есть поворот после перевода.

и до того, как мне назначили эллипс координатам x и y, поэтому эллипс двигался по кругу. Но теперь именно там находится исходная точка.

public void render()
{
    //Rotate towards mouse
    float angle = PApplet.atan2(parent.mouseY-y, parent.mouseX-x);
    parent.pushMatrix();
    parent.translate(x,y);
    parent.rotate(angle+PApplet.HALF_PI);
    
    //Body
    parent.noStroke(); // no black lines around the ellipse
    parent.fill(playerColor.getRGB()); // Sets the color of the player
    parent.ellipseMode(PConstants.CENTER); // Makes the ellipse centered
    parent.ellipse(0, 0, 20, 20); // creates an ellipse
    
    //Arms
    parent.stroke(1);
    parent.fill(armsColor.getRGB());
    parent.ellipseMode(PConstants.CENTER);
    parent.ellipse(0-5, 0-5, 5, 5);
    parent.ellipse(0+5, 0-5, 5, 5);
    
    parent.popMatrix();
}

РЕДАКТИРОВАТЬ: Но теперь всякий раз, когда я выхожу за границу положения окна, игрок будет смотреть в сторону от мыши. ХМММ ....

РЕДАКТИРОВАТЬ: Я решил это, добавив:

float angle = PApplet.atan2(parent.mouseY-cameraY-y, parent.mouseX-cameraX-x);

К коду!

Еще раз спасибо Spektre!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...