有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java libgdx处理cam外部的对象

我看了一些libgdx教程,学习了如何使用cam和tile制作地图。但是我遇到了一个小问题,我需要一些想法。 我想做RPG游戏,但我想让游戏记住每个怪物的信息,比如位置。但是贴图非常大,所以我需要减少渲染量。如何在不使用大量资源的情况下保存每个怪物的信息(包括cam之外的怪物)


共 (1) 个答案

  1. # 1 楼答案

    我根据你的问题假设你已经在libGDX中使用了TiledMap。您可以使用OrthogonalTiledMapRenderer绘制地图,这将使用传递给它的Camera对象为您呈现屏幕的正确部分:

    OrthogonalTiledMapRenderer renderer =
        new OrthogonalTiledMapRenderer(myMap, 1 / 16f); // Change this to your render scale
                                                      //e.g. 1/32f means your tiles are 32px wide
    
    OrthographicCamera camera = new OrthographicCamera(16, 9); //viewport size: 16x9
    
    ...
    
    //Inside your class that implements Screen or extends Game
    public void render(float delta) {
        ...
        renderer.setView(camera);
        renderer.render();
        ...
    }
    

    要管理实体,请查看the Ashley framework。您可以给所有实体一个包含其位置的Component,然后创建一个渲染系统来绘制它们

    您必须自己绘制实体,因为它们不是TileMap的一部分,但是对于初学者来说,这个system using ^{}的实现可能会有所帮助

    如果您没有使用Box2D,下面是一个使用EntitySystem(未测试)的示例:

    public class RenderingSystem extends IteratingSystem {
    
        public static final Family MONSTERS = Family.all(BoxComponent.class).get();
        //Assumes you've made a BoxComponent class
    
        private ShapeRenderer shapes;
        private Camera camera;
    
        public RenderingSystem(Camera camera) {
            super(MONSTERS);
            this.camera = camera;
            this.shapes = new ShapeRenderer();
        }
    
        @Override
        public void update(float deltaTime) {
            shapes.begin(ShapeType.Line);
            shapes.setColor(Color.RED);
            super.update(deltaTime);
            shapes.end();
        }
    
        @Override
        protected void processEntity(Entity entity, float deltaTime) {
            Rectangle box = entity.getComponent(BoxComponent.class);
            // ^ Could be done faster using ComponentMappers
            shapes.rect(box.x, box.y, box.width, box.height);
        }
    
    }