java swing:修改矩形而不创建新矩形

java swing: modify rectangle without creating a new one

我正在使用 swing,但遇到了问题。我正在夺旗,当蓝队被红方的红方玩家击中时,蓝方玩家应该在自己方重置。我的问题是蓝色玩家重生在他们自己的一边,但并没有从红色一边消失,所以我最终得到两个蓝色方块。我认为这是因为我正在通过

重置蓝色播放器
bluePlayer=new Rectangle(coords)

所以我在保留旧矩形的同时创建了一个新矩形。我试过修改语法,例如

bluePlayer=(coords);

bluePlayer=Rectangle(coords);

但两者都给我错误。我认为这类似于在声明后更改例如 int 'example' 的值,如下所示:

int example=10;
example=5;

但对我来说,不是改变 example 的值,而是创建第二个整数,也称为 example。我应该补充一点,当我使用箭头键移动蓝色方块时,我可以移动与红色方块接触的蓝色方块,当我将蓝色方块从红色方块移开(它们不再接触)时,第二个蓝色方块消失。

这是我重置蓝色方块的代码:

if(bluePlayer.intersects(leftSide) && redPlayer.intersects(bluePlayer)){
    bluePlayer=new Rectangle(1100, 300, 50, 50);
    g.setColor(Color.BLUE);
    g.fillRect(bluePlayer.x, bluePlayer.y, bluePlayer.width, bluePlayer.height);
}

以下是一些有助于解释我的问题的屏幕截图:

蓝色方块和红色方块是相对的,没有接触,这里没有问题。

http://i.imgur.com/WnbwUDA.png

蓝色方块在红色方块的一侧并且与红色方块相接,蓝色方块的一侧还有一个蓝色方块。

http://i.imgur.com/0tMUg9y.png

这是我在 paintComponent 方法中的代码。请注意,我上面提到的 bluePlayer 在代码中实际上被命名为 player2。我知道我的代码很乱,我还需要清理它。

public void paintComponent(Graphics g){
    Rectangle leftSide=new Rectangle(0, 0, 600, 700);
    g.setColor(Color.PINK);
    g.fillRect(leftSide.x, leftSide.y, leftSide.width, leftSide.height);
    Rectangle rightSide=new Rectangle(600, 0, 600, 700);
    g.setColor(Color.CYAN);
    g.fillRect(rightSide.x, rightSide.y, rightSide.width, rightSide.height);

    g.setColor(Color.RED);
    Rectangle player1=new Rectangle(player1X, player1Y, 50, 50);
    g.fillRect(player1.x, player1.y, player1.width, player1.height);
    g.setColor(Color.BLUE);
    Rectangle player2=new Rectangle(player2X, player2Y, 50, 50);
    g.fillRect(player2.x, player2.y, player2.width, player2.height);

    Rectangle redFlag=new Rectangle(150, 313, 25, 25);

    if(blueHasRedFlag==false){
        g.setColor(Color.RED);
        g.fillRect(redFlag.x, redFlag.y, redFlag.width, redFlag.height);
    }

    if(player2.intersects(redFlag)){
        blueHasRedFlag=true;
        player1=new Rectangle(player1X, player1Y, 75, 75);
    }

    if(player2.intersects(leftSide) && player1.intersects(player2)){
        player2=new Rectangle(1100, 300, 50, 50);
        g.setColor(Color.BLUE);
        g.fillRect(player2.x, player2.y, player2.width, player2.height);
    }

    repaint();
}

您定义并绘制 player2...

Rectangle player2=new Rectangle(player2X, player2Y, 50, 50);
g.fillRect(player2.x, player2.y, player2.width, player2.height);

然后测试 player2 的位置并绘制 player2 的新位置...再次...

if(player2.intersects(leftSide) && player1.intersects(player2)){
    player2=new Rectangle(1100, 300, 50, 50);
    g.setColor(Color.BLUE);
    g.fillRect(player2.x, player2.y, player2.width, player2.height);
}

记住,画画就像画在canvas上一样,是累积的​​。

一般来说,绘画是为了绘画,不应该包含任何与绘画当前状态无关的逻辑。

假设您有某种更新循环或周期,您应该计算其中的逻辑并简单地绘制状态。这两个操作要分开做...