【问题标题】:libGDX: Create grid for board gamelibGDX:为棋盘游戏创建网格
【发布时间】:2014-02-22 00:44:34
【问题描述】:

我正在尝试使用 libGDX 创建一个简单的棋盘游戏。只是你对我想要做什么有一个粗略的想法,想象一下 Bejeweled(虽然我的当然没有那么复杂)。

该游戏涉及一个棋盘,其单元格为正方形。根据级别,此网格具有不同数量的单元格,例如 6x6 或 8x8。我还想包含一些漂亮的动画来切换两个相邻单元格的位置(如 Bejeweled 中)。当然屏幕上也需要一些按钮。

我的问题是:最好的方法是什么?我应该使用舞台,然后使用表格作为网格吗?然后我还能轻松制作动画(使用通用补间引擎)吗?还是单独绘制精灵更好?还是有另一种完全不同的方法来解决这个问题?

谢谢你的回答,

干杯,

托尼

【问题讨论】:

    标签: java android libgdx game-engine


    【解决方案1】:
    Sprite square = new Sprite(new Texture("texture"));
    

    渲染

    float squareWidth = camera.viewportWidth / squaresOnWidth;
    float squareHeight = camera.viewportHeight / squaresOnHeight;
    square.setWidth(squareWidth);
    square.setHeight(squareHeight);
    batch.begin(); `
    for(int y = 0; y < squaresOnHeight; y++){
        for(int x = 0; x < squaresOnWidth; x++){
            square.setX(x * squareWidth);
            square.setY(y * squareHeight);
            square.draw(batch);
         }
     }
     batch.end();
    

    这应该输出一个纹理网格,未经测试。

    如果你想创建流畅的动画,你绝对应该看看 UniveralTweenEngine,这里有一个演示它可以做什么:http://www.aurelienribon.com/universal-tween-engine/gwt/demo.html

    如果您希望在按钮中使用网格。

    OrthoGraphicCamera camera = new OrthoGraphicCamera();
    camera.setToOrtho(false, yourViewportWidth, yourViewportHeight);
    camera.translate(xPos, yPos);
    Stage stage = new Stage(your wanted stage width, your wanted stage height, false, batch);
    stage.setCamera(camera); 
    for(int y = 0; y < buttonsOnHeight; y++){
        for(int x = 0; x < buttonsOnWidth; x++){
           stage.addActor(new TextButton("" + x + y * buttonsOnWidth, textButtonStyle); 
        }
     }
    

    渲染

    float buttonWidth = camera.viewportWidth / buttonsOnWidth;
    float buttonHeight = camera.viewportHeight / buttonsOnHeight;
    for(int y = 0; y < buttonsOnHeight; y++){
        for(int x = 0; x < buttonsOnWidth; x++){
            TextButton button = stage.getActors().get(x + y * buttonsOnWidth);
            button.setX(x * buttonWidth);
            button.setY(y * buttonHeight);
            button.setWidth(buttonWidth);
            button.setHeight(buttonHeight);
         }
     }
    

    然后绘制舞台,注意你应该停止当前正在运行的任何批处理,因为舞台有它自己的batch.begin() 和batch.end()。你可以在 stage.draw(); 之后再次开始你的批处理;

     stage.act(delta);
     stage.draw();
    

    【讨论】:

    • 好吧,所以你不用舞台。但是如何在没有舞台的情况下添加按钮?或者是否可以有一个只覆盖部分屏幕的舞台?
    • 感谢您的努力。我想要一个精灵网格和下面的一些按钮。所以我需要以某种方式渲染两者。
    • 我现在有事要做,如果我明天尝试创建一个答案,包括精灵和按钮?格林威治标准时间下午 5 点左右 +1?
    • @fritzi2000 我认为你的问题的一部分已经在你的另一个问题中得到了回答,因为你现在(希望)知道如何使用相机、舞台和 spritebatch。如果不只是对您的其他问题发表评论。 @theodor 您的回答似乎正确,但我不会使用 Gdx.graphics.getWidth(), Gdx.graphics.getHeight() 作为视口。如果这样做,您必须以像素为单位进行所有操作,并且取决于窗口大小。如果您使用默认的固定值,您将拥有自己的世界坐标,该坐标会按比例放大以适应游戏窗口。
    • 我在脑海中以某种方式对 Gdx.graphics.getWidth/Height 进行了编程以始终使用它:),将编辑答案。谢谢!
    【解决方案2】:

    要拥有一个网格,您可以而且应该使用相机:

    OrthographicCamera cam = new OrthographicCamera(8,8);
    

    您告诉相机具有 8 x 和 8 y 的视口。 相机 (0,0) 点位于屏幕中间。

    要将它放在左下角,您需要将其位置设置为

    cam.translate(camWidth / 2, camHeight / 2); 
    

    现在您可以在sqare.setX(0) 添加您的 sqares,以在底行添加您的 sqares,或者在sqare.setY(3) 添加您的 sqares,将其添加到从左到右的第 4 行。对于动画,您还可以使用Actions,它允许您为演员添加不同的动作并让他随着时间的推移执行这些动作。示例:

    actor.addAction(Actions.parallel(Actions.moveTo(float x, float y, float duration), Actions.rotateTo(float rotation, float duration)));
    

    使用此代码示例,您可以告诉您的演员在 duration 秒内从他的位置移动到 (x,y),当他移动到这个位置时,他在 duration 秒内从当前旋转旋转到 rotation。 希望这会有所帮助

    【讨论】:

    • 没有一个方法调用 setPosition,它被命名为 translate 并且做同样的事情。此外,除了手动将相机设置为 0、0 之外,您还可以调用 setToOrtho();
    • 据我所知,相机位置默认为 0/0。这实际上只是让人们知道它是如何工作的伪代码。我不记得确切的方法名称,Eclipse 对我帮助很大:P 感谢您的评论,我将编辑我的答案!
    • Eclipse 确实有很大帮助,在发布之前必须在那里测试代码! :D
    • 哈哈很好:P 我赞成你的回答,但请在那里阅读我的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多