了解libgdx

KLD*_*KLD 6 java android 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>
Run Code Online (Sandbox Code Playgroud)

Spr*_*bua 21

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

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

Game类calles中的默认render()实现呈现当前Screen.

屏幕?那是什么?好好想想一场正常比赛吧.你启动它,它showes菜单,与像一些按钮Start Game,Settings...这是菜单画面.所以Screen你的游戏中有不同的逻辑和视图,所以他们必须在sepparate类.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,Matrices ....
  2. SpriteBatch.draw(),绘制你给它作为参数的东西(有许多不同的draw()方法,查看API)到一个缓冲区,并在flush()它们满或被SpriteBatch.end()调用时立即到GPU .
  3. SpriteBatch.end(),flush()GPU的缓冲区,所以一切都在屏幕上绘制.

笔记:

  1. 一次不要在他们的begin状态中有2个SpriteBatches .所以在begin()end()另一个正在运行的SpriteBatch 进行SpriteBatch调用之前
  2. 如果可能的话,只使用1个SpriteBatch并尝试end()每个渲染循环只调用一次,因为它会花费一些性能.
  3. 不要draw()在开始端块之外调用.

最后但并非最不重要的是这个"教程":The camera.它可以帮助您计算您的动作...在您自己的世界中而不是像素.此外,您可以通过移动它来使用它来显示游戏世界的不同部分.首先:在construcotr中设置你的camerasviewport:

camera = new OrthographicCamera(16, 9);
Run Code Online (Sandbox Code Playgroud)

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

`SpriteBatch.setProjectionMatrix(cam.combined)`
Run Code Online (Sandbox Code Playgroud)

通过这样做,SpriteBatch渲染你的相机正在看的东西.0点指向的摄像头处于中间位置.所以现在在中间画一些东西:

batch.draw(yourTexture, 0, 0);
Run Code Online (Sandbox Code Playgroud)

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

 batch.draw(yourTexture, 16 / 2, 9 / 2);
Run Code Online (Sandbox Code Playgroud)

要移动相机使用:

cam.translate(16/2, 9/2);
Run Code Online (Sandbox Code Playgroud)

确保cam.update()在改变位置后打电话!

现在你相机的右上角是16,9而不是16/2,9/2.而0,0点是左下角.

我希望这不是开头的复杂.一些教程,帮助我学习:

  1. StarAssault
  2. Steigert的博客

  • 如果在清单中将Activity设置为允许,则在屏幕旋转时也会在Android上调用`resize()`. (2认同)