2017-10-15 6 views
0

내 질문 :
왜 게임에 엔티티를 추가하면 (entityManager.addEntity(new Tree(handler, 19 * 64, 7 * 64));) 한 번에 2 개의 엔티티가 추가됩니까?
8 개의 새로운 트리를 추가하고 12 개를 얻었으므로 혼란 스러웠습니다.
그 외에도 world.tiles 파일을 가지고있는 world.txt 파일이 있습니다.
세계 클래스는 여기에 있습니다 :! 하나 추가! 엔티티가 내 게임에 추가됩니다! 2! 엔티티

public class World { 

    private Handler handler; 
    private int width, height; 
    private int spawnX, spawnY; 
    private int[][] tiles; 
    //Entities 
    private EntityManager entityManager; 

    public World(Handler handler, String path){ 
     this.handler = handler; 
     entityManager = new EntityManager(handler, new Player(handler, 100, 100)); 
     entityManager.addEntity(new Tree(handler, 16 * 64, 7 * 64)); 
     entityManager.addEntity(new Tree(handler, 17 * 64, 7 * 64)); 
     entityManager.addEntity(new Tree(handler, 18 * 64, 7 * 64)); 
     entityManager.addEntity(new Tree(handler, 19 * 64, 7 * 64)); 
     entityManager.addEntity(new Tree(handler, 16 * 64, 6 * 64)); 
     entityManager.addEntity(new Tree(handler, 17 * 64, 6 * 64)); 
     entityManager.addEntity(new Tree(handler, 18 * 64, 6 * 64)); 
     entityManager.addEntity(new Tree(handler, 19 * 64, 6 * 64)); 
     entityManager.addEntity(new Rock(handler, 100, 450)); 

     loadWorld(path); 

     entityManager.getPlayer().setX(spawnX); 
     entityManager.getPlayer().setY(spawnY); 
    } 

    public void tick(){ 
     entityManager.tick(); 
    } 

    public void render(Graphics g){ 
     int xStart = (int) Math.max(0, handler.getGameCamera().getxOffset()/Tile.TILEWIDTH); 
     int xEnd = (int) Math.min(width, (handler.getGameCamera().getxOffset() + handler.getWidth())/Tile.TILEWIDTH + 1); 
     int yStart = (int) Math.max(0, handler.getGameCamera().getyOffset()/Tile.TILEHEIGHT); 
     int yEnd = (int) Math.min(height, (handler.getGameCamera().getyOffset() + handler.getHeight())/Tile.TILEHEIGHT + 1); 

     for(int y = yStart;y < yEnd;y++){ 
      for(int x = xStart;x < xEnd;x++){ 
       getTile(x, y).render(g, (int) (x * Tile.TILEWIDTH - handler.getGameCamera().getxOffset()), 
         (int) (y * Tile.TILEHEIGHT - handler.getGameCamera().getyOffset())); 
      } 
     } 
     //Entities 
     entityManager.render(g); 
    } 

    public Tile getTile(int x, int y){ 
     if(x < 0 || y < 0 || x >= width || y >= height) 
      return Tile.grassTile; 

     Tile t = Tile.tiles[tiles[x][y]]; 
     if(t == null) 
      return Tile.dirtTile; 
     return t; 
    } 

    private void loadWorld(String path){ 
     String file = Utils.loadFileAsString(path); 
     String[] tokens = file.split("\\s+"); 
     width = Utils.parseInt(tokens[0]); 
     height = Utils.parseInt(tokens[1]); 
     spawnX = Utils.parseInt(tokens[2]); 
     spawnY = Utils.parseInt(tokens[3]); 

     tiles = new int[width][height]; 
     for(int y = 0;y < height;y++){ 
      for(int x = 0;x < width;x++){ 
       tiles[x][y] = Utils.parseInt(tokens[(x + y * width) + 4]); 
      } 
     } 
    } 

    public int getWidth(){ 
     return width; 
    } 

    public int getHeight(){ 
     return height; 
    } 

    public EntityManager getEntityManager() { 
     return entityManager; 
    } 

} 

내 EntityManager의 클래스는 여기에 있습니다 : 나는 트리 클래스를 만든 곳

import java.awt.Graphics; 
import java.util.ArrayList; 
import java.util.Comparator; 

import dev.blaze.tilegame.Handler; 
import dev.blaze.tilegame.entity.creatures.*; 

public class EntityManager { 

    private Handler handler; 
    private Player player; 
    private ArrayList<Entity> entities; 
    private Comparator<Entity> renderSorter = new Comparator<Entity>(){ 
     @Override 
     public int compare(Entity a, Entity b) { 
      if(a.getY() + a.getHeight() < b.getY() + b.getHeight()) 
       return -1; 
      return 1; 
     } 
    }; 

    public EntityManager(Handler handler, Player player){ 
     this.handler = handler; 
     this.player = player; 
     entities = new ArrayList<Entity>(); 
     addEntity(player); 
    } 

    public void tick(){ 
     for(int i = 0;i < entities.size();i++){ 
      Entity e = entities.get(i); 
      e.tick(); 
      if(!e.isActive()) 
       entities.remove(e); 
     } 
     entities.sort(renderSorter); 
    } 

    public void render(Graphics g){ 
     for(Entity e : entities){ 
      e.render(g); 
     } 
    } 

    public void addEntity(Entity e){ 
     entities.add(e); 
    } 

    //GETTERS SETTERS 

    public Handler getHandler() { 
     return handler; 
    } 

    public void setHandler(Handler handler) { 
     this.handler = handler; 
    } 

    public Player getPlayer() { 
     return player; 
    } 

    public void setPlayer(Player player) { 
     this.player = player; 
    } 

    public ArrayList<Entity> getEntities() { 
     return entities; 
    } 

    public void setEntities(ArrayList<Entity> entities) { 
     this.entities = entities; 
    } 

} 

나는 오류가 EntityManager의 클래스에서 생각하지 않습니다, 그것은 수 있습니다 , 또는 그냥 일식의 오류.
트리 클래스는 여기에 있습니다 :

public class Tree extends StaticEntity { 

    public Tree(Handler handler, float x, float y) { 
     super(handler, x, y, Tile.TILEWIDTH, Tile.TILEHEIGHT * 2); 

     bounds.x = 0; 
     bounds.y = 0; 
     bounds.width = width; 
     bounds.height = height; 
    } 

    @Override 
    public void tick() { 

    } 

    @Override 
    public void die(){ 

    } 

    @Override 
    public void render(Graphics g) { 
     g.drawImage(Assets.log, (int) (x - handler.getGameCamera().getxOffset()), (int) (y - handler.getGameCamera().getyOffset()), width, height, null); 
    } 

} 

당신이 다른 클래스를 알고있는 코멘트 말해해야하는 경우.

+0

잘 보자 그 EntityManager의 클래스가 너무 적어도. 또한 정확히이 메소드가 너무 많은 항목을 추가한다는 힌트를 제공합니다. 메모리의 디버거보기? 일부 기능의 출력? –

+0

내가 얻는 힌트는 내가 블록을 채광하면 두 개의 블록을 채굴하고 타일이 3 개가 아니라 2 개를 덮는 것이다. 모든 타일은 두 개의 타일 크기이며, 겹쳐서 3 개가 있고 4 개가 아닙니다. @BrunoDelor –

+0

엔티티의 중복을 초래할 것으로 보이는 항목이 없습니다. IDE의 디버그 기능을 사용하여 프로그램이 실행될 때 프로그램의 상태를 확인하십시오. 목록에 필요한 엔티티 만 포함 된 경우 이는 실수가 마이닝을 관리하는 코드를 향한 것임을 의미합니다. –

답변

0

나무 클래스에서 너비와 높이를 넣는 대신 둘을 64로 바꾸고 두 개가 아닌 트리/로그 하나만 가져 왔습니다.
대신은 :

g.drawImage(Assets.log, (int) (x - handler.getGameCamera().getxOffset()), (int) (y - handler.getGameCamera().getyOffset()), width, height, null); 

그것은이었다

g.drawImage(Assets.log, (int) (x - handler.getGameCamera().getxOffset()), (int) (y - handler.getGameCamera().getyOffset()), 64, 64, null);