理解libgdx

6
我知道它是一个框架,更是一个开源的跨平台游戏开发库。我访问了libgdx首页并按照视频教程上的说明进行操作。在正确设置项目后,我能够在多个支持的平台上运行默认的my-gdx-game项目。很好,不错...现在怎么办?
我搜索了论坛、维基、javadoc和许多其他网站,寻找简单明了的如何操作指南。不幸的是,我找不到任何有用的信息,因为大部分帮助都假定你已经对这个库有一些基本的了解。
我感觉视频教程向我展示了如何正确设置项目,有效地让我入门,然后就假定我知道如何游泳,把我留在了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>
1个回答

23
如果你想将自己的 javax.swing 游戏移植到 libgdx,那么你必须知道如何制作游戏。你是否分离了逻辑和视图?如果是,那么只需要重写视图即可。如果没有,最好从头开始。
首先要知道的基础知识:您的游戏入口是 ApplicationListener 接口。如果您不需要其中的每个方法,请扩展 Game,它会提供一些默认行为。所以我建议使用它。现在,GameApplicationListener 能让您有可能对某些应用程序事件做出反应:
  1. create():当您的应用程序启动时调用。
  2. dispose():当游戏关闭时调用(非崩溃:P)。
  3. pause():在 Android 上,当电话呼入/按下主页按钮时调用。在桌面上,当您最小化窗口/游戏失去焦点时调用。
  4. resume():在暂停状态下回来时调用。
  5. resize():当您调整窗口大小并且在 Android 上旋转屏幕时调用(必须在清单文件中允许)。
  6. render():每个游戏循环调用一次(如果启用),用于更新游戏中的对象,然后将它们绘制到屏幕上。

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

屏幕?那是什么? 想象一下普通的游戏。您开始它,它显示一个菜单,带有一些按钮,如“开始游戏”,“设置”...这就是菜单屏幕。因此,Screen 是您游戏的不同逻辑和视图的部分,因此它们必须位于单独的类中。 Screen 实现了 Screen 接口,该接口再次提供了一些有用的方法:

  1. show():当您使用 MyGdxGame.setScreen() 将此 Screen 设置为 GameScreen 时调用。
  2. hide():当另一个 Screen 被设置为 GameScreen 时调用。

因此,如果当前的 ScreenMenuScreen,并且我按下 Play Game 按钮,则会调用 PlayScreenshow()MenuScreenhide()
Screen 还具有 pause()resume()resize() 方法,在调用 Game 中的相同方法时调用(始终仅针对当前屏幕)。如果您实现了 ApplicationListener,则必须自己编写此默认行为。请注意,dispose() 不会自动调用 Screen

接下来是绘图。要在 2D 中绘制,有以下两种方法:

  1. ShapeRenderer,大多数
    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的博客

这个答案一点也不复杂,我完全明白你的意思。非常感谢,我很喜欢你简单易懂的解释,我的座右铭是K.I.S.S.(保持愚蠢简单)。我也很感激你提供的教程链接,这对我帮助很大。我会仔细阅读一切,并在有问题时与你联系。我想给你点赞,但我还没有足够的声望。无论如何,非常感谢,继续保持良好的业力! - KLD
2
如果在清单文件中设置 Activity 允许旋转屏幕,当 Android 屏幕旋转时也会调用 resize() 方法。 - Tenfour04
@cortelldavis 我很高兴我能帮到你。当我刚开始学习时,我也喜欢那些教程。所以我想分享我的知识,即使我还是新手,还没有完成一个游戏 xD我想听听你的进展情况,这比点赞更有价值(在我看来)。如果你有更多问题,请随时问。SO是一个伟大的社区,大多数人都在这里帮助别人 (: - Robert P
@cortelldavis 你看过教程的第一部分吗?那里展示了如何设置项目。在Eclipse中,您必须确保Assets文件夹是源文件夹,并在“排序和导出”列表中。此外,“DesktopProject”将“AndroidProject”作为依赖项,因为Assets位于Android项目中。确保所有这些都完成。看看教程的第一部分,他们会展示如何操作。 - Robert P
@cortelldavis 一个非常重要的通知:在StarAssault项目中,由于某些原因,他们使用 ppuXppuY。这是相机应该为您完成的工作,因此有点误导。建议搜索一些相机教程会更好。 - Robert P
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接