开发者

My for loop doesnt appear to run in my paint method

so im building brick breaker on Java and so far I have most of the UI done but Im having an issue with showing my bricks on my UI. I have written the code for it in my paint method which builds my panel and then my panel is added to a JFrame in another class. Everything shows except for my bricks and I cant seem to figure out why..

// AnimationPanel.java
//
// Informatics 45 Spring 2010
// Code Example: Our Ball Animation Becomes a Game
/开发者_JS百科/
// This is relatively similar to our AnimationPanel in the previous version
// of our ball animation, with two changes:
//
// * The paddle is now drawn, in addition to just the ball.  For fun, I've
//   drawn the paddle in a different color than the ball.
//
// * This panel has a MouseMotionListener attached to it.  The job of a
//   MouseMotionListener is to listen for mouse movement within a component.
//   In this case, any mouse movement within our AnimationPanel will turn
//   into events, which we'll handle by adjusting the center x-coordinate
//   of the paddle accordingly.
//
// * Because we need to calculate a new position for the paddle as the mouse
//   moves, we'll need to be able to convert coordinates in both directions
//   (i.e., fractional coordinates to pixel coordinates and pixel coordinates
//   to fractional coordinates).

package inf45.spring2010.examples.animation2.gui;

import inf45.spring2009.examples.animation2.model.Animation;
import inf45.spring2009.examples.animation2.model.AnimationState;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class AnimationPanel extends JPanel
{
    private Animation animation;
    private inf45.spring2009.examples.animation2.model.AnimationState currentState;
    boolean brickVisible[][];
    int bricksInRow = 4; 
    int bricksInColumn = 8; 
    int brickWidth;
    int brickHeight;
    int bricksLeft;

    public AnimationPanel(Animation animation)
    {
        this.animation = animation;
        currentState = null;
        setBackground(Color.WHITE);

        addMouseMotionListener(
            new MouseMotionAdapter()
            {
                public void mouseMoved(MouseEvent e)
                {
                    updatePaddlePosition(e.getX());
                }
            });
    }


    public void updateState(AnimationState newState)
    {
        currentState = newState;
    }


    private void updatePaddlePosition(int pixelX)
    {
        double paddleCenterX = convertPixelXToX(pixelX);
        animation.updatePaddleCenterX(paddleCenterX);
    }


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

        if (currentState == null)
        {
            return;
        }





        int centerPixelX = convertXToPixelX(currentState.getBallCenterX());
        int centerPixelY = convertYToPixelY(currentState.getBallCenterY());

        int radiusX = convertXToPixelX(currentState.getBallRadius());
        int radiusY = convertYToPixelY(currentState.getBallRadius());

        int topLeftPixelX = centerPixelX - radiusX;
        int topLeftPixelY = centerPixelY - radiusY;

        int paddleCenterPixelX = convertXToPixelX(currentState.getPaddleCenterX());
        int paddleCenterPixelY = convertYToPixelY(currentState.getPaddleCenterY());
        int paddleWidthPixels = convertXToPixelX(currentState.getPaddleWidth());
        int paddleHeightPixels = convertYToPixelY(currentState.getPaddleHeight());

        int paddleTopLeftPixelX = paddleCenterPixelX - (paddleWidthPixels / 2);
        int paddleTopLeftPixelY = paddleCenterPixelY - (paddleHeightPixels / 2);

        Graphics2D g2d = (Graphics2D) g;

        /* for (int x = 0;x<bricksInRow;x++){
              for (int y = 0;y<bricksInColumn;y++){
                  boolean bricks[][] = null;
                brickVisible[x][y] = bricks[x][y] ;
              {
                  g2d.setColor(Color.black);
                  g2d.fillRect(x*brickWidth,y*brickHeight,brickWidth-1,brickHeight-1);
                }
          }
         }
         */

        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setColor(Color.BLUE);

        g2d.fillOval(topLeftPixelX, topLeftPixelY, radiusX * 2, radiusY * 2);

        g2d.setColor(Color.RED);


        g2d.fillRect(
            paddleTopLeftPixelX, paddleTopLeftPixelY,
            paddleWidthPixels, paddleHeightPixels);
    }


    private int convertXToPixelX(double x)
    {
        return (int) (x * getWidth());
    }


    private int convertYToPixelY(double y)
    {
        return (int) (y * getHeight());
    }


    private double convertPixelXToX(int pixelX)
    {
        return (double) pixelX / getWidth();
    }


}


It seems like you don't assign any value to brickHeight and brickWidth in your code. This might be the problem.


What MByD said, although as these fields are package-local you could possibly be setting these elsewhere. Also, there is also a NPE problem here:

    boolean bricks[][] = null;
    brickVisible[x][y] = bricks[x][y] ;

I'm not sure if you added this in before or after you found things weren't working, but this is a sure-fire NullPointerException which will cause the rest of your paint code to not execute when thrown.

EDIT: I'm assuming you commented out the code that wasn't working, but this is the bit you want to make work.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜