以下代码不会呈现

时间:2013-07-03 02:08:30

标签: java swing awt logic

我相信代码会说明一切,但总的来说,代码的重点是Map类将包含BufferedImages,x值和y值的数组,编写许多图层的地图(第一层是BufferedImage数组,从0开始,x值为0,y值为0,依此类推)。地图类的主要工作是获取每个图像的每个像素并将它们转换为Block对象,这些对象只是带有颜色的矩形(包括BufferedImage,因为在它工作之后,我将用图像替换颜色。还包括一个整数,用于指定允许使用哪个图层(1为索引0),0表示它可以存在于所有图层中。最后,当我在Map对象上调用Render()时,地图对象应该完成将块渲染到正确位置的所有工作。所有这一切的最大问题是我没有sytax或编译器错误,所以我的逻辑是搞砸了,我无法理解!

提前致谢,如果问题令人困惑,请告诉我!

地图类:

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;


public class Map {

    private int width;
    private int height;
    public int getWidth() { return width; }
    public int getHeight() { return height; }

    private int xPos;
    private int yPos;
    public int getX(int i) 
    { 
        return xPos; 
    }
    public int getY(int i) 
    { 
        return yPos; 
    }
    public void setPosition(int x, int y) { xPos = x; yPos = y; }

    private int[] xStarts;
    private int[] yStarts;

    private ArrayList<BufferedImage> layersList = new ArrayList<BufferedImage>();
    public void addLayer(BufferedImage image) { layersList.add(image); }
    public void setLayer(int i, BufferedImage image) { layersList.set(i, image); }

    private Block[][][] blocksArray;
    private boolean beenInitialized = false;


    public Map(BufferedImage[] images, int[] x, int[] y){
        for (BufferedImage image : images){
            layersList.add(image);
            xStarts = x;
            yStarts = y;
        }
    }

    public void initialize(){
        int widthMax = 0;
        int heightMax = 0;
        for (BufferedImage image : layersList){
            if (image.getHeight() > heightMax) { heightMax = image.getHeight(); }
            if (image.getWidth() > widthMax) { widthMax = image.getWidth(); }
        }

        width = widthMax;
        height = heightMax;

        blocksArray = new Block[layersList.size()][width][height];

        for (int i = 0; i < layersList.size(); i++){

            int currentLayer = i;

            for (int y = 0; y < layersList.get(i).getHeight(); y++){
                for (int x = 0; x < layersList.get(i).getWidth(); x++){

                    int colorCode = layersList.get(i).getRGB(x, y);
                    boolean error = true;
                    Block b = null;

                    for (int c = 0; c < Block.BLOCKS.size(); c++){
                        if (Block.BLOCKS.get(i).getColorCode() == colorCode && (Block.BLOCKS.get(i).getLayerCode() == currentLayer || Block.BLOCKS.get(i).getLayerCode() == 0)){
                            b = Block.BLOCKS.get(c);
                            error = false;
                        }
                    }

                    if (!error){
                        blocksArray[currentLayer][x][y] = b;
                    } else {
                        Block bb = new Block(false, colorCode);
                        bb.initialize();
                        blocksArray[currentLayer][x][y] = bb;
                    }

                }
            }

        }

        beenInitialized = true;
    }

    public void render(Graphics2D g2d){
        if (beenInitialized){
            for (int i = 0; i < layersList.size(); i++){

                for (int y = yStarts[i]; y < layersList.get(i).getHeight() + yStarts[i]; y += Block.SIZE){
                    int currentY = 0;
                    for (int x = xStarts[i]; x < layersList.get(i).getWidth() + xStarts[i]; x += Block.SIZE){
                        int currentX = 0;

                        blocksArray[i][currentX][currentY].setPosition(x, y);
                        blocksArray[i][currentX][currentY].render(g2d);

                        currentX ++;
                    }
                    currentY++;
                }

            }
        }
    }

    public void updatePosition(int x, int y){
        xPos += x;
        yPos += y;
    }


}

Block Class:

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.util.ArrayList;


public class Block {
    public static final int SIZE = 32;
    public static final boolean DEBUG = true;
    public static ArrayList<Block> BLOCKS = new ArrayList<Block>();

    private Color debugColor;
    public Color getColor() { return debugColor; }
    public void setColor(Color color) { debugColor = color; }

    private BufferedImage blockIcon;
    public BufferedImage getIcon() { return blockIcon; }
    public void setIcon(BufferedImage icon) { blockIcon = icon; }

    private int xPos;
    private int yPos;
    public int getX() { return xPos; }
    public int getY() { return yPos; }
    public void setPosition(int x, int y) { xPos = x; yPos = y; }

    private Rectangle blockShape;
    public Rectangle getShape() { return blockShape; }

    private int colorCode;
    public int getColorCode() { return colorCode; }

    private boolean colides;
    public boolean doesColide() { return colides; }

    private int layerCode;
    public int getLayerCode() { return layerCode; }

    private boolean beenInitialized = false;


    public Block(boolean colides, int layerCode){
        this.colides = colides;
        this.layerCode = layerCode;
    }

    public void initialize(){
        blockShape = new Rectangle(xPos, yPos, SIZE, SIZE);

        int r = (colorCode >> 16) & 0x000000FF;
        int g = (colorCode >> 8) & 0x000000FF;
        int b = (colorCode) & 0x000000FF;

        debugColor = new Color(r, g, b);

        BLOCKS.add(this);
        beenInitialized = true;
    }

    public void render(Graphics2D g2d){
        if (beenInitialized){
            if (DEBUG){
                g2d.setColor(debugColor);
                if (colides){
                    g2d.fill(blockShape);
                } else {
                    g2d.draw(blockShape);
                }
            } else{

            }
        }
    }
}

最后是游戏类(我把它放在一起,只是为了显示一个测试窗口):

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Game extends JFrame{

    public Game(){  
        super("Test");

        try{
            layer1 = ImageIO.read(getClass().getResourceAsStream("/layer1.png"));
            layer2 = ImageIO.read(getClass().getResourceAsStream("/layer2.png"));
        } catch (Exception ex) { ex.printStackTrace(); }


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);

        setLayout(new BorderLayout());
        add(new panel(), BorderLayout.CENTER);
        pack();

        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args){
        new Game();
    }

    private int[] xStartPositions = {0, 0};
    private int[] yStartPositions = {0, 0};

    private BufferedImage layer1;
    private BufferedImage layer2;

    private BufferedImage[] imageArray = {layer1, layer2};

    private Map map;






    public class panel extends JPanel{
        public panel(){
            setMinimumSize( new Dimension(1200, 675));
            setMaximumSize( new Dimension(1200, 675));
            setPreferredSize( new Dimension(1200, 675));

            setVisible(true);

            map = new Map(imageArray, xStartPositions, yStartPositions);
        }

        public void paint(Graphics g){

            Graphics2D g2d = (Graphics2D) g;

            map.render(g2d);

        }
    }


}

1 个答案:

答案 0 :(得分:2)

永远不会调用initialize的{​​{1}}方法,因此Map永远不会呈现...

一些反馈......

  • 请勿覆盖Map,而是使用paint(您很少需要覆盖paintComponent ...
  • 确保您正在呼叫paint - 在后台有很多重要的工作正在进行中,您不想错过或复制......
  • 不是从super.paintXxx这样的顶级容器扩展,而是从JFrame扩展并将其添加到您创建的框架
  • 小心JPanel变量,这可能会导致更多问题;)
  • 您可能还希望阅读Initial Threads