居中地图或相机2D游戏

时间:2015-03-30 11:17:32

标签: java android dictionary camera

我已经尝试了很多解决方案,但我的代码可能有点混乱,但无论我尝试什么,它都无法工作。

基本上我用Tiled制作了一张地图,我的玩家可以跑来跑去碰到东西。我希望整个地图在整个时间内都是可见的(它是20乘15,64像素的一块瓷砖)。相机不需要移动或跟随播放器,它必须保持静止在地图的中心。

问题是地图只显示在屏幕的右上角。当我将相机对准地图本身时,它会搞砸了碰撞检测,(当它们不可见时会撞到树上并穿过可见的树木)。所以我想要做的是将地图置于0,0我的相机所在的地方(至少我认为......)。

我想要完成的另一件事是,地图的大小会调整大小以匹配不同的手机。尝试使用stretchviewport实现这一目标,但是还没有能够测试这个。

public class PlayScreen implements Screen {
    TiledMap map;
    OrthogonalTiledMapRenderer mapRenderer; 
    OrthographicCamera cam;        
    float unitScale = 1 / 64f;
    OrthogonalTiledMapRenderer renderer = new OrthogonalTiledMapRenderer(map, unitScale);
    Viewport viewport;



 public void show() {       
     map = new TmxMapLoader().load("maps/map.tmx");             
     mapRenderer = new OrthogonalTiledMapRenderer(map); 
     cam = new OrthographicCamera(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
     cam.setToOrtho(false);
     viewport = new StretchViewport(1280, 960, cam); 

        bounds = new ArrayList<Rectangle>();
        for(int i = 0; i < 20; i++){
            for(int j = 0; j < 15; j++){
                TiledMapTileLayer cur = (TiledMapTileLayer) map.getLayers().get(1); 
                Cell cell = new Cell(); 

                Vector3 center = new Vector3(cur.getWidth() * cur.getTileWidth() / 2, cur.getHeight() * cur.getTileHeight() / 2, 0);
                cam.position.set(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2, 0);
                cam.update();

                if(cur.getCell(i,j) != null){ //null = first layer   != --> if its not 
                    cell = cur.getCell(i, j);
                    System.out.println(i + ", " + j + ", " + cell.getTile().getId());
                    bounds.add(new Rectangle(i * 64, j * 64, 64 , 64)); 
            }
        }
   }    


public void render(float delta) {

        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        mapRenderer.setView(cam);
        mapRenderer.render();

        cam.position.set(0, 0, 0);
        cam.update();

        batch.setProjectionMatrix(cam.combined);

        batch.begin();
        batch.draw(player.getCurrentFrame(), player.getPosition().x , player.getPosition().y);
        player.update(); 

        for(int i = 0; i < bounds.size(); i++){
            if(bounds.get(i).overlaps(player.getBounds())){
                int x = (int)bounds.get(i).x / 64;
                int y = (int)bounds.get(i).y / 64;

                TiledMapTileLayer cur = (TiledMapTileLayer)map.getLayers().get(1);
                Cell cell = cur.getCell(x, y);

                if(cell.getTile().getProperties().containsKey("blocked")){
                    System.out.println("bush"); 
                }
                player.reAdjust();
            }
        }

        batch.end();

 }


        public void resize(int width, int height) {
        viewport.update(width, height); 
    }   

1 个答案:

答案 0 :(得分:0)

没关系,我删除了:cam.position.set(0,0,0);一切似乎都很好。猜猜我已经做了一些改变,导致它工作,只是没有看到它导致它仍然存在。

相关问题