我正在编写一个原始Pong游戏,我编码了它,因为当球离开屏幕的左侧时,它会移动到屏幕的中心并随机移动。但是,在开始时球始终保持在中心并且永远不会移动(尽管球的X坐标在开始时不小于0)。
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Pong extends JPanel
{
private static final int FRAME_WIDTH = 400;
private static final Color BACKGROUND = new Color(204, 204, 204);
private static final Color BALL_COLOR = Color.BLACK;
private static final Color PRIZE_COLOR = Color.BLACK;
private static final int BALL_DIAM = 50;
private static final int PRIZE_DIAM = 25;
private static final int PRIZE_SHIFT = 10;
private BufferedImage myImage;
private Graphics myBuffer;
private Ball ball;
private int score1;
private int score2;
private Polkadot prize;
private Bumper bumper;
private Bumper bumper2;
private Timer t;
private int hits;
public Pong()
{
myImage = new BufferedImage(400, 400, 1);
myBuffer = this.myImage.getGraphics();
myBuffer.setColor(BACKGROUND);
myBuffer.fillRect(0, 0, 400, 400);
ball = new Ball(0, 0, 35, BALL_COLOR);
ball.jump(400, 400);
prize = new Polkadot(0, 0, 25, PRIZE_COLOR);
prize.jump(400, 400);
bumper = new Bumper(380,70,50,100,Color.RED);
bumper2 = new Bumper(30,70,50,100,Color.BLUE);
hits = 0;
t = new Timer(5, new Listener());
t.start();
addMouseListener(new Mouse());
addKeyListener(new Key());
setFocusable(true);
}
public void paintComponent(Graphics g)
{
g.drawImage(myImage, 0, 0, getWidth(), getHeight(), null);
}
private class Mouse extends MouseAdapter
{
private Mouse() {}
public void mousePressed(MouseEvent e)
{
if (e.isMetaDown())
{
ball.setX(e.getX());
ball.setY(e.getY());
}
else if (e.isShiftDown())
{
ball.setdx((int)(Math.random() * 11.0D - 6.0D));
ball.setdy((int)(Math.random() * 11.0D - 6.0D));
}
else
{
prize.setX(e.getX());
prize.setY(e.getY());
}
}
}
private class Key extends KeyAdapter
{
private Key() {}
public void keyPressed(KeyEvent e)
{
if ((e.getKeyCode() == 38) && (bumper.getY() > 0)) {
bumper.setY(bumper.getY() - 10);
} else if ((e.getKeyCode() == 40) && (bumper.getY() < 438)) {
bumper.setY(bumper.getY() + 10);
} else if ((e.getKeyCode() == 87) && (bumper2.getY() > 0)) {
bumper2.setY(bumper2.getY() - 10);
} else if ((e.getKeyCode() == 83) && (bumper2.getY() < 438)) {
bumper2.setY(bumper2.getY() + 10);
}
}
}
private class Listener implements ActionListener
{
private Listener() {}
public void actionPerformed(ActionEvent e)
{
myBuffer.setColor(BACKGROUND);
myBuffer.fillRect(0, 0, 400, 400);
ball.move(400, 400);
collide(ball, prize);
BumperCollision.collide(bumper,ball);
BumperCollision.collide(bumper2,ball);
ball.draw(myBuffer);
prize.draw(myBuffer);
bumper.draw(myBuffer);
bumper2.draw(myBuffer);
myBuffer.setColor(Color.red);
myBuffer.setFont(new Font("Comic Sans MS", 1, 24));
myBuffer.drawString("Count: " + score1, 100, 25);
if(score1 >= 10)
myBuffer.drawString("This man is the Legend27", 50, 102);
if(score2 >= 10)
myBuffer.drawString("The other man might be the legend27", 160, 102);
if(ball.getX() < -100)
score1++;
ball.setX(208);
ball.setY(50);
ball.setdx(20);
repaint();
}
}
public void collide(Ball b, Polkadot p)
{
double dist = distance(b.getX(), b.getY(), p.getX(), p.getY());
if (dist < 37.0D)
{
hits += 1;
p.jump(400, 400);
}
}
private double distance(double x1, double y1, double x2, double y2)
{
return Math.sqrt(Math.pow(x1 - x2, 2.0D) + Math.pow(y1 - y2, 2.0D));
}
}
球:
//Name: Date:
import java.awt.*;
public class Ball extends Polkadot
{
private double dx; // pixels to move each time step() is called.
private double dy;
// constructors
public Ball() //default constructor
{
super(200, 200, 50, Color.BLACK);
dx = Math.random() * 12 - 6; // to move vertically
dy = Math.random() * 12 - 6; // to move sideways
}
public Ball(double x, double y, double dia, Color c)
{
super(x, y, dia, c);
dx = Math.random()* 12 - 6;
dy = Math.random() * 12 - 6;
}
//modifier methods
public void setdx(double x)
{
dx = x;
}
public void setdy(double y)
{
dy = y;
}
//accessor methods
public double getdx()
{
return dx;
}
public double getdy()
{
return dy;
}
//instance methods
public void move(double rightEdge, double bottomEdge)
{
setX(getX()+ dx); // move vert.
setY(getY()+ dy);
if(getX() >= rightEdge - getRadius())
{
setX(rightEdge - getRadius());
dx = dx * -1;
}
else if(getX() <= getRadius())
{
setX(getRadius());
dx = dx * -1;
}
if(getY() >= bottomEdge - getRadius())
{
setY(bottomEdge - getRadius());
dy = dy * -1;
}
else if (getY() <= getRadius())
{
setY(getRadius());
dy = dy * -1;
}
}
}
答案 0 :(得分:0)
你似乎有两个不同的球位置值,首先你有x,y来自你的父类,我不知道的名字。然后你有Ball类的位置delta成员变量dx和dy。由于您的构造函数调用了父构造函数
super(x, y, dia, c);
其中x,y分别为200,然后它们永远不会被触及。我的猜测是那些保持球的真实位置,因此需要设置这些值。在Ball构造函数中创建随机delta位置之后使用setter,如此
public Ball(double x, double y, double dia, Color c)
{
super(x, y, dia, c);
dx = Math.random()* 12 - 6;
dy = Math.random() * 12 - 6;
setX(getX() + dx); //add your x difference
setY(getY() + dy); //add your y difference
}
现在应该在创建时将你的增量添加到Ball对象,并且当它第一次被绘制时,每次创建一个Ball时它将在游戏板上有一个随机位置。
actionPerformed()
中的这一行怎么样?if(ball.getX() < -100)
score1++;
ball.setX(208);
ball.setY(50);
ball.setdx(20);
如果只在ball.getX()&lt;时调用setter。 -100然后你需要使用你的if括号。在if之后没有括号只执行下一行,仅此而已。
if(ball.getX() < -100)
{
score1++;
ball.setX(208);
ball.setY(50);
ball.setdx(20);
}