2017-02-09 7 views
-2

저는 신선한 코드 인 Java 코드에 익숙하지 않습니다. (저는 minecraft mods를 만드는데 사용되었습니다) 간단한 pong 게임을 만들려고합니다. 나는 게임이 제대로 플레이하기 위해 필요하다고 생각하는 모든 것을 가지고있다. 그러나 메인 게임 클래스가 필요할 때 다른 클래스를 호출하지 않는 것 같다. 제가 틀렸음을 당신이 볼 수있는 이상한 점이 있습니까? 정말로 큰 도움이 될 것입니다.게임 클래스가 다른 클래스를 호출하지 않습니다.

홈페이지 게임 클래스

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

} 

볼 클래스

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

01 23,516,

코멘트에서 언급 한 바와 같이

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

당신이지고있는 것을 출력 ('KeyboardInput'에서) ('게임'에서)? –

+2

코드를 형식화하고 최소한의 예를 제공해주십시오. – Sid

+1

문제 설명이 너무 막연합니다. "기본 게임 클래스는 내가 필요할 때 다른 클래스를 호출하지 않습니다."키보드 클래스, 게임 클래스와 관련이 있습니까? 아무도 전체 프로그램을 복사하고 디버깅을 시작할 것입니다. – Gikkman

답변

0

라켓 클래스는 2 개 주 클래스 파일이 있습니다. 이것은 잘못된 것입니다.

'main'함수가있는 클래스는 프로그램의 진입 점이며 분명히 하나의 진입 점만있을 수 있으며 '게임'으로 설정했을 수 있습니다.

KeyboardInput도 새 JFrame을 만들어서는 안됩니다. 당신은 오직 하나만 필요로하고 당신의 'Game'클래스에 의해 만들어 져야합니다.

키보드 입력을 별도의 클래스로 유지하려면 'KeyboardInput'에서 KeyListener를 직접 구현 한 다음 'Game'에 의해 생성 된 jframe에 추가해야합니다 (예 :

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

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