2013-08-18 1 views
3

Я создал 10 слоёв объектов с использованием программного обеспечения Tile и рендеринга черепичной карты с использованием объекта OrthogonalTiledMapRenderer.Render Image actor поверх TiledMap в Libgdx

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

Я создал класс backgroundTiledMap, расширяющий класс Актера. добавление объекта класса 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); 

         } 


        } 

ответ

0

для рисования актера над tilemap вы должны вызвать stage.draw после рендеринга tilemap как этот

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

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

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 для получения дополнительной информации.