2016-06-04 4 views
-5
import acm.graphics.*; 
    import acm.program.*; 
    import acm.util.*; 

    import java.applet.*; 
    import java.awt.*; 
    import java.awt.event.*; 
    import java.util.EventListener; 


public class Breakout1 extends GraphicsProgram { 


public static final int APPLICATION_WIDTH = 400; 
public static final int APPLICATION_HEIGHT = 600; 


private static final int WIDTH = APPLICATION_WIDTH; 
private static final int HEIGHT = APPLICATION_HEIGHT; 


private static final int PADDLE_WIDTH = 60; 
private static final int PADDLE_HEIGHT = 10; 


private static final int PADDLE_Y_OFFSET = 30; 

/**Number of bricks per row */ 
private static final int NBRICKS_PER_ROW = 10; 

/** 
* Number of rows of bricks 
*/ 
private static final int NBRICK_ROWS = 10; 

/** 
* Separation between bricks 
*/ 
private static final int BRICK_SEP = 4; 

/** 
* Width of a brick 
*/ 
private static final int BRICK_WIDTH = 
     (WIDTH - (NBRICKS_PER_ROW - 1) * BRICK_SEP)/NBRICKS_PER_ROW; 

/** 
* Height of a brick 
*/ 
private static final int BRICK_HEIGHT = 8; 

/** 
* Radius of the ball in pixels 
*/ 
private static final int BALL_RADIUS = 10; 

/** 
* Offset of the top brick row from the top 
*/ 
private static final int BRICK_Y_OFFSET = 70; 

/** 
* Number of turns 
*/ 
private static final int NTURNS = 3; 



/* Method: init() */ 

/** 
* Sets up the Breakout program. 
*/ 
public void init() { 
    add (new GImage("C:\\Users\\Home\\Desktop\\beach.jpg")); 
    drawCanvas(); 
    drawBrickWall(); 
    drawPaddle(); 
    drawBall(); 
    addMouseListeners(); 
} 


/* Method: run() */ 

/** 
* Runs the Breakout program. 
*/ 
public void run() { 


    } 


private GRect brick; 
private GOval ball; 
private GRect paddle; 

private void drawBrickWall() { 
    for (int i = 0; i < NBRICK_ROWS; i++) 
     for (int j = 0; j < NBRICKS_PER_ROW; j++) 
      drawBrick(i, j); 
} 

private void drawBrick(int row, int col) { 
    double x, y; // brick location 
    GRect brick = new GRect(BRICK_WIDTH, BRICK_HEIGHT); 
    x = computeXOffset() + col * (BRICK_WIDTH + BRICK_SEP); 
    y = BRICK_Y_OFFSET + row * (BRICK_HEIGHT + BRICK_SEP); 
    brick = new GRect(x, y, BRICK_WIDTH, BRICK_HEIGHT); 
    brick.setFilled(true); 
    add(brick, x, y); 


    if (row < 2) { 
     brick.setColor(Color.RED); 
    } else if (row == 2 || row == 3) { 
     brick.setColor(Color.ORANGE); 
    } else if (row == 4 || row == 5) { 
     brick.setColor(Color.YELLOW); 
    } else if (row == 6 || row == 7) { 
     brick.setColor(Color.GREEN); 
    } else if (row == 8 || row == 9) { 
     brick.setColor(Color.CYAN); 
    } 
} 


private double computeXOffset() { 
    return 0.5 * (WIDTH - (NBRICKS_PER_ROW - 1) * BRICK_SEP - BRICK_WIDTH * NBRICKS_PER_ROW); 
} 

private void drawPaddle() { 
    GRect paddle = new GRect(PADDLE_WIDTH, PADDLE_HEIGHT); 
    paddle.setFilled(true); 
    add(paddle, 0.5 * (WIDTH - PADDLE_WIDTH), HEIGHT - PADDLE_Y_OFFSET - PADDLE_HEIGHT); 
    addMouseListeners(); 
} 

private boolean isMouseXInsideWindow(int x) { 
    return ((x > PADDLE_WIDTH/2) && (x < (WIDTH - PADDLE_WIDTH/2))); 
} 


public void mouseMoved(MouseEvent e) { 

    if (isMouseXInsideWindow(e.getX())) { 
     paddle.setLocation(paddle.getX() - PADDLE_WIDTH/2, paddle.getY()); 

    } 

에게} 나에게주는 유지브레이크 아웃 게임 : 나는 노를 이동할 수 있으며 NULLPOINTEXCEPTION 오류

private void drawBall(){ 
    GOval ball = new GOval(2*BALL_RADIUS, 2*BALL_RADIUS); 
    ball.setFilled(true); 
    add(ball, 0.5*WIDTH - BALL_RADIUS , 0.5*HEIGHT - BALL_RADIUS); 
} 

    private void drawCanvas(){ 
     GLabel myLabel= new GLabel ("Welcome to my Breakout Game!"); 
     myLabel.setFont("Serif-bold-24"); 
     myLabel.setColor(Color.CYAN); 
     add(myLabel,getXCenter(myLabel), getYCenter(myLabel)); 


    } 
    private double getXCenter (GObject g){ 

     return (getWidth()-g.getWidth())/2; 
    } 
    private double getYCenter (GObject g){ 

     return (getHeight()-g.getHeight())/2; 
    } 
} 

누군가가 무엇을 확인하려고 할 수 나는 프로그램을 실행으로 나에게 오류 NULLPOINTEXCEPTION을주는 유지 mouseMoved (MouseEvent e)가 잘못되면 패들이 움직이지 않아 오류가 계속 발생합니다. 나머지 코드는 작동합니다.

+0

정확한 오류 (stacktrace)를 게시하십시오. – ctomek

+0

예외 글 "AWT-EventQueue의-0"java.lang.NullPointerException이 Breakout1.mouseMoved에서 \t (Breakout1.java:169) java.awt.AWTEventMulticaster.mouseMoved에서 \t (AWTEventMulticaster.java:330) 자바에서 \t .awt.AWTEventMulticaster.mouseMoved (AWTEventMulticaster.java:329) \t at java.awt.Component.processMouseMotionEvent (Component.java:6580) –

답변

0

데이터 멤버로 참조하는 Paddle은 인스턴스화되지 않은 것 같습니다. Paddle을 만들지 만 나머지 코드에서 사용하는 멤버 변수에는 할당되지 않았습니다.

그래서, 코드에서, drawPaddle() 내에서,이 같은 Paddle를 만듭니다

GRect paddle = new GRect(...)합니다.

그러나 이는 클래스 로컬 변수 paddle에 할당되지 않습니다. 따라서 drawPaddle()이 호출되면 할당 된 변수에 대한 참조는 본질적으로 손실됩니다. isMouseXInsideWindow(int)으로 전화하면 paddle.x을 사용해보십시오. 그러나 이것은 초기화되지 않은 클래스 자체에 속한 멤버 변수 paddle을 참조합니다.

그래서 원래 패들을 할당 할 때 로컬 변수가되는 대신 클래스의 멤버 변수에 할당해야합니다. 진정한 쉬운 수정입니다. drawPaddle()에서 GRect paddle = new GRect(...) 대신 paddle = new GRect(...)을 사용하면됩니다. 이렇게하면 메소드가 호출 된 후 참조가 추적되지 않는 로컬 변수를 생성하지 않고 멤버 변수 paddle에 대한 참조를 할당 할 수 있습니다.

나중에 이러한 문제가 발생하지 않도록하려면 GRect이 전달 될 것으로 예상되도록 메서드 호출을 설계해야합니다. 이를 통해 메소드가 작동하는 방식에 대해 훨씬 더 구체적으로 설명 할 수 있으며 참조를 관리하는 방법에 대해 신중을 기해야합니다. 또한 나중에 두 번째로 paddle 또는 세 번째 또는 네 번째를 추가하려는 경우 전체 모음을 찾는데 도움이 될 것입니다.

NullPointerExceptions으로 어려움을 겪을 때마다 오류의 정확한 원인을 좁히는 데 도움이됩니다. 당신은 이미 문제가 mouseMoved(...) 방법의 어딘가에 있어야한다는 것을 알고 있었기 때문에 콘솔에 사용하는 다양한 변수를 인쇄하여 어떤 것이 유효한지 확인하거나 null을 인쇄하거나 심지어 전혀 인쇄되지 않는 것을 볼 수있었습니다. 신청서는 귀하가 귀하의 인쇄 명세서를 제출 한 곳보다 이전에 종료되었습니다).

+0

코드에서 무엇을 편집해야합니까? 난 정말 오류를 찾을 수 없습니다 : ( –

+0

고마워요! 당신은 대단히 감사합니다! 저어가 지금 움직이고 있습니다.하지만 왜 저의 마우스를 조금 움직일 때, 외륜은 미끄러 져서 하하가되었습니다. –

+0

하하, 그게 당신이하는 곳입니다. 실험으로 재미있게 시작하자!이 솔루션으로 도움이 되었다면 질문에 답을 표시해주십시오. 해피 코딩, 카밀! –

관련 문제