IT源码网

java之Java 中的乒乓球游戏

bjzhanghao 2024年06月20日 程序员 36 0

我正在尝试制作一个简单的乒乓球游戏,但我无法让我的球移动。我为球和桨创建了 2 个类,但我不知道如何调用 Pong 类中移动和弹跳的方法(如果我从 Ball 类启动,它可以正常工作)。

每次我尝试从 Ball 类调用方法时,我都会得到以下信息:

无法从 Ball 类型中静态引用非静态方法ounce(GOval)

如果我尝试快速修复,我只会从不同的方法中得到另一个错误,直到遇到一个我无法更改的错误,例如 getHeight();

如何让 Ball 中的方法在 Pong 中工作? 我是否应该将所有方法移至 Pong 类,并仅将 makeBall(); 保留在 Ball 中?

我还没有将球从 Racket 上弹开或移动 Racket 的代码,但我稍后会进行处理。我只是想让球开始移动。

球:

package MyObjects; 
import java.awt.Color; 
import acm.graphics.GOval; 
import acm.program.GraphicsProgram; 
 
 
public class Ball extends GraphicsProgram{ 
    private static final double BALL_SIZE=10; 
    private static final double SPEED=1; 
    private static final double PAUSE = 1000/48.0; 
    private static boolean HIT = false; 
    public double dx=SPEED; 
    public double dy=1; 
 
    public void run(){ 
        GOval ball = makeBall(); 
        add(ball); 
        bounce(ball); 
    } 
 
    public static GOval makeBall(){ 
        GOval result = new GOval (20,20,BALL_SIZE,BALL_SIZE); 
        result.setFilled(true); 
        result.setColor(Color.BLUE); 
        return result; 
 
    } 
 
    public void bounce(GOval ball){  
        while(true){ 
            ball.move(dx,dy); 
            if(ballHitBottom(ball) && dy>=0){ 
                dy*=-1; 
                if(HIT==false) 
                HIT=true;    
            } 
            if(ballHitTop(ball) && dy<=0){ 
                if(HIT){ 
                dy*=-1; 
                } 
            } 
            pause(PAUSE); 
        } 
    } 
 
    private boolean ballHitBottom(GOval ball){ 
        double bottomY=ball.getY() + ball.getHeight(); 
        return bottomY >= getHeight(); 
    } 
 
    private boolean ballHitTop(GOval ball){ 
        double topY=ball.getY(); 
        return topY <= 0; 
    } 
} 

桨:

package MyObjects; 
 
import java.awt.Color; 
 
import acm.graphics.GOval; 
import acm.graphics.GRect; 
import acm.program.GraphicsProgram; 
 
public class Paddle extends GraphicsProgram{ 
private static double HEIGHT=100; 
private static double WIDTH=5; 
 
public void run(){ 
    GRect paddle = makePaddle(); 
    add(paddle); 
    paddle.sendToBack(); 
} 
 
public static GRect makePaddle(){ 
    GRect result = new GRect(10,10,WIDTH,HEIGHT); 
    result.setFilled(true); 
    result.setColor(Color.BLACK); 
    return result; 
 
} 
 
} 

乒:

import MyObjects.Ball; 
import MyObjects.Paddle; 
import acm.graphics.GOval; 
import acm.graphics.GRect; 
import acm.program.GraphicsProgram; 
 
 
public class Pong extends GraphicsProgram{ 
public void run(){ 
 GOval ball = Ball.makeBall(); 
 add(ball); 
 GRect paddle = Paddle.makePaddle(); 
 add(paddle); 
 
 Ball.bounce(ball);    // this won't work 

}

}

请您参考如下方法:

老实说,我认为我们需要看看 GraphicsProgram 做了什么。但我只是声明 Ball 的非静态实例:

public class Pong extends GraphicsProgram { 
    public void run() { 
        // you'll need to add a constructor to the Ball class 
        Ball base = new Ball(); 
        GOval ball = base.makeBall(); 
        add(ball); 
        GRect paddle = Paddle.makePaddle(); 
        add(paddle); 
        base.bounce(ball); 
    } 
} 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!