Java Repaint()不重新绘制图像
我正在用Java做一个乒乓球游戏来玩弄这种语言,我想知道为什么我的重绘方法没有在屏幕上重绘图像。基本上,我想要的是当球击中屏幕的任意一侧,开始一名球员得分时,我想要在其起始位置重新绘制所有内容,以模拟重置。我试着把整个地方重新粉刷一遍,但这要么导致所有东西都锁起来,要么游戏继续进行,就好像什么都没发生一样Java Repaint()不重新绘制图像,java,paint,repaint,Java,Paint,Repaint,我正在用Java做一个乒乓球游戏来玩弄这种语言,我想知道为什么我的重绘方法没有在屏幕上重绘图像。基本上,我想要的是当球击中屏幕的任意一侧,开始一名球员得分时,我想要在其起始位置重新绘制所有内容,以模拟重置。我试着把整个地方重新粉刷一遍,但这要么导致所有东西都锁起来,要么游戏继续进行,就好像什么都没发生一样 import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Too
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);
}
}
}
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.Rectangle;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类板扩展JPanel实现ActionListener
{
私人定时器;
私人游桨;
私人游戏者双桨2;
私人舞会;
私有布尔ingame=true;
智力得分=0;
int playertwoscore=0;
公共委员会()
{
addKeyListener(新的TAdapter());
设置聚焦(真);
setDoubleBuffered(真);
球拍=新球手();
桨叶2=新的播放机two();
球=新球();
定时器=新定时器(5,此);
timer.start();
}
公共空间涂料(图g)
{
如果(ingame)
{
超级油漆(g);
Graphics2D g2d=(Graphics2D)g;
g2d.drawImage(blade.getImage(),blade.getX(),blade.getY(),this);
g2d.drawImage(pable2.getImage(),pable2.getX(),pable2.getY(),this);
g2d.drawImage(ball.getImage(),ball.getX(),ball.getY(),this);
getDefaultToolkit().sync();
g、 处置();
}
其他的
{
重启游戏();
重新油漆();
}
}
已执行的公共无效操作(操作事件e)
{
划桨。移动();
2.移动();
ball.move();
检查碰撞();
重新油漆();
}
私有类TAdapter扩展了KeyAdapter
{
按下公共无效键(按键事件e)
{
拨片。按键(e);
2.按键(e);
}
公共无效密钥已释放(密钥事件e)
{
拨片。钥匙松开(e);
2.钥匙释放(e);
}
}
public void restartGame()//将球拍和球重置到初始位置
{
桨。设定值(0);
赛蒂(60岁);
2.setX(280);
2.setY(60岁);
球.setX(140);
赛蒂(60岁);
}
公共无效检查冲突()
{
矩形r1=blade.getBounds();
矩形r2=2.getBounds();
矩形r3=ball.getBounds();
if(ball.getX()==0)
{
PlayerScore++;
ingame=false;
}
if(ball.getX()==280)
{
playertwoscore++;
ingame=false;
}
如果(r3.相交(r1))
{
int pallelpos=(int)palle.getBounds().getMinX();
int ballLPos=(int)ball.getBounds().getMinX();
int first=lpos+8;
int second=lpos+16;
int THORTH=桨式LPOS+24;
int第四=LPOS+32;
如果(圆球<第一个){
ball.setXDir(-1);
球。塞蒂迪尔(-1);
}
如果(圆球>=第一个和圆球<第二个){
ball.setXDir(-1);
ball.setYDir(-1*ball.getYDir());
}
如果(圆球>=第二个和圆球<第三个){
ball.setXDir(0);
球。塞蒂迪尔(-1);
}
如果(圆球>=第三个和圆球<第四个){
ball.setXDir(1);
ball.setYDir(-1*ball.getYDir());
}
如果(鲍尔普斯>第四){
ball.setXDir(1);
球。塞蒂迪尔(-1);
}
}
否则如果(r3.相交(r2))
{
int pallelpos=(int)palle2.getBounds().getMinX();
int ballLPos=(int)ball.getBounds().getMinX();
int first=lpos+8;
int second=lpos+16;
int THORTH=桨式LPOS+24;
int第四=LPOS+32;
如果(圆球<第一个){
ball.setXDir(-1);
球。塞蒂迪尔(-1);
}
如果(圆球>=第一个和圆球<第二个){
ball.setXDir(-1);
ball.setYDir(-1*ball.getYDir());
}
如果(圆球>=第二个和圆球<第三个){
ball.setXDir(0);
球。塞蒂迪尔(-1);
}
如果(圆球>=第三个和圆球<第四个){
ball.setXDir(1);
ball.setYDir(-1*ball.getYDir());
}
如果(鲍尔普斯>第四){
ball.setXDir(1);
球。塞蒂迪尔(-1);
}
}
}
}
如有任何帮助,我们将不胜感激。尝试更改
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();
}
}
到
这将在整个游戏运行时重新绘制屏幕,按照您的逻辑进行安装
希望这有帮助 好的,这里有一些问题 首先,您应该覆盖
paintComponents
而不是paint
其次,repaint()
调用paint
。所以你的游戏被锁定的原因是你有效地迫使它进入一个永无止境的循环<调用code>paint,调用repaint
调用paint
等
最后,正如carmickr在评论中所说,您不应该在paint
方法中更改组件属性
所以。综上所述,我建议您重新审视actionPerformed
逻辑。正如您所说,您正在学习,我有点不愿意只给您一堆代码,但有几点提示:
您可以在checkCollision
中确定是否得分。将该方法中的某些内容返回到您的actionPerformed
方法如何?如果得分,则执行此操作,如果没有得分,则执行此操作。最后,您需要调用paintComponent
,因此您需要一些标志-可能是一个布尔变量-告诉paint
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();
}