了解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
,这会给您带来一些好处。所以我建议使用它。的Game
或ApplicationListener
现在为您提供了可能性,对一些应用程序的事件做出反应:
create()
:在您的应用启动时调用dispose()
:在游戏关闭时调用(未崩溃:P)pause()
:在android上调用,当按下“来电” /“归属”按钮时。在桌面上,当您最小化窗口时/游戏失去焦点时。resume()
:在暂停状态后返回时调用。resize()
:当您调整窗口大小并在android上,当屏幕旋转时调用(必须在清单文件中允许它)render()
:称为每个游戏循环(如果启用),用于更新游戏中的对象,然后将其绘制到屏幕上。
类中的默认render()实现Game
调用current的render Screen
。
屏幕?那是什么?好吧,考虑一个正常的游戏。你启动它,它showes菜单,有一些按键喜欢Start Game
,Settings
…这是菜单画面。所以Screen
s是游戏中具有不同逻辑和视图的部分,因此它们必须位于单独的类中。Screen
实现Screen
接口,它再次为您提供了一些有用的方法:
show()
:叫,当此项设定Screen
为Game
小号Screen
带MyGdxGame.setScreen()
。hide()
:在将另一个Screen
设置为Game
s 时调用Screen
。
因此,如果当前Screen
是MenuScreen
和我按下Play Game
按钮,show()
为PlayScreen
被调用,hide()
对于MenuScreen
被调用。该Screen
也有方法pause()
,resume()
并且resize()
,这是所谓的如果同样的方法Game
被称为(总是只对当前屏幕)。如果实现ApplicationListener
,则必须自己编写此默认行为。
请注意,dispose()
对于Screen
不会自动调用。
接下来是图纸。对于2D绘图,有:
ShapeRenderer
,大多数时间仅用于调试。它可以渲染简单的形状,例如圆形,正方形…SpriteBatch
,用于呈现Texture
小号Sprite
小号…
因此,大多数情况下,您将使用渲染SpriteBatch
。您在由以下内容制成的块中进行渲染:
SpriteBatch.begin()
,启动SpriteBatch。在此呼叫之前设置他的viewPort,矩阵…SpriteBatch.draw()
,将您提供给它的东西作为参数(有很多不同的draw()方法,请参阅API)绘制到缓冲区,并在缓冲区flush()
已满或被SpriteBatch.end()
调用时立即将它们绘制到GPU 。SpriteBatch.end()
,flush()
即GPU的缓冲区,因此所有内容均绘制在屏幕上。
笔记:
- 切勿一次拥有2个SpriteBatch
begin
。因此,在begin()
对end()
另一个正在运行的SpriteBatch 进行SpriteBatch调用之前 - 如果可能,请仅使用1个SpriteBatch并尝试在
end()
每个渲染循环中仅调用一次,因为这样做会降低性能。 - 不要
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点是左下角。
我希望这从一开始就不会太复杂。一些教程,帮助我学习了: