使形状朝 angular 方向移动

Make a shape go in an angular direction

我正在制作小行星,我正在尝试制作子弹机制。子弹应该朝向船的方向(一个角度),但我不知道如何让子弹进入 angular 方向。相反,它会上升、下降或 right/left。 我试过但不起作用的代码:

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 sparatrue时。

您必须执行以下操作:

  • 以这种方式绘制子弹矩形,它的中心位于 (0, 0):
    rect(0, 0, 10, 10);

  • 沿移动方向旋转矩形:
    rotate(ang);

  • 将矩形转换到新位置:
    translate(x, y);

由于像translate and rotate这样的操作定义了一个新的矩阵,并将当前矩阵乘以新矩阵,所以矩阵操作必须以相反的顺序进行。

请注意 sin() and 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 中的子弹并在按下​​ SPACE 时产生(添加)一颗新子弹:

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;
    }
}

在更新中更新(移动)数组中的所有项目符号。只保留仍在 window 中的子弹。将 window 中的项目符号存储到新数组中,并用新数组替换项目符号数组:

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();
}