如何让代码移动球?

How to make code move the ball?

我想做一个乒乓球游戏但是我的球不动怎么让球动起来?

这是我的代码

package test;

import java.awt.*;  
import java.awt.event.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class pingpong1 extends JFrame implements Runnable  {

 public static void main(String[] args) {
        pingpong1 ping = new pingpong1("PingPong Hard Game");

        new Thread(ping).start();

        ping.setSize(600, 300);

        ping.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        ping.setVisible(true);

    } private int width, height;  

    private User user;          
    private Computer computer;          
    private Ball ball;
    static int UserScore = 0;
    int ComputerScore=0;

    public pingpong1(String title){

    }
    @Override
    public void paint(Graphics g){
        super.paint(g);
        Image img2;
        ImageIcon img = new ImageIcon("pingpong.png");
        img2 = img.getImage();
        g.drawImage(img2,0,0, this);
        ball.paint(g);
    }
    @Override
    public void run(){
        while(true){
            ball.moveBall();
            repaint();

                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    Logger.getLogger( getName()).log(Level.SEVERE,null,e);
                }
    }
    }

    public void paintComponent(Graphics g) {
          if (user == null) {
              width = getWidth();
              height = getHeight();
              user = new User();
              computer = new Computer();
              ball = new Ball();
          }
          ball.draw(g);

      } 
    public class User{

    }
    public class Computer{

    }
    public class Ball{
        private int x,y;
        private int centerX , centerY;
        private Color color;
        boolean go;
        Ball(){
            go=false;
        }
        public void paint(Graphics g) {
            // TODO Auto-generated method stub

        }
        public Ball(int x,int y,Color color){
            this.x=x;
            this.y=y;
            this.color=color;
            this.centerX=5;
            this.centerY=5;
        }
        public int getX(){
            return x;
        }
        public int getY(){
            return y;
        }
        public void moveBall(){
            centerX=5;
            x+=centerX;
            y+=centerY;

        } void draw(Graphics g){
            Image img2;
            ImageIcon img = new ImageIcon("pingpong.png");
            img2 = img.getImage();
            g.drawImage(img2, centerX - -35, centerY -10  , null);
        }
    }
    }

首先是你的移动代码,需要有某种输入才能真正移动球。现在它除了添加 x 和 y 什么都不做并且不重新绘制它,所以你基本上告诉它什么都不做。 如果您正在寻找用户控制的类似这样的东西会起作用吗?

public void moveIt(KeyEvent evt) {
 switch (evt.getKeyCode()) {
        case KeyEvent.VK_DOWN:
            myY += 5;
            break;
        case KeyEvent.VK_UP:
            myY -= 5;
            break;
        case KeyEvent.VK_LEFT:
            myX -= 5;
            break;
        case KeyEvent.VK_RIGHT:
            myX += 5;
            break;
    } 
}

如果您正在寻找一种自动移动球的方法,那么您需要查看代码中的一些内容。由于您不考虑速度/方向等...

这是移动球的基本示例http://introcs.cs.princeton.edu/java/34nbody/Ball.java.html

我想发表评论,但我的代表不到 50 岁。

在您的代码中,您正确地更新了球在游戏循环中的位置:

class乒乓1

    while(true){
        ball.moveBall(); // You update movement here
        repaint();
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            System.err.println("Interrupted.");
        }
    }

但您实际上从未在更新后的位置重新绘制球:

public void paint(Graphics g){
    super.paint(g);
    Image img2;
    ImageIcon img = new ImageIcon("pingpong.png");
    img2 = img.getImage();
    g.drawImage(img2,0,0, this);
    ball.paint(g); // this method is empty
}

因为ball方法paint是空的:

class球

public void paint(Graphics g) {
    // TODO Auto-generated method stub
}

更正:

public void paint(Graphics g) {
    ImageIcon icon = new ImageIcon("ball.png");
    Image image = icon.getImage();
    g.drawImage(image, x, y, null);
}

或者只调用 ball.draw() 但你仍然需要更正 xy 因为它们目前是常量,更改:

g.drawImage(img2, centerX + 35, centerY - 10, null);

收件人:

g.drawImage(img2, x, y, null);