Java 乒乓球游戏中闪现的问题

Java 乒乓球游戏中闪现的问题,java,applet,awt,pong,Java,Applet,Awt,Pong,您好,我在这个乒乓球游戏中遇到了一些不确定的问题,希望其他人能引导我朝着正确的方向前进。我已经这样做了一两个小时了,还没弄明白 非常感谢?。?就像球和分数是最差的,当我嵌入游戏时,它们几乎完全消失了 import java.applet.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Pong extends Applet implements MouseMotionListen

您好,我在这个乒乓球游戏中遇到了一些不确定的问题,希望其他人能引导我朝着正确的方向前进。我已经这样做了一两个小时了,还没弄明白

非常感谢?。?就像球和分数是最差的,当我嵌入游戏时,它们几乎完全消失了

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Pong extends Applet implements MouseMotionListener, KeyListener {

int       doubleb,i,my,bx,by,px,py,compx,compy,width,height,speedx,speedy,bwidth,bheight,pwidth,pheight,score;
boolean started;
private Timer timer1;

    @Override
public void init() { 
    setSize(800,500); //setting screan size, declaring background color and some of my listeners
    width = getSize().width;
    height = getSize().height;
    setBackground(Color.black);
    pheight = 120;
    pwidth = 15;
    bheight = 30;
    bwidth = 30;
    addKeyListener(this); //listers used for the mouse and keybored input
    addMouseMotionListener(this);
    px = 35;
    compx = width - 35 - pwidth;
    newgame();
    timer1 = new Timer(10,new ActionListener() {
                @Override
        public void actionPerformed(ActionEvent e) { //momvement, physics, collusion
            height = getSize().height;
            width = getSize().width;
            bx += speedx;
            by += speedy;
            if (by <= 0 || by + bheight >= height) {
                speedy = -speedy;
            }
            if (bx <= px + pwidth && by + bheight >= py && by <= py + pheight && bx > px) {
                speedx = -speedx;
                ++score;
            }
            if (bx + bwidth >= compx && by + bheight >= compy && by <= compy + pheight && bx < compx + pwidth) {
                speedx = -speedx;
            }
            if (speedx < 0) {
                if (compy + pheight / 2 != height / 2) {
                    if (compy + pheight / 2 > height / 2) {
                        compy -= -speedx;
                    }
                    else {
                        compy += -speedx;
                    }
                }
            }
            else {
                if (by + bheight / 2 <= compy + pheight / 2) {
                    compy -= speedx;
                }
                else {
                    compy += speedx;
                }
            }
            if (compy < 0) {
                compy = 0;
            }
            if (compy + pheight > height) {
                compy = height - pheight;
            }
            if (bx + bwidth < 0) {
                py = height / 2 - pheight / 2;
                timer1.stop();
                started = false;
            }
            repaint();
        }    
    });
}

    @Override
public void mouseMoved(MouseEvent e) { 
    if (started) {
        my = e.getY();
        if (my + pheight / 2 > height) {
            my = height - pheight / 2;
        }
        if (my < pheight / 2) {
            my = pheight / 2;
        }
        py = my - pheight / 2;
        repaint();
    }
}

    @Override
public void mouseDragged(MouseEvent e) { }

    @Override
public void paint(Graphics g) {

    Font font1 = new Font("Arial", Font.BOLD, 18); //set font 
    Font font2 = new Font("Arial", Font.BOLD,40); //set font
    g.setColor(Color.white);
    g.drawRect(0,0,width - 1,height - 1);
    g.fillRect(px,py,pwidth,pheight);
    g.fillRect(compx,compy,pwidth,pheight);
    g.setFont(font1);
    g.drawString("Score: " + score,20,20); //paints the sorce 

            if (started) {
        g.fillArc(bx,by,bwidth,bheight,0,360);
    }
    else {
        g.setFont(font2); //set font
        g.setColor(Color.green); //set color
        g.drawString("Pong",width / 2 - 46,height / 2 - 16); //draws text to the screen
        g.setFont(font1);
        g.drawString("Press 's' to start",width / 2 - 69,height / 2 + 30);              
        }
    }

public void newgame() {
    py = height / 2 - pheight / 2;
    compy = py;
    bx = width / 2 - bwidth / 2;
    by = height / 2 - bheight / 2;
    speedx = 10;
    speedy = 10;
    score = 0;
}

    @Override
public void keyPressed(KeyEvent e) {
    if (e.getKeyChar() == 's') {
        started = true;
        newgame();
        timer1.start();
    }
}

    @Override
public void keyTyped(KeyEvent e) { }

    @Override
public void keyReleased(KeyEvent e) { }
import java.applet.*;
导入java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类Pong扩展小程序实现MouseMotionListener、KeyListener{
整数倍b,i,my,bx,by,px,py,compx,compy,width,height,speedx,speedy,bwidth,bheight,pwidth,pheight,score;
布尔启动;
私人定时器1;
@凌驾
public void init(){
setSize(800500);//设置屏幕大小,声明背景颜色和我的一些侦听器
宽度=getSize().width;
高度=getSize()。高度;
挫折背景(颜色:黑色);
pheight=120;
pwidth=15;
bHweight=30;
bwidth=30;
addKeyListener(this);//用于鼠标和键盘输入的Listener
addMouseMotionListener(此);
px=35;
compx=宽度-35-宽度;
新游戏();
timer1=新计时器(10,新ActionListener(){
@凌驾
已执行的公共无效诉讼(诉讼事件e){//诉讼、物理、共谋
高度=getSize()。高度;
宽度=getSize().width;
bx+=speedx;
乘+=快速;
如果(按=高度){
迅捷=-迅捷;
}
如果(bx=py和px){
speedx=-speedx;
++得分;
}
如果(bx+bwidth>=COMX和BH重量>=compy和BH高度/2){
compy-=-speedx;
}
否则{
compy+=-speedx;
}
}
}
否则{
如果(按+BH高度/2高度){
compy=高度-高度;
}
if(bx+bwidth<0){
py=高度/2-光/2;
timer1.stop();
开始=错误;
}
重新油漆();
}    
});
}
@凌驾
public void mouseMoved(MouseEvent e){
如果(启动){
my=e.getY();
如果(my+pheight/2>高度){
my=高度-pheight/2;
}
如果(my

}

您可能需要查看

基本上,你遇到的问题是清除屏幕以便重新绘制。但是,在图形对象完全完成更新之前,它会被绘制到屏幕上。这将导致半成品屏幕和明显的闪烁效果

解决方法是先将图像绘制到单独的图形对象,然后在绘制完成后,将该图形对象与显示的图形对象交换


可以找到更多信息

无法解决您当前的问题,但您应该调用
super.paint
,以帮助防止将来可能出现的问题。下一个问题是,为什么您使用的API已经过时15年,并且已经被至少两个其他API所取代?您可以使用
JPanel
覆盖它的
paintComponent
并在那里执行自定义绘制。默认情况下,Swing组件是双缓冲的。然后,您可以根据需要将面板添加到所需的顶级容器中(
JApplet
JFrame
),1)为什么要编写小程序?如果是由于老师的特殊要求,请参考。2) 为什么是AWT而不是Swing?关于放弃使用AWT组件的许多好理由,请参见我的答案。