2014-07-17 10 views
0

현재 Java2D를 사용하여 Java 기반 타일 기반 게임을하고 있습니다. 그러나, 나는 정말로 바보 같은 것을 놓치고 있다고 생각합니다. 또는 아마, 제가 수천 번 내 코드를 점검하고 이상한 것을 보지 못했을 것입니다.타일 기반 게임에서 중복 된 타일

그러나 모양은 다음과 같습니다 : 그래서 이것은 내 게임의 인쇄 바로 지금 enter image description here

글쎄, 내가 알고, 그것을 잘 보이지만 당신은 살펴 경우 내 타일 기반 수준의 이미지 :

(회색 타일, 녹색 타일 잔디 벽돌되어 있으며 갈색 타일 먼지입니다)

그래서 벽돌 타일이 이상한 방법으로 복제됩니다. 여기 레벨 코드는 다음과 같습니다.

import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import java.util.ArrayList; 
import java.util.List; 

import com.wg.MainComponent; 
import com.wg.entity.Entity; 
import com.wg.entity.Particle; 
import com.wg.entity.Projectile; 
import com.wg.entity.mob.Mob; 
import com.wg.entity.mob.Player; 

public abstract class Level { 

    public BufferedImage levelImage; 
    public BufferedImage[][] tile; 
    public Rectangle[][] rect; 
    public int tileSize; 
    public float xOffset, yOffset; 
    public ArrayList<BufferedImage> collision = new ArrayList<BufferedImage>(); 

    public ArrayList<Player> players = new ArrayList<Player>(); 
    public ArrayList<Projectile> projectiles = new ArrayList<Projectile>(); 
    public ArrayList<Particle> particles = new ArrayList<Particle>(); 
    private List<Entity> entities = new ArrayList<Entity>(); 

    public BufferedImage[] tilesBufferedImages; 
    public int[] xCollisionOffset; 
    public int[] yCollisionOffset; 

    public Level(BufferedImage levelImage, int tileSize, BufferedImage[] tilesBufferedImages, int[] xCollisionOffset, int[] yCollisionOffset) { 
     this.tilesBufferedImages = tilesBufferedImages; 
     this.xCollisionOffset = xCollisionOffset; 
     this.yCollisionOffset = yCollisionOffset; 

     this.levelImage = levelImage; 
     this.tileSize = tileSize; 

     tile = new BufferedImage[levelImage.getWidth()][levelImage.getHeight()]; 
     rect = new Rectangle[levelImage.getWidth()][levelImage.getHeight()]; 

     generateLevel(); 
    } 

    public abstract void generateLevel(); 

    public void render(float xOffset, float yOffset, int scale, Graphics2D screen) { 
     this.xOffset = xOffset; 
     this.yOffset = yOffset; 

     for (int y = (int) Math.max(yOffset/(tileSize + scale), 0); y < Math.min((MainComponent.height + yOffset)/(tileSize + scale) + 1, levelImage.getHeight()); y++) { 
      for (int x = (int) Math.max(xOffset/(tileSize + scale), 0); x < Math.min((MainComponent.width + xOffset)/(tileSize + scale) + 1, levelImage.getWidth()); x++) { 
       if (tile[x][y] != null) 
        screen.drawImage(tile[x][y], (int) (x * (tileSize + scale) - xOffset), (int) (y * (tileSize + scale) - yOffset), (tileSize + scale), (tileSize + scale), null); 
      } 
     } 

     for (int i = 0; i < entities.size(); i++) { 
      entities.get(i).render(screen); 
     } 

     for (int i = 0; i < players.size(); i++) { 
      players.get(i).render(screen); 
     } 

     for (int i = 0; i < projectiles.size(); i++) { 
      projectiles.get(i).render(screen); 
     } 

     for (int i = 0; i < particles.size(); i++) { 
      particles.get(i).render(screen); 
     } 
    } 

    public void add(Entity e) { 
     if (e instanceof Particle) { 
      particles.add((Particle) e); 
     } else if (e instanceof Player) { 
      players.add((Player) e); 
     } else if (e instanceof Projectile) { 
      projectiles.add((Projectile) e); 
     } else { 
      entities.add(e); 
     } 
    } 

    public void update(int scale) { 
     for (int y = 0; y < levelImage.getHeight(); y++) { 
      for (int x = 0; x < levelImage.getWidth(); x++) { 
       if (tile[x][y] != null && rect[x][y] == null) { 
        for (int i = 0; i < tilesBufferedImages.length; i++) { 
         if (tilesBufferedImages[i] == tile[x][y]) 
          rect[x][y] = new Rectangle(x * (tileSize + scale) - Math.round(xOffset) + xCollisionOffset[i], y * (tileSize + scale) - Math.round(yOffset) + yCollisionOffset[i], (tileSize + scale) + xCollisionOffset[i], (tileSize + scale) + yCollisionOffset[i]); 
        } 
       } else if (tile[x][y] != null && rect[x][y] != null) { 
        for (int i = 0; i < tilesBufferedImages.length; i++) { 
         if (tilesBufferedImages[i] == tile[x][y]) 
          rect[x][y].setBounds(x * (tileSize + scale) - Math.round(xOffset) + xCollisionOffset[i], y * (tileSize + scale) - Math.round(yOffset) + xCollisionOffset[i], (tileSize + scale) + xCollisionOffset[i], (tileSize + scale) + yCollisionOffset[i]); 
        } 
       } 
      } 
     } 

     for (int i = 0; i < entities.size(); i++) { 
      entities.get(i).update(); 
     } 

     for (int i = 0; i < players.size(); i++) { 
      players.get(i).update(); 
     } 

     for (int i = 0; i < projectiles.size(); i++) { 
      projectiles.get(i).update(); 
     } 
     for (int i = 0; i < particles.size(); i++) { 
      particles.get(i).update(); 
     } 

     remove(); 
    } 

    public List<Player> getPlayers() { 
     return players; 
    } 

    public Player getPlayerAt(int index) { 
     return players.get(index); 
    } 

    public Player getClientPlayer() { 
     return players.get(0); 
    } 

    private void remove() { 
     for (int i = 0; i < entities.size(); i++) { 
      if (entities.get(i).isRemoved()) 
       entities.remove(i); 
     } 
     for (int i = 0; i < projectiles.size(); i++) { 
      if (projectiles.get(i).isRemoved()) 
       projectiles.remove(i); 
     } 
     for (int i = 0; i < players.size(); i++) { 
      if (players.get(i).isRemoved()) 
       players.remove(i); 
     } 
     for (int i = 0; i < particles.size(); i++) { 
      if (particles.get(i).isRemoved()) 
       particles.remove(i); 
     } 
    } 

    public boolean tileDownCollision(Mob en, boolean fixed) { 
     Point p = null; 
     if (fixed) 
      p = new Point(Math.round(en.x), Math.round(en.y + en.height)); 
     else if (!fixed) 
      p = new Point(Math.round(en.x - xOffset), Math.round(en.y + en.height - yOffset)); 
     try { 
      for (int y = 0; y < levelImage.getHeight(); y++) { 
       for (int x = 0; x < levelImage.getWidth(); x++) { 
        if (tile[x][y] != null) { 
         if (rect[x][y] != null && rect[x][y].contains(p)) { 
          if (collision.contains(tile[x][y])) 
           return true; 
         } 
        } 
       } 
      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
     } 
     return false; 
    } 

    public boolean tileUpCollision(Mob en, boolean fixed) { 
     Point p = null; 
     if (fixed) 
      p = new Point(Math.round(en.x), Math.round(en.y - 1)); 
     else if (!fixed) 
      p = new Point(Math.round(en.x - xOffset), Math.round(en.y - 1 - yOffset)); 
     try { 
      for (int y = 0; y < levelImage.getHeight(); y++) { 
       for (int x = 0; x < levelImage.getWidth(); x++) { 
        if (tile[x][y] != null) { 
         if (rect[x][y] != null && rect[x][y].contains(p)) { 
          if (collision.contains(tile[x][y])) 
           return true; 
         } 
        } 
       } 
      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
     } 
     return false; 
    } 

    public boolean tileLeftCollision(Mob en, boolean fixed) { 
     Point p = null; 
     if (fixed) 
      p = new Point(Math.round(en.x - 1), Math.round(en.y)); 
     else if (!fixed) 
      p = new Point(Math.round(en.x - 1 - xOffset), Math.round(en.y - yOffset)); 
     try { 
      for (int y = 0; y < levelImage.getHeight(); y++) { 
       for (int x = 0; x < levelImage.getWidth(); x++) { 
        if (tile[x][y] != null) { 
         if (rect[x][y] != null && rect[x][y].contains(p)) { 
          if (collision.contains(tile[x][y])) 
           return true; 
         } 
        } 
       } 
      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
     } 
     return false; 
    } 

    public boolean tileRightCollision(Mob en, boolean fixed) { 
     Point p = null; 
     if (fixed) 
      p = new Point(Math.round(en.x + en.width), Math.round(en.y)); 
     else if (!fixed) 
      p = new Point(Math.round(en.x + en.width - xOffset), Math.round(en.y - yOffset)); 
     try { 
      for (int y = 0; y < levelImage.getHeight(); y++) { 
       for (int x = 0; x < levelImage.getWidth(); x++) { 
        if (tile[x][y] != null) { 
         if (rect[x][y] != null && rect[x][y].contains(p)) { 
          if (collision.contains(tile[x][y])) 
           return true; 
         } 
        } 
       } 
      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
     } 
     return false; 
    } 

    public boolean projectileDownCollision(Projectile en, boolean fixed) { 
     Point p = null; 
     if (fixed) 
      p = new Point(Math.round(en.x), Math.round(en.y + en.height)); 
     else if (!fixed) 
      p = new Point(Math.round(en.x - xOffset), Math.round(en.y + en.height - yOffset)); 
     try { 
      for (int y = 0; y < levelImage.getHeight(); y++) { 
       for (int x = 0; x < levelImage.getWidth(); x++) { 
        if (tile[x][y] != null) { 
         if (rect[x][y] != null && rect[x][y].contains(p)) { 
          if (collision.contains(tile[x][y])) 
           return true; 
         } 
        } 
       } 
      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
     } 
     return false; 
    } 

    public boolean projectileUpCollision(Projectile en, boolean fixed) { 
     Point p = null; 
     if (fixed) 
      p = new Point(Math.round(en.x), Math.round(en.y - 1)); 
     else if (!fixed) 
      p = new Point(Math.round(en.x - xOffset), Math.round(en.y - 1 - yOffset)); 
     try { 
      for (int y = 0; y < levelImage.getHeight(); y++) { 
       for (int x = 0; x < levelImage.getWidth(); x++) { 
        if (tile[x][y] != null) { 
         if (rect[x][y] != null && rect[x][y].contains(p)) { 
          if (collision.contains(tile[x][y])) 
           return true; 
         } 
        } 
       } 
      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
     } 
     return false; 
    } 

    public boolean projectileLeftCollision(Projectile en, boolean fixed) { 
     Point p = null; 
     if (fixed) 
      p = new Point(Math.round(en.x - 1), Math.round(en.y)); 
     else if (!fixed) 
      p = new Point(Math.round(en.x - 1 - xOffset), Math.round(en.y - yOffset)); 
     try { 
      for (int y = 0; y < levelImage.getHeight(); y++) { 
       for (int x = 0; x < levelImage.getWidth(); x++) { 
        if (tile[x][y] != null) { 
         if (rect[x][y] != null && rect[x][y].contains(p)) { 
          if (collision.contains(tile[x][y])) 
           return true; 
         } 
        } 
       } 
      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
     } 
     return false; 
    } 

    public boolean projectileRightCollision(Projectile en, boolean fixed) { 
     Point p = null; 
     if (fixed) 
      p = new Point(Math.round(en.x + en.width), Math.round(en.y)); 
     else if (!fixed) 
      p = new Point(Math.round(en.x + en.width - xOffset), Math.round(en.y - yOffset)); 
     try { 
      for (int y = 0; y < levelImage.getHeight(); y++) { 
       for (int x = 0; x < levelImage.getWidth(); x++) { 
        if (tile[x][y] != null) { 
         if (rect[x][y] != null && rect[x][y].contains(p)) { 
          if (collision.contains(tile[x][y])) 
           return true; 
         } 
        } 
       } 
      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
     } 
     return false; 
    } 

    public boolean mobProjectileCollision(Mob en, Projectile pr, boolean fixed) { 
     Rectangle p1 = null; 
     if (fixed) 
      p1 = new Rectangle(Math.round(en.x), Math.round(en.y), en.width, en.height); 
     else if (!fixed) 
      p1 = new Rectangle(Math.round(en.x - xOffset), Math.round(en.y - yOffset), en.width, en.height); 

     Rectangle p2 = null; 
     if (fixed) 
      p2 = new Rectangle(Math.round(pr.x), Math.round(pr.y), pr.width, pr.height); 
     else if (!fixed) 
      p2 = new Rectangle(Math.round(pr.x - xOffset), Math.round(pr.y - yOffset), pr.width, pr.height); 

     if (p1.intersects(p2)) 
      return true; 

     return false; 
    } 

    public double calcDistance(Entity e1, Entity e2) { 
     return Math.sqrt(((e1.x - e2.x) * (e1.x - e2.x)) + ((e1.y - e2.y) * (e1.y - e2.y))); 
    } 
} 

레벨은 render (Graphics2D) 메소드로 렌더링됩니다. 그것은 추상적 인 클래스이므로 Level1의 하위 클래스를 가지고 있습니다 (이미지의 경우).

import static com.wg.MainComponent.spritesheet; 

import java.awt.Color; 
import java.awt.image.BufferedImage; 

import com.wg.BufferedImageLoader; 
import com.wg.entity.mob.Player; 

public class Level1 extends Level { 

    public static final BufferedImage bricks = crop(0, 2); 
    public static final BufferedImage dirt = crop(1, 2); 
    public static final BufferedImage grass = crop(2, 2); 
    public static final BufferedImage[] tilesList = { bricks, dirt, grass }; 
    public static final int[] defaultxCollisionOffset = { 0, 0, 0 }; 
    public static final int[] defaultyCollisionOffset = { 0, 0, 0 }; 
    private static BufferedImage level = BufferedImageLoader.load("/level1.png"); 

    private static BufferedImage crop(int x, int y) { 
     return spritesheet.getSubimage(x * 16, y * 16, 16, 16); 
    } 

    public void generateLevel() { 
     for (int y = 0; y < levelImage.getHeight(); y++) { 
      for (int x = 0; x < levelImage.getWidth(); x++) { 
       Color c = new Color(level.getRGB(x, y)); 
       String data = String.format("%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue()); 
       if (data.equals("838383")) 
        tile[x][y] = bricks; 
       else if (data.equals("bea100")) 
        tile[x][y] = dirt; 
       else if (data.equals("23d200")) 
        tile[x][y] = grass; 
      } 
     } 
    } 

    public Level1(float xOffset, float yOffset) { 
     super(level, 16, tilesList, defaultxCollisionOffset, defaultyCollisionOffset); 
     collision.add(grass); 
     collision.add(dirt); 
     collision.add(bricks); 
     add(new Player(50, 20, 1, 2, 32 + 32, 32 + 32, this)); 
     this.xOffset = xOffset; 
     this.yOffset = yOffset; 
    } 
} 

음, 두 클래스로 오류를 찾기가 정말 어려울 것이라는 것을 알고 있으므로 MCVE를 만들었습니다. :)

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.URL; 

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

public class MCVE extends JFrame { 

    public static final int WIDTH = 800; 
    public static final int HEIGHT = 600; 
    private MCVELevel1 level1 = new MCVELevel1(0, 0); 

    public static void main(String[] args) { 
     MCVE mcve = new MCVE(); 
     mcve.setVisible(true); 
     mcve.setSize(WIDTH, HEIGHT); 
     mcve.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    public void paint(Graphics g) { 
     level1.render(50, 400, 32, (Graphics2D) g); 
    } 

    private static class MCVELevel1 extends MCVELevel { 

     private static BufferedImage spritesheet = BufferedImageLoader.load("C://image//tiles.png"); 
     public static final BufferedImage bricks = crop(0, 0); 
     public static final BufferedImage dirt = crop(1, 0); 
     public static final BufferedImage grass = crop(2, 0); 
     public static final BufferedImage[] tilesList = { bricks, dirt, grass }; 
     public static final int[] defaultxCollisionOffset = { 0, 0, 0 }; 
     public static final int[] defaultyCollisionOffset = { 0, 0, 0 }; 
     private static BufferedImage level = BufferedImageLoader.load("C://image//level1.png"); 

     private static BufferedImage crop(int x, int y) { 
      return spritesheet.getSubimage(x * 16, y * 16, 16, 16); 
     } 

     public void generateLevel() { 
      for (int y = 0; y < levelImage.getHeight(); y++) { 
       for (int x = 0; x < levelImage.getWidth(); x++) { 
        Color c = new Color(level.getRGB(x, y)); 
        String data = String.format("%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue()); 
        if (data.equals("838383")) 
         tile[x][y] = bricks; 
        else if (data.equals("bea100")) 
         tile[x][y] = dirt; 
        else if (data.equals("23d200")) 
         tile[x][y] = grass; 
       } 
      } 
     } 

     public MCVELevel1(float xOffset, float yOffset) { 
      super(level, 16, tilesList, defaultxCollisionOffset, defaultyCollisionOffset); 
      this.xOffset = xOffset; 
      this.yOffset = yOffset; 
     } 
    } 

    public static class BufferedImageLoader { 
     public static BufferedImage load(String path) { 
      try { 
       return ImageIO.read(new File(path)); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      throw new NullPointerException("No file found at: " + path); 
     } 

     public static BufferedImage load(URL url) { 
      try { 
       return ImageIO.read(url); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      throw new NullPointerException("No file found at: " + url.getPath()); 
     } 
    } 
} 

MCVELevel 클래스 :

import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 

public abstract class MCVELevel { 

    public BufferedImage levelImage; 
    public BufferedImage[][] tile; 
    public Rectangle[][] rect; 
    public int tileSize; 
    public float xOffset, yOffset; 

    public BufferedImage[] tilesBufferedImages; 
    public int[] xCollisionOffset; 
    public int[] yCollisionOffset; 

    public MCVELevel(BufferedImage levelImage, int tileSize, BufferedImage[] tilesBufferedImages, int[] xCollisionOffset, int[] yCollisionOffset) { 
     this.tilesBufferedImages = tilesBufferedImages; 
     this.xCollisionOffset = xCollisionOffset; 
     this.yCollisionOffset = yCollisionOffset; 

     this.levelImage = levelImage; 
     this.tileSize = tileSize; 

     tile = new BufferedImage[levelImage.getWidth()][levelImage.getHeight()]; 
     rect = new Rectangle[levelImage.getWidth()][levelImage.getHeight()]; 

     generateLevel(); 
    } 

    public abstract void generateLevel(); 

    public void render(float xOffset, float yOffset, int scale, Graphics2D screen) { 
     this.xOffset = xOffset; 
     this.yOffset = yOffset; 

     for (int y = (int) Math.max(yOffset/(tileSize + scale), 0); y < Math.min((MCVE.HEIGHT + yOffset)/(tileSize + scale) + 1, levelImage.getHeight()); y++) { 
      for (int x = (int) Math.max(xOffset/(tileSize + scale), 0); x < Math.min((MCVE.WIDTH + xOffset)/(tileSize + scale) + 1, levelImage.getWidth()); x++) { 
       if (tile[x][y] != null) 
        screen.drawImage(tile[x][y], (int) (x * (tileSize + scale) - xOffset), (int) (y * (tileSize + scale) - yOffset), (tileSize + scale), (tileSize + scale), null); 
      } 
     } 
    } 

    public void update(int scale) { 
     for (int y = 0; y < levelImage.getHeight(); y++) { 
      for (int x = 0; x < levelImage.getWidth(); x++) { 
       if (tile[x][y] != null && rect[x][y] == null) { 
        for (int i = 0; i < tilesBufferedImages.length; i++) { 
         if (tilesBufferedImages[i] == tile[x][y]) 
          rect[x][y] = new Rectangle(x * (tileSize + scale) - Math.round(xOffset) + xCollisionOffset[i], y * (tileSize + scale) - Math.round(yOffset) + yCollisionOffset[i], (tileSize + scale) + xCollisionOffset[i], (tileSize + scale) + yCollisionOffset[i]); 
        } 
       } else if (tile[x][y] != null && rect[x][y] != null) { 
        for (int i = 0; i < tilesBufferedImages.length; i++) { 
         if (tilesBufferedImages[i] == tile[x][y]) 
          rect[x][y].setBounds(x * (tileSize + scale) - Math.round(xOffset) + xCollisionOffset[i], y * (tileSize + scale) - Math.round(yOffset) + xCollisionOffset[i], (tileSize + scale) + xCollisionOffset[i], (tileSize + scale) + yCollisionOffset[i]); 
        } 
       } 
      } 
     } 
    } 
} 

많은 감사를 : (이 내부이라고 level1.png으로이 이미지라고 tiles.png 그것은 당신의 C에 이미지라는 폴더를 만들고 실행하려면) .

편집 : 업데이트 된 코드 MCVELevel에서 :

public void render(float xOffset, float yOffset, int scale, Graphics2D screen) { 
     this.xOffset = xOffset; 
     this.yOffset = yOffset; 

     for (int y = 0; y < levelImage.getHeight(); y++) { 
      for (int x = 0; x < levelImage.getWidth(); x++) { 
       if (tile[x][y] != null) 
        screen.drawImage(tile[x][y], (int) (x * (tileSize + scale) - xOffset), (int) (y * (tileSize + scale) - yOffset), (tileSize + scale), (tileSize + scale), null); 
      } 
     } 
    } 
+0

작동하지 않는 기능에 대해 좀 더 구체적으로 설명해 주실 수 있습니까? "벽돌 타일이 이상한 방식으로 복사되기 때문에 실제로는별로 도움이되지 않습니다. 스크린 샷에서 중복 된 모양을 볼 수 없습니다. 그게 당신이 기대하는 것과 어떻게 다른가요? – Tim

+0

나는 아직도 내가 뭘 찾고 있는지 잘 모르겠다. 핑크색 문자의 왼쪽에있는 벽과 핑크색 문자 오른쪽에있는 벽이 비슷합니까? (그렇다면 어떤 것이 복제이고 어느 것이 옳은가?) 아니면 다른 것? – Tim

답변

1

(내 다른 대답은 (내 생각) 잘못되지해야 다시하는 이유를 생각 나게하지만이 특정 문제에 대답하지 않습니다 나중에 알 수있는 문제가 수정되었습니다.)

레벨 1.PNG에는 벽돌과 일치하지만 눈에 보이지 않는 RGB 값을 가진 비정상적인 픽셀이 있습니다. 투명성이있는 것 같지만, PNG에 대해서는 아무 것도 모른다. 어쨌든이 level1.png은 깨끗하고 정상적으로 작동합니다. level1.png

시간이 걸렸습니다. 나는 당신의 MCVE보다 최소한의 MCVE를 만들었습니다. 이 버전은 미래의 독자가 문제의 원래 png로 문제를 디버그하는 데 도움이 될 수 있습니다.

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.URL; 

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

public class MCVE extends JFrame { 
    private static final long serialVersionUID = 1L; 
    public static final int WIDTH = 800; 
    public static final int HEIGHT = 600; 

    public static void main(String[] args) { 
     MCVE mcve = new MCVE(); 
     mcve.setVisible(true); 
     mcve.setSize(WIDTH, HEIGHT); 
     mcve.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    public void paint(Graphics g) { 
     render((Graphics2D) g); 
    } 

    public BufferedImage[][] tile; 
    public static final int TILE_SIZE = 16; 
    private static BufferedImage spritesheet = BufferedImageLoader 
      .load("tiles.png"); 
    private static final BufferedImage bricks = crop(0, 0); 
    private static final BufferedImage dirt = crop(1, 0); 
    private static final BufferedImage grass = crop(2, 0); 
    private static final BufferedImage levelImage = BufferedImageLoader.load("level1.png"); 
    int widthInTiles; 
    int heightInTiles; 

    private static BufferedImage crop(int x, int y) { 
     return spritesheet.getSubimage(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, 
       TILE_SIZE); 
    } 

    public MCVE() { 
     widthInTiles = levelImage.getWidth(); 
     heightInTiles = levelImage.getHeight(); 

     generateLevel(); 
    } 

    public void generateLevel() { 
     tile = new BufferedImage[widthInTiles][heightInTiles]; 
     for (int y = 0; y < heightInTiles; y++) { 
      for (int x = 0; x < widthInTiles; x++) { 
       Color c = new Color(levelImage.getRGB(x, y)); 
       switch (c.getRGB()) { 
       case -8158333: 
        tile[x][y] = bricks; 
        break; 
       case -14429696: 
        tile[x][y] = grass; 
        break; 
       case -4284160: 
        tile[x][y] = dirt; 
       } 
      } 
     } 
    } 

    public void render(Graphics2D screen) { 
     int scale = 16; 
     int yes = 0, no = 0; 
     for (int y = 0; y < heightInTiles; y++) { 
      for (int x = 0; x < widthInTiles; x++) { 
       if (tile[x][y] != null) { 
        screen.drawImage(tile[x][y], (int) (x * (TILE_SIZE + scale)), 
          (int) (y * (TILE_SIZE + scale)), 
          (TILE_SIZE + scale), (TILE_SIZE + scale), 
          Color.BLACK, null); 
       } 
      } 
     } 
    } 

    public static class BufferedImageLoader { 
     public static BufferedImage load(String path) { 
      try { 
       return ImageIO.read(new File(path)); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      throw new NullPointerException("No file found at: " + path); 
     } 

     public static BufferedImage load(URL url) { 
      try { 
       return ImageIO.read(url); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      throw new NullPointerException("No file found at: " + url.getPath()); 
     } 
    } 
} 
+0

지금 고맙습니다! +1. 나는이 괴괴 망측 한 수준을 어떻게 만들 었는지 아직도 알기 위해 노력하고있다. :디 –

2

문제는 render 방법 안쪽이 덩어리에 있습니다

이 말하는 것 같다
for (int y = (int) Math.max(yOffset/(tileSize + scale), 0); y < Math.min((MCVE.HEIGHT + yOffset)/(tileSize + scale) + 1, levelImage.getHeight()); y++) { 
    for (int x = (int) Math.max(xOffset/(tileSize + scale), 0); x < Math.min((MCVE.WIDTH + xOffset)/(tileSize + scale) + 1, levelImage.getWidth()); x++) { 
     if (tile[x][y] != null) 
      screen.drawImage(tile[x][y], (int) (x * (tileSize + scale) - xOffset), (int) (y * (tileSize + scale) - yOffset), (tileSize + scale), (tileSize + scale), null); 
    } 
} 

: "내가 그리려는 픽셀 to, draw tiles "(그러나 나는 그것에 대해 잘못 될 수있다. 내가 for-loop guard를 읽을 때마다 나는 다른 설명을 얻는다). 문제는 도면 영역 측면에서 x와 y를 계산하는 것이지만 tiles[] 배열의 인덱스 측면에서 사용하는 것입니다. 당신은 "타일을 그릴 타일을 그릴"을 원합니다.

generateLevel()의 루프가 올바른 작업을 수행하고 있습니다. 그런 종류의 루프를 사용하십시오 (for (y = 0 y < levelImage.getHeight(); ++y)). yOffset, tileSizescale에 대해 걱정할 필요가있는 유일한 코드 비트는 이 실제로 타일을 그립니다 코드입니다.

이 코드를 테스트 할 수 쓴, 왜 테스트를 작성해야합니다 :)

+0

글쎄, for 루프 코드가하는 일은 단지 화면 안에있는 타일을 렌더링하는 것이다. 그러나, 나는 이해하지 못했다. 나의 코드에 어떻게해야 하는가? 추신 : 답변 해 주셔서 감사합니다 ... +1 –

+0

예. MCVE를 실행하십시오. : D –

+0

힌트 없음 D :. 나는 블랙 아웃을 시도했다. 내가 말하지 않은 한 가지는, rect [] [] 배열과 contains 메소드와의 충돌이다. 그러나 충돌은 정상적으로 작동하지만 화면에 있으면 안되는 타일은 충돌에 "보이지 않는"것처럼 보이지만 그냥 통과 할 수 있습니다. 이것은 제가 말할 수있는 최고의 힌트입니다 ... –