了解libgdx

时间:2014-03-10 08:32:50

标签: java android libgdx

我知道这是一个框架;更是一个开源的跨平台游戏开发库。我去了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>

1 个答案:

答案 0 :(得分:21)

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

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

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

    1. show():当您使用Screen将此Game设置为Screen s MyGdxGame.setScreen()时,系统已调用。
    2. hide():当另一个Screen设置为Game s Screen时,系统会调用。
    3. 因此,如果当前ScreenMenuScreen而我按下Play Game按钮,show()会调用PlayScreenhide()调用MenuScreenScreen还有方法pause()resume()resize(),如果调用Game中的相同方法,则会调用这些方法(始终仅用于当前屏幕) )。如果您实施ApplicationListener,则必须自己编写此默认行为 请注意,dispose()的{​​{1}}不会自动调用。

      接下来是绘图。对于2d中的绘图,有:

      1. Screen,大部分时间仅用于调试。它可以渲染简单的形状,如圆形,方形......
      2. ShapeRenderer,用于呈现SpriteBatch s Texture s ...
      3. 所以大多数时候你会使用Sprite进行渲染。您在以下块中渲染:

        1. SpriteBatch,启动SpriteBatch。在此调用之前设置他的viewPort,Matrices ......
        2. SpriteBatch.begin(),将你给它的东西作为参数绘制(有许多不同的draw()方法,看一下API)到一个缓冲区,然后SpriteBatch.draw()将它们一起渲染到GPU已满或已调用flush()
        3. SpriteBatch.end()SpriteBatch.end()缓冲区到GPU,所以一切都在屏幕上绘制。
        4. 注意:

          1. 永远不要在flush()状态下拥有2个SpriteBatches。所以在begin在另一个正在运行的SpriteBatch上调用begin()之前调用{{1}
          2. 如果可能的话,只使用1个SpriteBatch并尝试每个渲染循环只调用一次end(),因为它会花费一些性能。
          3. 请勿在开始端块之外调用end()
          4. 最后但并非最不重要的是这个“教程”: draw()camera。它可以帮助您计算您的动作...在您自己的世界中而不是像素。此外,您可以通过移动它来使用它来显示游戏世界的不同部分。 首先:在construcotr中设置你的camerasviewport:

            camera = new OrthographicCamera(16, 9);
            

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

            `SpriteBatch.setProjectionMatrix(cam.combined)`
            

            通过执行此操作,SpriteBatch会呈现您的相机正在查看的内容。 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