我正在尝试制作2D游戏。我有一个矩形数组来表示攻击。我试图使它们旋转,以便它们都旋转45度。当我尝试在第一个之后渲染更多的咒语时,它们会在屏幕周围的随机位置出现故障。这是我的代码:

Rectangle[] waterBolt = new Rectangle[10];
float[] wba = new float[10];
int wbc = 0;
Graphics2D[] gwb = new Graphics2D[10];

public void renderSpell(Graphics2D g) {
    for(int i=0; i<10; i++) {
        if (waterBolt[i] != null) {
            gwb[i] = (Graphics2D) g;
            gwb[i].rotate(Math.toRadian(45), waterBolt[i].x, waterBolt[i].y);
            gwb[i].fill(waterBolt[i]);
        }
    }
}

public void castSpell(int spellID) {
    waterBolt[wbc] = new Rectangle(playerX, playerY, 16, 16);
    wba[wbc] = (float) Math.toRadians(Math.atan2(mouseX - playerX, mouseY - playerY));
    wbc++;
    if (wbc >= 10) {
        wbc = 0;
    }
}


当我将它们全部静止时,这是我的屏幕上正在发生的事情:



每次我单击以投射时,它们都会旋转45度,但是我不知道如何解决。

最佳答案

请记住,当您调用gwb[i] = (Graphics2D) g;时,并不是在复制g。取而代之的是,您的每个矩形都以之前所有旋转的总和进行旋转。尝试这样的事情:

public void renderSpell(Graphics2D g) {
    AffineTransform transform = g.getTransform();
    for(int i=0; i<waterBolt.length; i++) {
        if (waterBolt[i] != null) {
            g.rotate(Math.toRadian(45), waterBolt[i].x, waterBolt[i].y);
            g.fill(waterBolt[i]);
            g.setTransform(transform); // back to original orientation
        }
    }
}

07-24 17:50
查看更多