Сделать форму идти в угловом направлении - PullRequest
1 голос
/ 19 октября 2019

Я делаю астероиды и пытаюсь сделать пулю механиком. Пуля должна идти в направлении корабля (под углом), но я не знаю, как заставить пулю двигаться в этом угловом направлении. Вместо этого он идет вверх, вниз или вправо / влево. Код, который я пробовал и не работает:

class Bullet
{
    float x,y,vx,vy;
    Bullet()
    {
        rectMode(CENTER);
        x = 0;
        y = 0;
        vx = 100 * cos(ang);
        vy = 100 * sin(ang);
    }

    void draw2()
    {
        vx = 100 * cos(ang);
        vy = 100 * sin(ang);
        x += vx;
        y += vy;
        pushMatrix();
        translate(width/2,height/2);
        translate(5,0);
        rotate(ang);
        rect(x,y,10,10);
        popMatrix();
    }
}

Остальная часть кода:

float ang = 0;
boolean spara = false;
Bullet b;

void setup()
{
    size(800,600);
    rectMode(CENTER);
    frameRate(60);
    asteroidi = new Asteroide[10];
    b = new Bullet();
}

void update()
{

}

void draw()
{
    update();
    background(200,200,200);
    fill(255);
    pushMatrix();
    translate(width/2,height/2);
    translate(25,0);
    rotate(ang);
    rect(0,0,50,50);
    popMatrix();
    if(spara)
        b.draw2();
}

void keyPressed()
{
    switch (keyCode)
    {
      case RIGHT:
          ang += 0.1;
          break;
      case LEFT:
          ang -= 0.1;
          break;
      case 32:
          if (spara) spara = false;
          if (!spara); spara = true;

          break;
    }
}

Я вызываю функцию draw2(), когда boolean spara равен true.

1 Ответ

1 голос
/ 19 октября 2019

Вы должны сделать следующее:

  • нарисовать прямоугольник пули таким образом, чтобы его центр находился в (0, 0):
    rect(0, 0, 10, 10);

  • повернуть прямоугольник в направлении движения:
    rotate(ang);

  • перевести прямоугольник в новое положение:
    translate(x, y);

Поскольку такие операции, как translate и rotate определяют новую матрицу и умножают текущую матрицу на новую матрицу, матричные операции имеютэто должно быть сделано в обратном порядке.

Обратите внимание, что угол в sin() и cos() должен быть задан в радианах, а не в градусах.
Кстати, вы уверены, что скорость 100 не так уж велика?

class Bullet
{
    float x, y, v, ang;
    Bullet(float x, float y, float v, float ang)
    {
        this.x = x;
        this.y = y;
        this.v = v;
        this.ang = ang;
    }

    void update() {
        x += v * cos(ang);
        y += v * sin(ang);
    }

    void draw()
    {
        pushMatrix();

        // transalte rectangle to new position
        translate(x, y);

        // rotate rectangle in direction of move
        rotate(ang);

        // draw rectangle around center
        rect(0, 0, 10, 10);

        popMatrix();
    }
}

Управляйте пулями в ArrayList и порождайте (добавляйте) новую пулю, когда ПРОБЕЛ нажата:

ArrayList<Bullet> bullets = new ArrayList<Bullet>();

float ang = 0.7;
void keyPressed()
{
    switch (keyCode)
    {
        case RIGHT:
            ang += 0.1;
            break;
        case LEFT:
            ang -= 0.1;
            break;
        case 32:
            bullets.add(new Bullet(width/2, height/2, 2, ang));
            break;
    }
}

Обновить (переместить) все маркеры в массиве в обновлении. Держите только пули, которые все еще в окне. Сохраните маркеры, которые находятся в окне, в новый массив и замените массив маркеров новым массивом:

void update()
{
    // array for bullets which ar still in window
    ArrayList<Bullet> bulletsInWindow = new ArrayList<Bullet>();

    for( int i = 0; i < bullets.size(); ++i ) {
        Bullet b = bullets.get(i);

        // move bullet
        b.update();

        // evaluate eif bullet is still in window
        if ( b.x >= 0 && b.y >= 0 && b.x <= width && b.y <= height ) {
            bulletsInWindow.add(b);
        }
    }

    // keep the bullets which are still in the window
    bullets = bulletsInWindow;
}

Нарисуйте маркеры в цикле в draw():

void draw() 
{
    update();

    background(200,200,200);
    rectMode(CENTER);
    fill(255);

    for( int i = 0; i < bullets.size(); ++i ) {
        Bullet b = bullets.get(i);
        b.draw();
    }

    pushMatrix();
    translate(width/2,height/2);
    rotate(ang);
    rect(0, 0, 50, 50);
    popMatrix();
}

...