努力构建 libgdx 项目

Struggling to structure libgdx project

我知道这个问题可能会被删除,但我还是要问。

我一直在尝试使用 Libgdx 在 Java 中制作一个草稿游戏;我也一直在使用 Stage2D。

我不知道如何构建项目,因为我计划为棋盘、游戏、玩家、棋子和 GUI 单独 类。另外,我写了一些代码来画板,但是,它似乎不适用于 Stage2D。

我还是想自己解决这个问题,因为我想从这个项目中学习。所以,请不要放弃太多。

但是,我不知道如何画板或启动这个项目。

网上找的所有资源和教程都说的很不清楚。我真的不知道该怎么办。

package com.mygdx.game;

public enum Color {
    BLACK, WHITE
}
package com.mygdx.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.scenes.scene2d.Stage;

public class GUI {
    float r_brown = (float) 163 / 255;
    float g_brown = (float) 102 / 255;
    float b_brown = (float) 46 / 255;

    float r_cream = (float) 240 / 255;
    float g_cream = (float) 187 / 255;
    float b_cream = (float) 108 / 255;

    private ShapeRenderer shapeRenderer;
    private OrthographicCamera camera;

    public GUI(ShapeRenderer shapeRenderer, OrthographicCamera camera) {
        this.shapeRenderer = shapeRenderer;
        this.camera = camera;
    }

    public void drawGUI() {
    }
}
package com.mygdx.game;

public enum Type {
    SOLDIER, KING
}
package com.mygdx.game;

public class Player {
    private Color color;

    public Player() {
    }
}
package com.mygdx.game;

public class King extends Piece {

    private Location location;
    private Type type = Type.KING;
    private Player player;

    public King(Player player, Location location) {
        super(player, location);
    }

    @Override
    public void draw() {
        // TODO Auto-generated method stub
    }

    @Override
    public void move() {
        // TODO Auto-generated method stub
    }

    @Override
    public void capture() {
        // TODO Auto-generated method stub
    }
}
package com.mygdx.game;

public class Location {
    private int x;
    private int y;

    public Location(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
package com.mygdx.game;

import com.badlogic.gdx.scenes.scene2d.Actor;

public abstract class Piece extends Actor {
    private Location location;
    private Type type;
    private Player player;

    public Piece(Player player, Location location) {
        this.player = player;
        this.location = location;
    }

    public abstract void draw();

    public abstract void move();

    public abstract void capture();

    public void setLocation(Location location) {
        this.location = location;
    }

    public Location getLocation() {
        return this.location;
    }

    public void setType(Type type) {
        this.type = type;
    }

    public Type getType() {
        return this.type;
    }

    public void setPlayer(Player player) {
        this.player = player;
    }

    public Player getPlayer() {
        return this.player;
    }
}
package com.mygdx.game;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Touchable;
import com.badlogic.gdx.scenes.scene2d.actions.MoveByAction;
import com.badlogic.gdx.scenes.scene2d.InputEvent;

public class Soldier extends Actor {
    private Location location;
    private Type type = Type.SOLDIER;
    private Player player;
    Sprite sprite = new Sprite(new Texture(Gdx.files.internal("black_solider.png")));

    public Soldier(Player player, Location location) {
        //super(player, location);
        setBounds(sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());
        setTouchable(Touchable.enabled);

        addListener(new InputListener() {
            @Override
            public boolean keyDown(InputEvent event, int keycode) {
                if (keycode == Input.Keys.RIGHT) {
                    MoveByAction mba = new MoveByAction();
                    mba.setAmount(100f, 0f);
                    mba.setDuration(5f);

                    Soldier.this.addAction(mba);
                }
                return true;
            }
        });
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        sprite.draw(batch, parentAlpha);
    }

    @Override
    public void act(float delta) {
        super.act(delta);
    }

    //@Override
    public void move() {
        // TODO Auto-generated method stub
    }

    //@Override
    public void capture() {
        // TODO Auto-generated method stub
    }

    public void setLocation(Location location) {
        this.location = location;
    }

    public Location getLocation() {
        return this.location;
    }

    public void setType(Type type) {
        this.type = type;
    }

    public Type getType() {
        return this.type;
    }

    public void setPlayer(Player player) {
        this.player = player;
    }

    public Player getPlayer() {
        return this.player;
    }
}
package com.mygdx.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.viewport.ScreenViewport;

public class MyGdxGame extends ApplicationAdapter {
    Stage stage;
    private GUI gui;
    private ShapeRenderer shapeRenderer;
    private OrthographicCamera camera;

    float r_brown = (float) 163 / 255;
    float g_brown = (float) 102 / 255;
    float b_brown = (float) 46 / 255;

    float r_cream = (float) 240 / 255;
    float g_cream = (float) 187 / 255;
    float b_cream = (float) 108 / 255;

    @Override
    public void create() {
        ScreenViewport viewport = new ScreenViewport();
        stage = new Stage(viewport);
        Gdx.input.setInputProcessor(stage);

        shapeRenderer = new ShapeRenderer();
        camera = new OrthographicCamera();
        gui = new GUI(shapeRenderer, camera);

        Soldier piece1 = new Soldier(new Player(), new Location(400, 400));
        stage.addActor(piece1);
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        shapeRenderer.setProjectionMatrix(camera.combined);
        shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if ((i % 2) == 0) {
                    if ((j % 2) == 0) {
                        shapeRenderer.setColor(r_brown, g_brown, b_brown, 1);
                        shapeRenderer.rect(100 * i, 100 * j, 100, 100);
                    } else {
                        shapeRenderer.setColor(r_cream, g_cream, b_cream, 1);
                        shapeRenderer.rect(100 * i, 100 * j, 100, 100);
                    }
                } else {
                    if ((j % 2) == 0) {

                        shapeRenderer.setColor(r_cream, g_cream, b_cream, 1);
                        shapeRenderer.rect(100 * i, 100 * j, 100, 100);
                    } else {
                        shapeRenderer.setColor(r_brown, g_brown, b_brown, 1);
                        shapeRenderer.rect(100 * i, 100 * j, 100, 100);
                    }
                }
            }
        }

        shapeRenderer.end();
        camera.update();

        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();

        /*
        Piece[][] pieces = new Piece[8][8];
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                Piece currentPiece = pieces[i][j];
                currentPiece.draw();
            }
        }
        */
    }
    @Override
    public void dispose() {
        shapeRenderer.dispose();
    }
}

一些快速而肤浅的建议:

您似乎面临着多重挑战和问题。如果可以的话,一次一个地关注它们,一个一个地划分和征服它们。

如果您这样做是为了学习,并且您对编程还很陌生,请务必注意项目范围不要太大。为您希望能够对项目执行的操作设定一个非常适度的目标,一旦您完成了该目标,您就可以添加一个额外的目标。周而复始。这是非常抗风险的,因为你从一个相对容易的点开始,然后从那里开始。这样做的缺点是您可能需要做大量的工作,因为早期适合的设计可能不适合以后的工作,这可能需要或多或少的重写和重新设计。一旦您获得更多经验,尽早规划和寻求设计会非常非常有帮助,特别是如果您知道某些重要方面以后会很重要,并且您早期选择的设计会影响这些 - 但同样,这是一旦你更有经验。

考虑一下您希望游戏能够拥有哪些功能,例如 AI(状态-space-搜索)、图形、saving/loading、使用 GUI 移动的玩家,等等。然后选择一些您认为既容易又最值得拥有的东西。如果你是新手,不要要求它是一个有凝聚力的整体,一旦你有了更多的经验、学到了更多的知识、对事物有了更多的思考等等,你以后总是可以把它作为一个更雄心勃勃的目标。再一次,非常,对你的目标和范围非常谦虚,获得一些经验并学习。