【问题标题】:Understanding libgdx了解 libgdx
【发布时间】:2014-04-13 06:29:46
【问题描述】:

我理解它是一个框架;更是一个开源的跨平台游戏开发库。我去了libgdx homepage 并按照视频教程中的说明进行操作。正确设置我的项目后,我能够在多个支持的平台上运行默认的 my-gdx-game 项目。很好,很好,花花公子......现在呢?

我一直在搜索论坛、wiki、javadocs 和许多其他网站,寻找体面的简单操作方法。不幸的是,我找不到任何帮助,那里的大多数帮助都假设您对该库有一些基本知识。

我觉得视频教程向我展示了如何正确设置项目,有效地弄湿我的脚,然后假设我知道如何游泳,然后让我离开了 300 英里的大海或其他地方。我无法消化这个库,因为我昨天才开始使用它,所以当谈到 libgdx 时,我是一个全新的人。

我想将我现有的项目转移到 libgdx,但我习惯于使用 BufferedImages、JFrames 和类似的东西。有经验的退伍军人的任何帮助都会很好。

顺便说一下,我在下面发布了我的核心项目,所以你们可以带我了解这里到底发生了什么......

<code>
package com.me.mygdxgame;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;

public class MyGdxGame implements ApplicationListener {
    private OrthographicCamera camera;
    private SpriteBatch batch;
    private Texture texture;
    private Sprite sprite;

    @Override
    public void create() {

        float w = Gdx.graphics.getWidth();
        float h = Gdx.graphics.getHeight();

        camera = new OrthographicCamera(1, h/w);
        batch = new SpriteBatch();

        texture = new Texture(Gdx.files.internal("data/libgdx.png"));
        texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

        TextureRegion region = new TextureRegion(texture, 0, 0, 512, 275);

        sprite = new Sprite(region);
        sprite.setSize(0.9f, 0.9f * sprite.getHeight() / sprite.getWidth());
        sprite.setOrigin(sprite.getWidth()/2, sprite.getHeight()/2);
        sprite.setPosition(-sprite.getWidth()/2, -sprite.getHeight()/2);

        }

    @Override
    public void dispose() {
        batch.dispose();
        texture.dispose();
    }

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

        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        sprite.draw(batch);
        batch.end();
    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }
}
</code>

【问题讨论】:

    标签: java android libgdx


    【解决方案1】:

    如果您想将您的 javax.swing 游戏移植到 libgdx,您必须知道您是如何制作游戏的。你把逻辑和视图分开了吗?如果是,那很好,你只需要重写视图。如果没有,那么,从头开始可能会更好。 首先要了解的基础知识:游戏的入口点是ApplicationListener 接口。如果您不需要其中的所有方法,请扩展Game,它会为您提供一些默认行为。所以我建议使用它。 GameApplicationListener 现在让您可以对某些应用程序事件做出反应:

    1. create():应用启动时调用
    2. dispose(): 当你的游戏关闭时调用(不是崩溃:P)
    3. pause():在 android 上调用,来电时/按下主页按钮。当您最小化窗口/游戏失去焦点时在桌面上。
    4. resume():暂停状态后返回时调用。
    5. resize():当你调整窗口大小和在安卓上,当屏幕旋转时调用(你必须在清单文件中允许它)
    6. render():调用每个游戏循环(如果启用),用于更新游戏中的对象,然后将它们绘制到屏幕上。

    Game 类中的默认 render() 实现会为您当前的 Screen 调用 render。

    屏幕?那是什么? 好吧,想想一个正常的游戏。你启动它,它会显示一个菜单,上面有一些按钮,如Start GameSettings... 这是菜单屏幕。所以Screens 是游戏的一部分,具有不同的逻辑和视图,因此它们必须位于单独的类中。 Screens 实现了Screen 接口,它再次为您提供了一些有用的方法:

    1. show():调用,当您将此 Screen 设置为 Games ScreenMyGdxGame.setScreen() 时。
    2. hide():调用,当另一个Screen 设置为Games Screen

    所以如果当前的ScreenMenuScreen 并且我按下Play Game 按钮,则调用PlayScreenshow() 并调用MenuScreenhide()Screen 也有 pause()resume()resize() 方法,如果调用 Game 中的相同方法(始终仅适用于当前屏幕),则会调用这些方法。如果您实现ApplicationListener,则必须自己编写此默认行为。
    请注意,Screendispose() 不会自动调用。

    接下来就是绘图了。对于二维绘图,有:

    1. ShapeRenderer,大多数时候仅用于调试。它可以渲染简单的形状,如圆形、正方形...
    2. SpriteBatch,用于渲染Textures Sprites...

    所以大多数时候您将使用SpriteBatch 进行渲染。你在一个块中渲染:

    1. SpriteBatch.begin(),启动 SpriteBatch。在此调用之前设置他的视口、矩阵...
    2. SpriteBatch.draw(),将您作为参数提供的东西(有许多不同的 draw() 方法,查看 API)绘制到缓冲区,然后 flush() 在 GPU 满时将它们绘制到 GPU 或 SpriteBatch.end() 是调用。
    3. SpriteBatch.end()flush() 到 GPU 的缓冲区,因此所有内容都绘制在屏幕上。

    注意事项:

    1. 永远不要同时有 2 个 SpriteBatch 处于其 begin 状态。所以在begin()在另一个正在运行的SpriteBatch上调用end()之前
    2. 如果可能,仅使用 1 个 SpriteBatch 并尝试在每个渲染循环中仅调用一次 end(),因为这会降低一些性能。
    3. 不要在 begin-end 块之外调用 draw()

    最后但并非最不重要的“教程”: camera。它可以帮助你计算你的动作......在你自己的世界单位而不是像素中。您还可以通过移动它来使用它来显示游戏世界的不同部分。 第一:在constructor中设置你的cameraviewport:

    camera = new OrthographicCamera(16, 9);
    

    这会设置一个 16 宽和 9 高的视口。所以你的物理屏幕/显示器现在是 16 个单位宽和 9 个单位高。将此相机应用于您的 SpriteBatch 调用:

    `SpriteBatch.setProjectionMatrix(cam.combined)`
    

    通过这样做,SpriteBatch 会渲染您的相机正在查看的内容。 默认情况下,摄像机 0,0 点位于其中间。所以现在要在中间画一些东西:

    batch.draw(yourTexture, 0, 0);
    

    要在右上角绘制,请使用:

     batch.draw(yourTexture, 16 / 2, 9 / 2);
    

    要移动您的相机,请使用:

    cam.translate(16/2, 9/2);
    

    请务必在更改位置后致电cam.update()

    现在您的相机右上角位于 16,9,而不是 16/2、9/2。而0,0点就是左下角。

    我希望这在一开始并不复杂。一些帮助我学习的教程:

    1. StarAssault
    2. Steigert's blog

    【讨论】:

    • 这个答案一点也不复杂,我完全跟着你。非常感谢,我喜欢你简单的解释,我的座右铭是 K.I.S.S.(保持简单)。我也很感谢您指向教程的链接,这很有帮助。我会检查所有内容,如果我还有其他问题,请告诉您。我会投票给你,但我还没有足够的声誉。无论如何,非常感谢,保持良好的业力!
    • resize() 在 Android 上也会在屏幕旋转时调用,如果您将 Activity 设置为在清单中允许它。
    • @cortelldavis 我很高兴能帮上忙。我刚开始时也很喜欢那些教程。所以我想分享我的知识,即使我还是新手并且没有完成一场游戏 xD 我想听听你的进步,比投票更值得(在我看来)。如果您还有其他问题,请随时提出。 SO 是一个很棒的社区,大多数人都在这里提供帮助(:
    • @Tenfour04 啊我不知道。我会添加它。非常感谢
    • @Springrbua 好的,我去下载 StarAssault 作为 zip 文件。我将它解压缩到桌面上的一个单独文件夹中,然后将该文件夹导入到我的 Eclipse 工作区中。当我运行该项目时,我收到以下错误代码: 线程“LWJGL 应用程序”com.badlogic.gdx.utils.GdxRuntimeException 中的异常:无法加载文件:images/bob_01.png 我无论如何都没有修改项目,为什么没有找到游戏项目资产目录中包含的文件?
    猜你喜欢
    • 2023-04-10
    • 2016-02-15
    • 1970-01-01
    • 2014-04-22
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多