首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Repaint()不重绘图像

Repaint()不重绘图像
EN

Stack Overflow用户
提问于 2013-05-20 06:48:41
回答 2查看 531关注 0票数 0

我正在用Java做一个乒乓球游戏来玩这门语言,我想知道为什么我的repaint方法没有在屏幕上重新绘制图像。本质上,我想要的是当球击中屏幕的任何一侧时,启动球员的得分,我想在它的开始位置重新绘制一切,以模拟重置。我试着到处重绘,但它要么导致一切锁定,要么游戏继续,就像什么都没发生一样。

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.Rectangle;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Board extends JPanel implements ActionListener
{
    private Timer timer;
    private PlayerOne paddle;
    private PlayerTwo paddle2;
    private Ball ball;
    private boolean ingame = true;
    int playeronescore = 0;
    int playertwoscore = 0;

    public Board()
    {

        addKeyListener(new TAdapter());
        setFocusable(true);
        setDoubleBuffered(true);

        paddle = new PlayerOne();
        paddle2 = new PlayerTwo();
        ball = new Ball();

        timer = new Timer(5, this);
        timer.start();
    }

public void paint(Graphics g)
{
    if(ingame)
    {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(), this);
        g2d.drawImage(paddle2.getImage(), paddle2.getX(), paddle2.getY(), this);
        g2d.drawImage(ball.getImage(), ball.getX(), ball.getY(),this);
        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }
    else
    {
        restartGame();
        repaint();
    } 
}

public void actionPerformed(ActionEvent e)
{
    paddle.move();
    paddle2.move();
    ball.move();
    checkCollision();
    repaint();
}

private class TAdapter extends KeyAdapter
{
    public void keyPressed(KeyEvent e)
    {
        paddle.keyPressed(e);
        paddle2.keyPressed(e);
    }

    public void keyReleased(KeyEvent e)
    {
        paddle.keyReleased(e);
        paddle2.keyReleased(e);
    }
}
public void restartGame()//resetting the paddles and ball into their initial positions
{
    paddle.setX(0);
    paddle.setY(60);
    paddle2.setX(280);
    paddle2.setY(60);
    ball.setX(140);
    ball.setY(60);

}
public void checkCollision()
{
    Rectangle r1 = paddle.getBounds();
    Rectangle r2 = paddle2.getBounds();
    Rectangle r3 = ball.getBounds();

    if(ball.getX() == 0)
    {
        playeronescore++;
        ingame = false;
    }

    if(ball.getX() == 280)
    {
        playertwoscore++;
        ingame = false;
    }

    if(r3.intersects(r1))
    {
        int paddleLPos = (int)paddle.getBounds().getMinX();
        int ballLPos = (int)ball.getBounds().getMinX();

        int first = paddleLPos + 8;
        int second = paddleLPos + 16;
        int third = paddleLPos + 24;
        int fourth = paddleLPos + 32;

        if (ballLPos < first) {
            ball.setXDir(-1);
            ball.setYDir(-1);
        }

        if (ballLPos >= first && ballLPos < second) {
            ball.setXDir(-1);
            ball.setYDir(-1 * ball.getYDir());
        }

        if (ballLPos >= second && ballLPos < third) {
            ball.setXDir(0);
            ball.setYDir(-1);
        }

        if (ballLPos >= third && ballLPos < fourth) {
            ball.setXDir(1);
            ball.setYDir(-1 * ball.getYDir());
        }

        if (ballLPos > fourth) {
            ball.setXDir(1);
            ball.setYDir(-1);
        }           
    }
    else if(r3.intersects(r2))
    {
        int paddleLPos = (int)paddle2.getBounds().getMinX();
        int ballLPos = (int)ball.getBounds().getMinX();

        int first = paddleLPos + 8;
        int second = paddleLPos + 16;
        int third = paddleLPos + 24;
        int fourth = paddleLPos + 32;

        if (ballLPos < first) {
            ball.setXDir(-1);
            ball.setYDir(-1);
        }

        if (ballLPos >= first && ballLPos < second) {
            ball.setXDir(-1);
            ball.setYDir(-1 * ball.getYDir());
        }

        if (ballLPos >= second && ballLPos < third) {
            ball.setXDir(0);
            ball.setYDir(-1);
        }

        if (ballLPos >= third && ballLPos < fourth) {
            ball.setXDir(1);
            ball.setYDir(-1 * ball.getYDir());
        }

        if (ballLPos > fourth) {
            ball.setXDir(1);
            ball.setYDir(-1);
        }           
    }
}

}

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2013-05-20 09:18:04

好了,这里有一些问题。

首先,您应该覆盖paintComponents,而不是paint

其次,repaint()调用paint。所以你的游戏被锁定的原因是你实际上是在强迫它进入一个永无止境的循环。paint被调用,它调用repaint,后者调用paint,等等。

最后,正如carmickr在评论中所说,您不应该在paint方法中更改组件属性。

所以。综上所述,我建议您重新审视actionPerformed逻辑。正如你所说,你正在学习,我有点讨厌给你一堆代码,但有几个提示:

您可以在checkCollision中确定是否得分。如果从那个方法返回一些东西到你的actionPerformed方法--如果得分了,那么这样做,如果没有,那么这样做。最后,你需要调用paintComponent,所以你需要一些标志-可能是一个布尔变量-告诉paintComponent是绘制蝙蝠的更新位置还是至少绘制初始位置,carmickr的建议是重置位置,只有一条通过paintComponent的路线是更好的。

我希望这能帮到你。

票数 1
EN

Stack Overflow用户

发布于 2013-05-20 06:56:04

试着改变

代码语言:javascript
复制
  public void paint(Graphics g)
  {
if(ingame)
{
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(), this);
    g2d.drawImage(paddle2.getImage(), paddle2.getX(), paddle2.getY(), this);
    g2d.drawImage(ball.getImage(), ball.getX(), ball.getY(),this);
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}
else
{
    restartGame();
    repaint();
} 

}

代码语言:javascript
复制
 public void paint(Graphics g)
{
if(ingame)
{
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(), this);
    g2d.drawImage(paddle2.getImage(), paddle2.getX(), paddle2.getY(), this);
    g2d.drawImage(ball.getImage(), ball.getX(), ball.getY(),this);
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}
else
{
    restartGame();

} 
  repaint();
}

这实际上会在整个游戏运行时重新绘制屏幕,按照您所拥有的逻辑安装。

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16640300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档