2017-02-09 56 views
-2

我是新來的Java代碼,新鮮代碼(我用來做的Minecraft MODS),我試圖創建一個簡單的乒乓球比賽。我有我認爲我需要讓遊戲正確玩的一切,但是當我需要它時,主遊戲類似乎不會調用其他類。這裏有什麼不對嗎,你可以看到我失蹤了嗎?這將是一個非常棒的幫助。遊戲類不調用其他類

主要遊戲類

package crim.pong.main; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 


import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class Game extends JPanel{ 


    int x = 0; 
    int y = 0; 
    int xa = 1; 
    int ya = 1; 

    Ball ball = new Ball(this); 
    Racquet racquet = new Racquet(this); 
    private void moveBall(){ 
     ball.move(); 
     racquet.move(); 
    } 

    @Override 
    public void paint(Graphics g){ 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.fillOval(x, y, 30, 30); 
     ball.paint(g2d); 
     racquet.paint(g2d); 

} 

    public void gameOver(){ 
     JOptionPane.showMessageDialog(this, "Game Over", "Game Over", JOptionPane.YES_NO_OPTION); 
     System.exit(ABORT); 
    } 

    public static void main(String[] args) throws InterruptedException{ 
     JFrame frame = new JFrame("Pong"); 
     Game game = new Game(); 
     frame.add(game); 
     frame.setSize(300, 400); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     while(true){ 
      game.moveBall(); 
      game.repaint(); 
      Thread.sleep(10); 
     } 

    } 
} 

鍵盤類

package crim.pong.main; 

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class KeyboardInput extends JPanel{ 
    public KeyboardInput(){ 
     KeyListener listener = new MyKeyListener(); 
     addKeyListener(listener); 
     setFocusable(true); 

    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame("Pong"); 
     KeyboardInput keyboardInput = new KeyboardInput(); 
     frame.add(keyboardInput); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public class MyKeyListener implements KeyListener{ 
     @Override 
     public void keyTyped(KeyEvent e){ 

     } 
     @Override 
     public void keyPressed(KeyEvent e){ 
      System.out.println("keyPressed="+KeyEvent.getKeyText(e.getKeyCode())); 
     } 
     @Override 
     public void keyReleased(KeyEvent e){ 
      System.out.println("keyReleased="+KeyEvent.getKeyText(e.getKeyCode())); 
     } 
    } 

} 

Ball類

package crim.pong.main; 

import java.awt.Graphics2D; 
import java.awt.Rectangle; 

public class Ball { 

    private static final int DIAMETER = 30; 
    int x = 0; 
    int y = 0; 
    int xa = 1; 
    int ya = 1; 
    private Game game; 

    public Ball(Game game){ 
     this.game = game; 
    } 

    void move(){ 
     if(x + xa < 0) 
      xa = 1; 
     if(x + xa > game.getWidth() - DIAMETER) 
      xa = -1; 
     if(y + ya < 0) 
      ya = 1; 
     if(y + ya > game.getHeight() - DIAMETER) 
      game.gameOver(); 
      if(collision()){ 
       ya = -1; 
       y = game.racquet.getTopY() - DIAMETER; 
      } 


     x = x - xa; 
     y = y - ya; 
    } 

     private boolean collision(){ 
      return game.racquet.getBounds().intersects(getBounds()); 
     } 
    public void paint(Graphics2D g){ 
     g.fillOval(x, y, 30, 30); 
    } 
    public Rectangle getBounds(){ 
     return new Rectangle(x, y, DIAMETER, DIAMETER); 
    } 
} 

球拍類

package crim.pong.main; 

import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.KeyEvent; 

public class Racquet { 
    private static final int Y = 330; 
    private static final int WIDTH = 60; 
    private static final int HEIGHT = 20; 
    int x = 0; 
    int xa = 0; 
    private Game game; 

    public Racquet(Game game){ 
     this.game = game; 
    } 

    public void move(){ 
     if(x + xa > 0 && x + xa < game.getWidth() - 60) 
      x = xa + xa; 
    } 

    public void paint(Graphics2D g){ 
     g.fillRect(x, 330, 60, 10); 
    } 

    public void keyReleased(KeyEvent e){ 
     xa = 0; 
    } 
    public void keyPressed(KeyEvent e){ 
     if(e.getKeyCode() == KeyEvent.VK_LEFT) 
      xa = -1; 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT) 
      xa = 1; 
    } 
    public Rectangle getBounds(){ 
     return new Rectangle(x, Y, WIDTH, HEIGHT); 
    } 
    public int getTopY(){ 
     return Y; 
    } 
} 
+0

你得到什麼樣的輸出? –

+2

請格式化代碼,並提供一個最簡單的示例。 – Sid

+1

問題描述也很模糊。 「主要遊戲課程在我需要時不會調用其他課程」,它與鍵盤課程,遊戲課程有關嗎?沒有人會複製你的整個程序並開始調試它 – Gikkman

回答

0

正如在評論中提到,你有2個主類文件。這是錯誤的。

用「主」函數的類是程序的入口點,顯然只能有一個入口點想必你已將此作爲「遊戲」。

KeyboardInput也不應該試圖創建一個新的JFrame。你只需要一個,它應該由你的'遊戲'類創建。

如果你想保持鍵盤輸入在一個單獨的類,然後你想「KeyboardInput」直接實現的KeyListener然後將其添加到「遊戲」創建的JFrame,例如 (在 '遊戲')

KeyboardInput listener = new KeyboardInput(); 
addKeyListener(listener); 

(在 'KeyboardInput')

public class KeyboardInput implements KeyListener 
{ 
    public void keyTyped(KeyEvent e){ 
    //... etc etc