2013-07-03 3 views
-1

Я считаю, что код будет говорить сам за себя, но в целом точка кода имеет класс Map, который будет принимать в массиве BufferedImages, значения x и значения y, чтобы составить карту из множества слоев (первый уровень представляет собой массив BufferedImage в 0, начиная с значения x в 0 и значения y в 0 и т. д.). Основная задача класса карты - взять каждый пиксель каждого изображения и преобразовать их в Block Объекты, которые просто представляют собой прямоугольники с цветом (Включает BufferedImage, потому что после этого я заменил цвет на изображение. Также включает целое число, чтобы указать, какой уровень (1 является индексом 0) разрешен с помощью 0, что означает, что он может существовать среди всех слоев). В конце, когда я вызываю Render() на объект Map, объект карты должен выполнять всю работу по рендерингу блоков в правильные позиции. Самая большая проблема со всем этим заключается в том, что я не получаю ошибок 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; 
    } 


} 

Блок Класс:

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

     } 
    } 


} 
+0

Start с помощью 'paintComponent' вместо' paint' и убедитесь, что вы вызываете 'super.paintComponent' – MadProgrammer

+0

Я не вижу, где вызывается' initialize' для 'Map'. Если это не так, то «Карта» никогда не будет рендерить ... – MadProgrammer

+0

Я невероятно тупой, спасибо @MadProgrammer –

ответ

2

Метод initializeMap никогда не называется, поэтому Map никогда не сделает ...

Некоторые отзывы ...

  • Не когда-либо переопределить paint, используйте paintComponent вместо (это очень редко, что вы должны переопределить paint ...
  • Марка конечно, вы звоните super.paintXxx - в фоновом режиме много важных работ, которые вы не хотите пропустить или реплицировать ...
  • Вместо того, чтобы выступать из контейнера верхнего уровня, такого как JFrame, начиная с JPanel и Добавить это к раме создать вместо
  • Остерегайтесь static переменных, это может вызвать у вас больше проблем;)
  • Вы также можете иметь прочитать Initial Threads
Смежные вопросы