了解libgdx


问题内容

我了解这是一个框架;甚至还有一个开源的跨平台游戏开发库。我转到libgdx主页,并按照视频教程中的说明进行操作。正确设置项目后,我可以在多个受支持的平台上运行默认的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>

问题答案:

如果要将javax.swing游戏移植到libgdx,则必须知道如何制作游戏。您将逻辑和视图分开了吗?如果是,那么您只需重写视图即可。如果不是,那么,最好从头开始。首先要了解的知识:游戏的入口点是ApplicationListener接口。如果您不需要其中的所有方法,都可以使用extend
Game,这会给您带来一些好处。所以我建议使用它。的GameApplicationListener现在为您提供了可能性,对一些应用程序的事件做出反应:

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

类中的默认render()实现Game调用current的render Screen

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

  1. show():叫,当此项设定ScreenGame小号ScreenMyGdxGame.setScreen()
  2. hide():在将另一个Screen设置为Games 时调用Screen

因此,如果当前ScreenMenuScreen和我按下Play Game按钮,show()PlayScreen被调用,hide()对于MenuScreen被调用。该Screen也有方法pause()resume()并且resize(),这是所谓的如果同样的方法Game被称为(总是只对当前屏幕)。如果实现ApplicationListener,则必须自己编写此默认行为。
请注意,dispose()对于Screen不会自动调用。

接下来是图纸。对于2D绘图,有:

  1. ShapeRenderer,大多数时间仅用于调试。它可以渲染简单的形状,例如圆形,正方形…
  2. SpriteBatch,用于呈现Texture小号Sprite小号…

因此,大多数情况下,您将使用渲染SpriteBatch。您在由以下内容制成的块中进行渲染:

  1. SpriteBatch.begin(),启动SpriteBatch。在此呼叫之前设置他的viewPort,矩阵…
  2. SpriteBatch.draw(),将您提供给它的东西作为参数(有很多不同的draw()方法,请参阅API)绘制到缓冲区,并在缓冲区flush()已满或被SpriteBatch.end()调用时立即将它们绘制到GPU 。
  3. SpriteBatch.end()flush()即GPU的缓冲区,因此所有内容均绘制在屏幕上。

笔记:

  1. 切勿一次拥有2个SpriteBatch begin。因此,在begin()end()另一个正在运行的SpriteBatch 进行SpriteBatch调用之前
  2. 如果可能,请仅使用1个SpriteBatch并尝试在end()每个渲染循环中仅调用一次,因为这样做会降低性能。
  3. 不要draw()在begin-end块之外调用。

最后但并非最不重要的是,此“教程”:The
camera。它可以帮助您以自己的世界单位而不是像素来计算运动。您也可以通过移动它来显示游戏世界的不同部分。首先:在construcotr中设置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. 星球大战
  2. Steigert的博客