我了解这是一个框架;甚至还有一个开源的跨平台游戏开发库。我转到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的缓冲区,因此所有内容均绘制在屏幕上。笔记:
begin
。因此,在begin()
对end()
另一个正在运行的SpriteBatch 进行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点是左下角。
我希望这从一开始就不会太复杂。一些教程,帮助我学习了:
问题内容: 我不太清楚该在哪里抛出该异常。 例如,我正在实现接口,并且不希望任何人调用该方法: 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 文章,但并没