【问题标题】:Adding !one! entity to my game adds !two! entities添加!一个!实体添加到我的游戏中!两个!实体
【发布时间】:2017-10-15 21:29:41
【问题描述】:

我的问题是:
为什么将实体添加到我的游戏 (entityManager.addEntity(new Tree(handler, 19 * 64, 7 * 64));) 会同时添加 2 个实体?
我添加了 8 棵新树,得到了 12 棵,所以我很困惑。
最重要的是,我有一个 world.txt 文件,其中包含我的整个世界的图块。
世界级的就在这里:

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 类中,它可能是我创建 Tree 类的地方,或者只是 eclipse 的错误。
树类在这里:

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

}

如果您需要了解其他课程,请在 cmets 中告诉我。

【问题讨论】:

  • 好吧,至少让我们看看 EntityManager 类。此外,究竟是什么提示您此方法添加了太多项目。内存的调试器视图?某个函数的输出?
  • 我得到的提示是,当我挖掘该块时,它会挖掘两个块并且它覆盖三个块而不是两个块。所有的瓷砖都是两个瓷砖的大小,它们只是重叠,给出三个而不是四个。 @BrunoDelor
  • 我没有看到任何会导致实体重复的内容。使用 IDE 的调试功能检查程序运行时的状态。如果您的列表仅包含您需要的实体,这意味着错误更多地在于代码管理挖掘
  • @BrunoDelor 它可能在我设置树以绘制自身的 Tree 类中吗?我添加了树类,所以你可以看看,调试没有帮助,因为我有 20 个类
  • 确实可以。现在对我来说这是一个预测练习,但我的赌注要么是计算与世界上发生交互的代码,要么是绘制单个实体的代码。也许尝试一棵树,看看是否出现第二棵树,如果是,然后在其他地方初始化它,看看另一棵树是否以相同的方式移动

标签: java file jframe add


【解决方案1】:

在树类中,我没有放置宽度和高度,而是将两者都替换为 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多