3

Tile ソフトウェアを使用して 10 個のオブジェクト レイヤーを作成し、OrthogonalTiledMapRenderer オブジェクトを使用してタイル マップをレンダリングしました。

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

Actor クラスを拡張する backgroundTiledMap クラスを作成しました。mainGame クラスのステージに backgroundTiledMap クラスのオブジェクトを追加します。そのレンダリングは完璧です。

しかし、同じステージに次の俳優を追加しようとしているとき。レンダリングされません。

タイル マップとアクターを使用して衝突を検出する別の方法はありますか。

実際のコードの下

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

                        }


                    }
4

2 に答える 2

0

古い質問ですが、同じ問題をグーグルで検索したとき、これが最初のヒットでした...

アクターがバッチの代わりに描画に他のメソッドを使用する場合、バッチを終了し、メソッドの最後で再び再開する必要があります。したがって、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を参照してください。

于 2015-03-21T18:43:12.067 に答える
0

タイルマップの上にアクターを描画するには、次のようにタイルマップをstage.drawレンダリングした後に呼び出す必要があります。

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

衝突部分については、 EllipseMapObject、PolygonMapObject、RectangleMapObject などTiledMapのさまざまなクラスで 作成したオブジェクトを取得できます。ここから、ポリライン、ポリゴンなどを抽出し、Intersectorクラスを使用してそれらの境界を確認できます。

于 2013-08-19T05:16:18.863 に答える