簡體   English   中英

LibGdx-具有TiledMap和兩個Actor的SideScroller

[英]LibGdx - SideScroller With TiledMap and Two Actors

我有一個40960px寬和640px高的平鋪地圖。

我還有一個主角和一個badguy,它們的寬度均為64px,高度為64px。

假設平鋪地圖的左下角顯示為(0,0)像素。 我正在嘗試使主角從平鋪地圖的位置(0,0)開始,並能夠根據用戶輸入沿x軸一直移動到平鋪地圖的另一端。

我也想讓一個壞蛋在x軸上以(255,0)渲染,並在x軸上具有255到511之間的移動范圍,這將通過程序進行控制。

目前,我的代碼將顯示平鋪的地圖和兩個字符,但是當我移動一個字符時,另一個字符也會移動。

為了清晰起見,我在這里有一個圖像鏈接

這是實現libGdx屏幕界面的類中的代碼。

public TestScreen(MyGame game){
    this.game = game;


    camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    camera.position.set(Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2, 0);
    camera.update();

    String filename = "levelMaps/level_1.tmx";
    map = new TmxMapLoader().load(filename);        
    mapRenderer = new OrthogonalTiledMapRenderer(map);

    mainPlayer = new Player();

    badGuy = new BadGuy();
    badGuy.velocity.x = camera.position.x;
}

@Override
public void render(float delta) {

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

    mapRenderer.setView(camera);        
    mapRenderer.render();

    game.batch.begin();     
    mainPlayer.render(game.batch);

    badGuy.render(game.batch);
    game.batch.end();


    //simple input handling
    if(Gdx.input.isKeyPressed(Keys.LEFT)){
        if(mainPlayer.velocity.x >= 0 && camera.position.x > 400){
            mainPlayer.moveLeft();      
            camera.position.x -= Math.abs(superSim.velocity.x); 
        } else {
            camera.position.x = 400;
            superSim.velocity.x = 0;
        }
    } 

    if(Gdx.input.isKeyPressed(Keys.RIGHT)){
        if(mainPlayer.velocity.x >= 0 && camera.position.x < 41286-(64*12)){
            mainPlayer.moveRight();     
            camera.position.x += superSim.velocity.x;
        } 
    }

    camera.update();
    mainPlayer.update(delta);
}

當玩家的位置動態變化時,我如何才能使Badguys的位置保持不變?

真的很感謝任何幫助

這就是我將相機初始化為16 * 9單位的方式。

private OrthographicCamera camera;
camera = new OrthographicCamera(16, 9);
camera.position.set(camera.viewportWidth / 2,
            camera.viewportHeight / 2, 0);
camera.update();

我的尺寸調整方法

public void resize(int width, int height) {
        camera.viewportHeight = 16 * (float) height / (float) width;
        camera.update();
    }

確實我的相機是16 * y單位,因為我計算高度以保持相同的寬高比。

使用deltaTime進行移動可以使應用以不同的fps速率平穩運行。 您的輸入處理很奇怪。 為什么在那改變相機的位置? 如果您需要使相機跟隨播放器,請執行以下操作:

import com.badlogic.gdx.graphics.OrthographicCamera;
import com.mygdx.game.entities.Player;

    public class ExtendedCamera extends OrthographicCamera {
        public Player player;

        public ExtendedCamera(Player player) {
            super(Constants.WORLD_WIDTH, Constants.WORLD_HEIGHT);
            this.player = player;
        }

        public void followPlayer() {
            if (player.body.getPosition().x - position.x > Constants.CAMERA_FOLLOW_LINE_X) {
                position.x = player.body.getPosition().x
                        - Constants.CAMERA_FOLLOW_LINE_X;
                update();
            } else if (player.body.getPosition().x - position.x < -Constants.CAMERA_FOLLOW_LINE_X) {
                position.x = player.body.getPosition().x
                        + Constants.CAMERA_FOLLOW_LINE_X;
                update();
            }
            if (player.body.getPosition().y - position.y > Constants.CAMERA_FOLLOW_LINE_Y) {
                position.y = player.body.getPosition().y
                        - Constants.CAMERA_FOLLOW_LINE_Y;
                update();
            } else if (player.body.getPosition().y - position.y < -Constants.CAMERA_FOLLOW_LINE_Y) {
                position.y = player.body.getPosition().y
                        + Constants.CAMERA_FOLLOW_LINE_Y;
                update();
            }
        }
    }

使用此跟隨方法,玩家可以自由移動並且相機不會跟隨他。 如果玩家離開該區域,攝像機將移動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM