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

时间:2015-02-16 02:28:34

标签: java swing intersection

我正在使用挥杆,我遇到了问题。我正在抓住旗帜,当蓝队被红色球员击中时,蓝色球员应该自己重置。我的问题是蓝色球员在自己身边重生,但不会从红色方面消失,所以我最终得到两个蓝色方块。我想这是因为我正在通过

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

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

bluePlayer=(coords);

bluePlayer=Rectangle(coords);

但两个都给我错误。我认为这类似于改变其值,例如,int'例如'在宣布之后,就像这样:

int example=10;
example=5;

但对我而言,它不是改变示例的价值,而是创建第二个整数,也称为示例。我应该补充一点,当我使用箭头键移动蓝色方块时,我可以移动触摸红色方块的蓝色方块,当我将蓝色方块移离红色方块时(他们不会)第二个蓝色正方形消失了。

以下是重置蓝色方块的代码:

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

1 个答案:

答案 0 :(得分:1)

您定义并绘制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);
}

请记住,绘画就像在画布上画画一样,它是累积的。

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

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