Java 乒乓球游戏-为球动画添加计时器
我现在正在做一个乒乓球游戏,我觉得我的球动画太快了。我想给我的动画添加一个计时器,但我真的不知道怎么做。我用在网上找到的一些代码试过了,但不起作用。请帮助我:( 这是我的密码:Java 乒乓球游戏-为球动画添加计时器,java,swing,timer,jpanel,pong,Java,Swing,Timer,Jpanel,Pong,我现在正在做一个乒乓球游戏,我觉得我的球动画太快了。我想给我的动画添加一个计时器,但我真的不知道怎么做。我用在网上找到的一些代码试过了,但不起作用。请帮助我:( 这是我的密码: private static final long serialVersionUID = 1L; private int posX = SCREEN_WIDTH / 2; private int posY; int x; int y; private int scoreCountPlayer1 = 0; private
private static final long serialVersionUID = 1L;
private int posX = SCREEN_WIDTH / 2;
private int posY;
int x;
int y;
private int scoreCountPlayer1 = 0;
private int scoreCountComputer = 0;
private int delay = 10;
// Create a timer with delay 1000 ms
private Timer timer = new Timer(delay, new TimerListener());
private Rectangle ballRect;
private Rectangle padRect;
private int upLimit;
private int downLimit;
private int padPosition;
public boolean backX = false;
public boolean backY = false;
public boolean move = true;
public Point posMouse = new Point();
private int playPanelWidth;
private int playPanelHeight;
private int padPanelWidth;
private int padPanelHeight;
private int panPanelWidth;
private int panPanelHeight;
private JLabel player1Score = new JLabel("1");
private JLabel ComputerScore = new JLabel("0");
private JPanel panPlayer1;
public JPanel panComputer;
public JPanel padPlayer1;
public JPanel padComputer;
public ScorePanel scorePanel;
private JButton but_Escape = new JButton("Press Space to continue !");
/*
* Constructeur de classe : PlayPanel.java
*/
// ==============================================
public PlayPanel() {
super(new BorderLayout());
setBackground(PANPLAY_COLOR);
scorePanel = new ScorePanel();
panPlayer1 = new JPanel();
panComputer = new JPanel();
padPlayer1 = new JPanel();
padComputer = new JPanel();
padPlayer1.setBackground(Color.DARK_GRAY);
padComputer.setBackground(Color.DARK_GRAY);
padPlayer1.setPreferredSize(PADPANEL_SIZE);
padComputer.setPreferredSize(PADPANEL_SIZE);
panPlayer1.setBackground(PANPLAY_COLOR);
panComputer.setBackground(PANPLAY_COLOR);
panPlayer1.add(padPlayer1);
panComputer.add(padComputer);
add(panPlayer1, BorderLayout.WEST);
add(panComputer, BorderLayout.EAST);
add(scorePanel, BorderLayout.SOUTH);
player1Score.setFont(FONT_SCORE);
ComputerScore.setFont(FONT_SCORE);
addMouseMotionListener(this);
timer.start();
}
/*
* Add the ball
*/
// ==============================================
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.BLACK);
initBall(g2);
// trait épais
g2.setColor(Color.DARK_GRAY);
g2.setStroke(new BasicStroke(10));
g2.drawLine((getPlayPanelWidth() / 2) - 5, getPlayPanelHeight(),
(getPlayPanelWidth() / 2) - 5, 0);
}
/*
* Init ball
*/
// ==============================================
private void initBall(Graphics2D graphics2d) {
Graphics2D g2 = graphics2d;
x = getPosX();
y = getPosY();
ballRect = new Rectangle(posX, posY, BALL_WIDTH, BALL_HEIGHT);
padRect = new Rectangle(playPanelWidth
- (getPanComputer().getWidth() + 2), (int) getPosMouse().getY()
- getPadPanelHeight() / 2, padPanelWidth, padPanelHeight);
g2.fillOval(posX, posY, BALL_WIDTH, BALL_HEIGHT);
if (posX == 763) {
if (ballRect.intersects(padRect)) {
System.out.println("collision");
Move();
} else {
int posMouseY = getPosMouse().y;
System.out.println("pas collision");
stopBall(g2, posMouseY);
}
} else {
Move();
}
}
private void Move() {
if (x < 1 + 15) {
backX = false;
scorePanel.getLab_Player1().setText("" + scoreCountPlayer1);
}
if (x > getWidth() - 52) {
backX = true;
}
if (y < 1) {
backY = false;
}
if (y > getHeight() - (SCOREPANEL_SIZE.getHeight() + BALL_HEIGHT)) {
backY = true;
}
if (!backX) {
setPosX(++x);
}
else {
setPosX(--x);
}
if (!backY) {
setPosY(++y);
} else {
setPosY(--y);
}
repaint();
}
private void stopBall(final Graphics2D g2, int posBallY) {
move = false;
}
@Override
public void mouseDragged(MouseEvent arg0) {
}
@Override
public void mouseMoved(MouseEvent arg0) {
// Définit les limite de le souris, la position
// des pads et de la souris.
upLimit = getPadPanelHeight() / 2;
downLimit = playPanelHeight - scorePanel.getScorePanHeight()
- (getPadPanelHeight() / 2);
padPosition = playPanelHeight - scorePanel.getScorePanHeight()
- (getPadPanelHeight());
posMouse.setLocation(arg0.getX(), arg0.getY());
setPosMouse(posMouse);
if (arg0.getY() >= downLimit) {
padPlayer1.setLocation(getPanPanelWidth() - 10, padPosition);
padComputer.setLocation(0, padPosition);
} else if (arg0.getY() <= upLimit) {
padPlayer1.setLocation(getPanPanelWidth() - 10, 0);
padComputer.setLocation(0, 0);
} else {
padPlayer1.setLocation(getPanPanelWidth() - 10,
(int) posMouse.getY());
padComputer.setLocation(0, (int) posMouse.getY()
- (getPadPanelHeight() / 2));
}
}
private class TimerListener implements ActionListener {
/** Handle the action event */
public void actionPerformed(ActionEvent e) {
repaint();
}
}
private static final long serialVersionUID=1L;
私有int posX=屏幕宽度/2;
私家车;
int x;
int-y;
私有整数scoreCountPlayer1=0;
专用计算机=0;
专用int延迟=10;
//创建一个延时为1000毫秒的计时器
专用计时器=新计时器(延迟,新计时器侦听器());
私有矩形ballRect;
私有矩形padRect;
私人上传;
私有int下行链路;
私人职位;
公共布尔backX=false;
公共布尔backY=false;
公共布尔移动=真;
公共点posMouse=新点();
专用int播放面板宽度;
私家车高度;
专用内部焊盘宽度;
专用内板高度;
专用内面板宽度;
私人内部面板高度;
专用JLabel player1Score=新JLabel(“1”);
私人JLabel ComputerScore=新JLabel(“0”);
私人JPanel panPlayer1;
公共JPanel全计算机;
公共JPanel padPlayer1;
公共JPanel便携式计算机;
公众记分小组;
私有JButton但_Escape=newjbutton(“按空格继续!”);
/*
*类构造函数:PlayPanel.java
*/
// ==============================================
公共播放面板(){
超级(新边框布局());
后退地面(PANPLAY_颜色);
scorePanel=新的scorePanel();
panPlayer1=新的JPanel();
panComputer=新的JPanel();
padPlayer1=新的JPanel();
padComputer=newjpanel();
padPlayer1.立根(颜色:深灰色);
padComputer.背景(颜色:深灰色);
padPlayer1.setPreferredSize(焊盘尺寸);
padComputer.setPreferredSize(PADPANEL_尺寸);
panPlayer1.后退(PANPLAY_颜色);
全计算机。背景(PANPLAY_颜色);
panPlayer1.add(padPlayer1);
padComputer.add(padComputer);
添加(panPlayer1,BorderLayout.WEST);
添加(panComputer,BorderLayout.EAST);
添加(scorePanel,BorderLayout.SOUTH);
player1Score.setFont(字体分数);
计算机分数。设置字体(字体分数);
addMouseMotionListener(此);
timer.start();
}
/*
*加球
*/
// ==============================================
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
g2.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.设置颜色(颜色为黑色);
initBall(g2);
//特征派
g2.设置颜色(颜色:深灰色);
g2.设定行程(新基本行程(10));
g2.绘图线((getPlayPanelWidth()/2)-5,getPlayPanelHeight(),
(getPlayPanelWidth()/2)-5,0);
}
/*
*初始球
*/
// ==============================================
私有void initBall(Graphics2D Graphics2D){
Graphics2D g2=Graphics2D;
x=getPosX();
y=getPosY();
ballRect=新矩形(posX、posY、BALL_宽度、BALL_高度);
padRect=新矩形(playPanelWidth
-(getPanComputer().getWidth()+2),(int)getPosMouse().getY()
-getPadPanelHeight()/2,padPanelWidth,padPanelHeight);
g2.圆角椭圆(posX、posY、球头宽度、球头高度);
if(posX==763){
if(ballRect.相交(padRect)){
系统输出打印项次(“冲突”);
Move();
}否则{
int posMouseY=getPosMouse().y;
System.out.println(“pas冲突”);
停止球(g2,posMouseY);
}
}否则{
Move();
}
}
私人空位移动(){
如果(x<1+15){
backX=假;
scorePanel.getLab_Player1().setText(“+scoreCountPlayer1”);
}
如果(x>getWidth()-52){
backX=true;
}
if(y<1){
backY=false;
}
如果(y>getHeight()-(记分板大小.getHeight()+球高度)){
backY=true;
}
如果(!backX){
setPosX(++x);
}
否则{
setPosX(--x);
}
如果(!backY){
setPosY(++y);
}否则{
setPosY(--y);
}
重新油漆();
}
专用空心止回球(最终图形2D g2,int posBallY){
move=false;
}
@凌驾
公共无效鼠标标记(鼠标事件arg0){
}
@凌驾
public void mouseMoved(MouseEvent arg0){
//莱索里斯有限公司
//德帕德和德拉索里斯。
upLimit=getPadPanelHeight()/2;
downLimit=playPanelHeight-scorePanel.getScorePanHeight()
-(getPadPanelHeight()/2);
padPosition=playPanelHeight-scorePanel.getScorePanHeight()
-(getPadPanelHeight());
setLocation(arg0.getX(),arg0.getY());
setPosMouse(posMouse);
如果(arg0.getY()>=downLimit){
padPlayer1.设置位置(GetPanPanPanelWidth()-10,padPosition);
padComputer.setLocation(0,padPosition);
}else if(arg0.getY()使用java.util
包中的计时器:
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
repaint();
}
}, 20, 20); // replace 20 with how often you want it to be called (in milliseconds)
使用java.util
包中的计时器:
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
repaint();
}
}, 20, 20); // replace 20 with how often you want it to be called (in milliseconds)
问题是,每个循环移动球一个像素,我认为应该将x和y坐标从int改为double,引入一个名为speed的新变量,值为0.1,并将该速度添加到坐标中。
然后球应该每10个游戏循环移动一个像素,也许需要一个较小的值,但你必须调整它
希望它能帮上忙。问题是你每次循环都要移动球一个像素,我认为你应该把x和y坐标从int改为double,引入一个名为speed的新变量,值为0.1,并把这个速度加到坐标上。
然后球应该每10个游戏循环移动一个像素,也许需要一个较小的值,但你必须调整它
希望能有所帮助我对动画不太熟悉,但我认为您需要做的是使用计时器