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组件的许多好理由,请参见我的答案。