Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 乒乓球游戏-为球动画添加计时器_Java_Swing_Timer_Jpanel_Pong - Fatal编程技术网

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个游戏循环移动一个像素,也许需要一个较小的值,但你必须调整它


希望能有所帮助

我对动画不太熟悉,但我认为您需要做的是使用计时器