Рендеринг актера изображения поверх TiledMap в Libgdx

Я создал 10 слоев объектов с помощью программного обеспечения Tile и визуализировал мозаичную карту с помощью объекта OrthogonalTiledMapRenderer.

                    renderer.setView(camera);
                    renderer.render();

Я создал класс backgroundTiledMap, расширив на него класс Actor. добавление объекта класса backgroundTiledMap в стадию класса mainGame. Его рендеринг отлично.

но когда я пытаюсь добавить следующего актера на ту же сцену. его не визуализируют.

есть ли другой способ использования мозаичной карты и актеров для обнаружения столкновений между ними.

Ниже фактического кода

backgroundTiledMap.java класс, который расширяется как актор и используется для рисования фона из тайловой карты (созданной в программном обеспечении для тайлов)

                public class BackgroundTiledMap extends Actor {

                        public MapProperties properties;
                        public MapLayer layer;
                        public MapObject mapObject;
                        public TiledMapTileLayer tiledLayer;
                        private TiledMap map;
                        private OrthogonalTiledMapRenderer renderer;
                        private OrthographicCamera camera;
                        public Array<Rectangle> tiles = new Array<Rectangle>();

                        private Pool<Rectangle> rectPool = new Pool<Rectangle>() {
                            @Override
                            protected Rectangle newObject () {
                                return new Rectangle();
                            }
                        };

                        GameStartPoint game;
                        Stage  stage;
                        Reptile reptile;

                        public BackgroundTiledMap(GameStartPoint game,Stage stage)
                        {
                               this.game = game;
                               this.stage = stage;
                               init();

                        }


                        public void init()
                        {
                            map = new TmxMapLoader().load("Images/GuideCrocodile.tmx");
                            renderer = new OrthogonalTiledMapRenderer(map, 1 / 16f);

                            camera = new OrthographicCamera();
                            camera.setToOrtho(false, 70, 50);
                            camera.update();
                            stage.setCamera(camera);

                        }

                        @Override
                        public void draw(SpriteBatch batch, float parentAlpha) {
                            super.draw(batch, parentAlpha);
                            render();

                        }

                        public void render()
                        {
                            camera.update();
                            renderer.setView(camera);
                            renderer.render();

                        }




                    }

это mainGame экран, используемый для создания сцены, сюда добавляются все остальные актеры и объекты

                    public class GuideCrocodileScreen implements Screen {

                        public GameStartPoint game;
                        private Stage stage;

                        public BackgroundTiledMap backgroundTiledMap;
                        public Reptile reptile;
                        MoveToAction moveAction;

                        public GuideCrocodileScreen(GameStartPoint game)
                        {
                            this.game = game;
                            stage = new Stage();

                        }


                        @Override
                        public void render(float delta) {
                            // clear the screen
                            Gdx.gl.glClearColor(0.7f, 0.7f, 1.0f, 1);
                            Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

                            Gdx.input.setInputProcessor(stage);
                            stage.draw();
                        }


                        private void addReptile(){

                            reptile = new Reptile(stage,100,100,50,50);
                    //        backgroundTiledMap.getTiles(100,100,50,50);

                            reptile.addListener(new InputListener() {
                                public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
                                    System.out.println("down");
                                    return true;
                                }

                                public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
                                    System.out.println("up");
                                }
                                public void touchDragged (float x, float y, int pointer) {
                                    reptile.updateReptile(x,y);
                                }

                                public boolean touchMoved (float x, float y) {
                                    //reptile.updateReptile(x,y);
                                    return false;
                                }

                            });
                            stage.addActor(reptile);

                        }



                        @Override
                        public void resize(int width, int height) {

                        }


                        @Override
                        public void show() {

                            addBackgroundArea();
                            addReptile();
                        }




                        private void addBackgroundArea(){
                            backgroundTiledMap = new BackgroundTiledMap(game,stage);
                            stage.addActor(backgroundTiledMap);
                           }


                    }

новый класс актера, это актор для перемещения по экрану, обнаруживающий столкновение с объектами, нарисованными на backgroundTiledMap reptile.java (это не отображается)

                    public class Reptile extends Actor  {

                        public GameStartPoint game;
                        private OrthogonalTiledMapRenderer renderer;
                        public SpriteBatch batch;
                        public int screenWidth;
                        public int screenHeight;
                        private Texture reptiletexture;
                        private TextureRegion reptileRegion;
                        private Stage stage;

                        public Reptile( Stage stage,int x, int y,int width, int height){



                                setX((float)x);
                                setY((float)y);
                                setWidth((float)width);
                                setHeight((float)height);
                                this.setTouchable(Touchable.enabled);
                                 this.stage = stage;
                                initialize();


                        }

                        private void initialize(){

                            this.screenWidth = GameStartPoint.WIDTH;
                            this.screenHeight = GameStartPoint.HEIGHT;
                            reptiletexture = new Texture(Gdx.files.internal("Images/basketball.png"));
                            reptileRegion = new TextureRegion(reptiletexture);
                            this.setVisible(true);

                        }

                        @Override
                        public void draw(SpriteBatch batch,float parentAlpha)
                        {
                            super.draw(batch,parentAlpha);


                           batch.draw(reptileRegion, getX(), getY(), getOriginX(),
                                    getOriginY(), getWidth(), getHeight(), getScaleX(),
                                    getScaleY(), getRotation());



                        }

                        public void updateReptile(float x,float y)
                        {
                            int duration = 5;
                             if(Gdx.input.isTouched())
                             {
                                 MoveToAction action = Actions.action(MoveToAction.class);
                                 action.setPosition(x, y);
                                 action.setDuration(duration);
                                 this.addAction(action);
                             }

                        }



                        @Override
                        public Actor hit(float x, float y, boolean touchable) {
                            //Gdx.app.log("","reptile is touched.. ") ;
                            updateReptile(x,y);
                            return super.hit(x, y, touchable);

                        }


                    }

person Parmeshwar C    schedule 18.08.2013    source источник


Ответы (2)


Старый вопрос, но это был первый хит, когда я искал ту же проблему...

Если актор использует какие-либо другие методы рисования вместо пакета, пакет должен быть завершен, а затем снова перезапущен в конце метода. Итак, в BackgroundTiledMap:

@Override
public void draw(SpriteBatch batch, float parentAlpha) {
    batch.end();
    render();  // Renders the TiledMap using OrthogonalTiledMapRenderer
    batch.begin();
}

См. https://github.com/libgdx/libgdx/wiki/Scene2d#drawing для получения дополнительной информации.

person skoll    schedule 21.03.2015

Чтобы нарисовать актера над тайловой картой, вы должны вызвать stage.draw после рендеринга тайловой карты следующим образом:

@Override
public void draw(SpriteBatch batch, float parentAlpha) {
    render();
    super.draw(batch, parentAlpha);
}

Для части столкновения вы можете получить объекты, которые вы создали в TiledMap в различных классах, таких как EllipseMapObject, PolygonMapObject, RectangleMapObject и т. д., откуда вы можете извлекать полилинии, полигоны и т. д. и использовать Класс Intersector для проверки их границ.

person Vikalp Jain    schedule 19.08.2013