首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pong中不更新分数

在Pong中不更新分数
EN

Stack Overflow用户
提问于 2016-09-22 12:24:28
回答 1查看 216关注 0票数 1

我很困惑为什么我的记分板没有在屏幕上更新。分数在增加(我检查了调试器,球也居中了)。但是记分板根本没有更新,它总是显示"0 : 0“。

Pong类

代码语言:javascript
复制
package com.dheraxysgames.pong;

import java.awt.Dimension;

import javax.swing.JFrame;

public class Pong extends JFrame{

    private static final long serialVersionUID = 1L;

    //Set Resolution
    public static final int width = 300, 
                            height = width / 4 * 3, 
                            scale = 3;

    public Pong() {
        Dimension size = new Dimension(width * scale, height * scale);
        setSize(size);
        setTitle("PONG");
        setResizable(false);
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(new GamePanel());
    }

    public static int getWindowWidth(){
        return width * scale;
    }

    public static int getWindowHeight(){
        return height * scale;
    }

    public static void main(String[] args) {
        new Pong();
    }

}

GamePanel类

代码语言:javascript
复制
package com.dheraxysgames.pong;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class GamePanel extends JPanel implements ActionListener, KeyListener {

    private static final long serialVersionUID = 1L;

    Ball ball = new Ball();
    Player player = new Player();
    AI ai = new AI(this);

    public GamePanel(){
        Timer time = new Timer(50, this);
        time.start();

        this.addKeyListener(this);
        this.setFocusable(true);
    }

    private void update(){
        player.update();
        ai.update();
        ball.update();

        ball.checkCollision(player);
        ball.checkCollision(ai);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        g.setColor(Color.BLACK);
        g.fillRect(0, 0, Pong.getWindowWidth(), Pong.getWindowHeight());

        g.setColor(Color.WHITE);
        Font font = new Font("IMMORTAL", Font.BOLD, 50);
        g.setFont(font);
        g.drawString(player.score + " : " + ai.score, Pong.getWindowWidth() / 2 - 60, 50);

        player.paint(g);
        ai.paint(g);
        ball.paint(g);
    }

    public Ball getBall(){
        return ball;
    }

    public void actionPerformed(ActionEvent e) {
        update();
        repaint();
    }

    //Keyboard
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_UP) player.setYVelocity(-10);
        if (e.getKeyCode() == KeyEvent.VK_DOWN) player.setYVelocity(10);
    }

    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_UP) player.setYVelocity(0);
        if (e.getKeyCode() == KeyEvent.VK_DOWN) player.setYVelocity(0);
    }

    public void keyTyped(KeyEvent e) {

    }

}

Player类

代码语言:javascript
复制
package com.dheraxysgames.pong;

import java.awt.Color;
import java.awt.Graphics;

public class Player {

    public int score = 0;

    private static int width = 50,
                       height = 150;

    private int x = 800, y = (Pong.getWindowHeight() / 2) - (height / 2), 
                yV = 0;

    public Player() {

    }

    public void update(){
        y += yV;
    }

    public void paint(Graphics g){
        g.setColor(Color.GREEN);
        g.fillRect(x, y, width, height);
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

    public int getWidth(){
        return width;
    }

    public int getHeight(){
        return height;
    }

    public void setYVelocity(int speed){
        yV = speed;
    }

}

AI类

代码语言:javascript
复制
package com.dheraxysgames.pong;

import java.awt.Color;
import java.awt.Graphics;

public class AI {

    public int score = 0;

    private static int width = 50,
                       height = 150;

    private GamePanel field;

    private int x = 50, y = (Pong.getWindowHeight() / 2) - (height / 2), 
                yV = 0;

    public AI(GamePanel game) {
        this.field = game;
    }

    public AI(){

    }

    public void update(){
        if(field.getBall().getY() < this.y) yV = -8;
        if(field.getBall().getY() > this.y) yV = 8;
        y += yV;
    }

    public void paint(Graphics g){
        g.setColor(Color.GREEN);
        g.fillRect(x, y, width, height);
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

    public int getWidth(){
        return width;
    }

    public int getHeight(){
        return height;
    }

    public void setYVelocity(int speed){
        yV = speed;
    }

}

Ball类

代码语言:javascript
复制
package com.dheraxysgames.pong;

import java.awt.Color;
import java.awt.Graphics;

public class Ball {

    private int x = Pong.getWindowWidth() / 2, y = Pong.getWindowHeight() / 2, 
                xV = 10, yV = 10;

    private static int size = 40;

    Player player = new Player();
    AI ai = new AI();

    public void update() {
        x += xV;
        y += yV;

        if (x < 0){
            reverseXDirection();
            player.score++;
            x = Pong.getWindowWidth() / 2;
            y = Pong.getWindowHeight() / 2;
        }
        if (x > Pong.getWindowWidth() - size){
            reverseXDirection();
            ai.score++;
            x = Pong.getWindowWidth() / 2;
            y = Pong.getWindowHeight() / 2;
        }
        if (y < 0 || y > Pong.getWindowHeight() - size - 38) reverseYDirection();
    }

    public void paint(Graphics g){
        g.setColor(Color.GREEN);
        g.fillOval(x, y, size, size);
    }

    private void reverseXDirection(){
        xV = -xV;
    }

    private void reverseYDirection(){
        yV = -yV;
    }

    public void checkCollision(Player p) {
        if (this.x + size > p.getX() && this.x + size < p.getX() + p.getWidth()){
            if (this.y + size > p.getY() && this.y + size < p.getY() + p.getHeight()){
                reverseXDirection();
            }
        }
    }

    public void checkCollision(AI ai) {
        if (this.x > ai.getX() && this.x < ai.getX() + ai.getWidth()){
            if (this.y > ai.getY() && this.y < ai.getY() + ai.getHeight()){
                reverseXDirection();
            }
        }
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-22 13:14:17

在您的球类中,您正在更新的分数与在GamePanel类中检查的分数不同。

注意在这两个类中您是如何调用

代码语言:javascript
复制
Player player = new Player();
AI ai = new AI();

Ball中的player和ai是独立于GamePanel中的player和ai的实例。

您需要从GamePanel类获取player和ai,并将它们传递给Ball类。最简单的方法可能是给Ball一个构造函数,如下所示

代码语言:javascript
复制
Player player;
AI ai;
public Ball(Player player, AI ai) {
    this.player = player;
    this.ai = ai;
}

在您的GamePanel类更改中:

代码语言:javascript
复制
Ball ball = new Ball();
Player player = new Player();
AI ai = new AI(this);

要这样做:

代码语言:javascript
复制
Player player = new Player();
AI ai = new AI(this);
Ball ball = new Ball(player, ai);

自从我使用java以来已经有一段时间了,所以我可能忘记了一种更简单的方法来做这件事,但这应该可以解决问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39630239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档