2016-09-22 50 views
1

我很困惑为什么我的记分牌没有在屏幕上更新。分数越来越高(我使用调试器进行了检查,球也处于中心位置)。但记分牌没有更新在所有它不断地说: “0:0”得分不更新在傍

傍类

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类

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类

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类

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; 
    } 

} 

球类

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; 
    } 

} 
+0

您在添加内容前设置可见? – Li357

+0

我没有真正注意到它有所作为。 – Dheraxys

回答

0

在你球类,你要更新的分数是不是在的GamePanel类被检查以同样的比分。

请注意,在这两个类,你在呼唤

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

玩家和AI的球是从的GamePanel玩家和AI单独的实例。

您需要从GamePanel类中获取玩家和ai,并将它们传递给Ball类。要做到这一点最简单的方法很可能是给球像这样

Player player; 
AI ai; 
public Ball(Player player, AI ai) { 
    this.player = player; 
    this.ai = ai; 
} 

而在你的GamePanel类变化的构造函数:

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

要这样:

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

这是一个虽然我已经使用了java,所以我可能忘记了一个简单的方法来做到这一点,但这应该可以解决问题。

+0

工作!谢谢一堆! – Dheraxys