当前位置: 首页 > 面试题库 >

了解libgdx

钱志强
2023-03-14
问题内容

我了解这是一个框架;甚至还有一个开源的跨平台游戏开发库。我转到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的博客


 类似资料:
  • 问题内容: 我不太清楚该在哪里抛出该异常。 例如,我正在实现接口,并且不希望任何人调用该方法: Future#get(long,TimeUnit)。 所以,我可以扔吗? 事情是方法的规范并没有说明抛出异常。反过来,例外 抛出以指示不支持请求的操作。 类UnsupportedOperationException 我的意思是,如果您不希望调用它,通常会抛出它,否则可能会因为不是所有方法都已实现而被认为

  • 问题内容: 我试图了解Go中的并发性。特别是,我编写了以下线程不安全程序: 我认识到我应该使用渠道来防止与发生竞争,但这不是重点。程序打印,然后似乎永远循环(不再打印任何内容)。我希望它能打印出无限的数字列表,可能由于竞态条件而跳过某些数字并重复其他数字(或更糟的是,在更新数字时打印数字)。 我的问题是:为什么程序只打印一行? 只是要清楚一点:对于这个玩具示例,我不是故意使用渠道。 问题答案: 关

  • 问题内容: JNDI就像是类固醇的地图,对吗?我使用键来查找对对象的引用。另外,什么是InitialContext?我似乎不知道这个主意。 问题答案: 从概念上讲,JNDI就像类固醇。 允许您从命令行将参数传递给代码。同样,JNDI允许您在代码外部(例如,在应用程序服务器配置文件中)配置任意对象,然后在代码中使用它们。 换句话说,它是Service Locator模式 的实现:您的代码从中心注册表

  • 问题内容: 我正在尝试使用触发两个请求,然后在两个请求完成后调用一些函数。这是我的代码: 但是,这没有按预期方式工作。Ajax调用将返回要在其中使用的数据,而Ajax调用将返回要分配给var count并随后在中使用的count 。 但是,当我启动上面的代码时,先被调用,然后再将数据保留为as 。我如何才能做到这一点,据我所知,只有当两个返回的函数都执行时,才能进行。我希望两个ajax调用都应该并

  • 问题内容: 我遇到了“ 高级Linux编程”中的 一个概念。这里是一个链接:请参阅 4.5 GNU / Linux线程实现 。 我对作者所说的概念很清楚,但是我对他解释的为线程打印processID的程序感到困惑。 这是代码 根据作者,上述代码的输出为 我编译时得到的输出是 我知道,创建线程时,Linux内部调用 clone (大多数情况下),就像 fork 系统调用创建进程一样。唯一的区别是在进

  • 问题内容: 我终于升级了python版本,并发现了新功能。除其他外,我正在为新方法scratch之以鼻。从文档: 只要包含类被子类化,就会调用此方法。那么cls是新的子类。如果定义为普通实例方法,则此方法将隐式转换为类方法。 因此,按照文档中的示例,我开始进行一些操作: 产生以下输出: 我知道在子类定义 之后 会调用此方法,但是我的问题特别是关于此功能的用法。我也阅读了PEP 487 文章,但并没