如何使用libgdx编写一个简单的游戏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用libgdx编写一个简单的游戏相关的知识,希望对你有一定的参考价值。

参考技术A 本篇文章主要讲述基本内容的编写,包括显示人物、怪兽和飞镖。

最终效果如下图:

01_thumb1

获取libgdx
你可以从libgdx的 官网 下载打包好的代码,我下载的是0.98版本。

02_thumb4

当然,你也可以从git代码仓库获取最新的版本的,或者你习惯使用的以前版本,比如0.97。

创建项目
libgdx项目的创建可以有多种方式,我推荐使用setup-ui。方便易用还可以省去很多麻烦,特别是ADT升级以后的ClassNotFound问题。

如果是下载打包好的,那么就默认包含了gdx-setup-ui,双击就可以打开。

03_thumb1

填写一些基本信息,然后选中你下载的0.98.zip那个压缩文件。这里我只生成一个桌面项目和android项目。

桌面项目是方便调试,而Android项目是最后发布的。在整个开发中我始终用桌面项目调试,因为速度快,容易排错。同时周期性的在Android真机上测试。

04_thumb1

点击生成项目,然后在Eclipse中导入。

05_thumb1

一般导入进去以后Android项目会有一些问题,修改project.properties文件和AndroidManifest.xml配置文件。

运行效果如下:

06_thumb1

准备工作
本例子中用到的图片如下:

Player_thumb Projectile_thumb Target_thumb

用gdx-texturepacker打包成一张大图。

07_thumb1

我整个例子都是用的是Stage模式。所以它的坐标原点在左下角,如果是一般用Spirte直接绘制,那么原点在右上角。

首先将打包好的图册复制到assets中新建的pack文件夹。

然后我们开始动工了,首先删除setup-ui生成的多余代码,整理DartsShaSha.java文件如下:

package com.cnblogs.htynkn;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.scenes.scene2d.Stage;

public class DartsShaSha extends ApplicationAdapter
Stage stage;
@Override
public void create()
stage = new Stage(480, 320, true);


@Override
public void dispose()
stage.dispose();


@Override
public void render()
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
stage.act();
stage.draw();


这时候运行效果是一个白茫茫的画面。

09_thumb1

注意一下这句

stage = new Stage(480, 320, true);
因为我希望屏幕的自适应有Stage自动完成,所以坐标基本可以写死。

先不着急开工,我们先添加一个现实FPS的标签。我希望这个标签显示在屏幕右下角。

在create方法中添加

LabelStyle labelStyle = new LabelStyle(new BitmapFont(), Color.BLACK); //创建一个Label样式,使用默认黑色字体
Label label = new Label("FPS:", labelStyle); //创建标签,显示的文字是FPS:
label.setName("fpsLabel"); //设置标签名称为fpsLabel
label.setY(0); //设置Y为0,即显示在最下面
label.setX(480 - label.getTextBounds().width); //设置X值,显示为最后一个字紧靠屏幕最右侧
stage.addActor(label); //将标签添加到舞台

在render方法中更新fps的值

Label label = (Label) stage. www.hbbz08.com getRoot().findActor("fpsLabel"); //获取名为fpsLabel的标签
label.setText("FPS:" + Gdx.graphics.getFramesPerSecond());
label.setX(480 - label.getTextBounds().width); //更新X值以保证显示位置正确性

效果如下:

10_thumb1

添加忍者
现在来添加我们的主角,我希望主角显示在屏幕左侧中央。所以它的x值必然是0,但是它的y值并不是320的一半,而是160减去图片高度的一半。

因为我们指定的x、y值其实相对图片的左下角的。所以要补上多余或者不足的部分。

主角其实就是一张图片,并没有太多特别的效果,所以我使用Image类。

首先获取图册

TextureAtlas atlas = new TextureAtlas("pack/default.pack");

在从图册中获取Player.png并创建Image对象。

Image man = new Image(atlas.findRegion("Player")); //获取图册中的Player.png并创建image对象
man.setX(0);
man.setY(160 - man.getHeight() / 2); //设置Y值,以让图片在中间显示
stage.addActor(man); //将主角添加到舞台
效果如下:

11_thumb1

添加怪兽
然后我们来添加几只怪兽。怪兽应该是随机从屏幕右侧出现,并直线移动到屏幕左侧。

同时我们还要检测怪兽的生命值什么的,或者其他效果,所以为了方便处理,我们专门建立一个Group来管理怪兽。

新建类TargetGroup,并集成Group类。

package com.cnblogs.htynkn;

import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.ui.Image;

public class TargetGroup extends Group
public TargetGroup(AtlasRegion region)
super();


因为还需要传入怪兽的图片,所以我们的创建方法保留参数AtlasRegion region。

怪兽的Y值因为是随机的,但是又不能超出屏幕。所以用随机数来生成。libgdx的MathUtils提供了相关方法。

int minY = 0;
int maxY = (int) (320 - region.getRegionHeight());

如何从菜单切换到3D FPS设置? (libGDX)

我正在练习和编写一个简单的菜单,只需按一下按钮即可切换到主游戏。

主游戏采用3D格式,使用libGDX用于创建3D环境的所有功能。菜单使用Stage构建。我分别构建了Menu和Render / FirstPerson类,以确保它们自己工作,并且确实完成了它们。

package com.mygdx.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.mygdx.game.FPSSystem;
import com.mygdx.game.RenderingSystem;

public class MainCoreLoop extends ApplicationAdapter {

    public MenuSystem menuSystem;
    public RenderingSystem renderingSystem;
    public FPSSystem fpsSystem;

    public boolean isGameOn;

    @Override
    public void create () {
        renderingSystem = new RenderingSystem();
        fpsSystem = new FPSSystem();
        menuSystem = new MenuSystem();

        renderingSystem.create();
        fpsSystem.create();
        menuSystem.create();
    }


    @Override
    public void render () {
        isGameOn = true;

        if (MenuSystem.isMenuClosed == true) {
            isGameOn = true;
        }

        else if(isGameOn == false) {
            Gdx.gl.glClearColor(0, 255, 0, 0);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


            menuSystem.render();
        }

        if(isGameOn == true) { 
            Gdx.gl.glClearColor(255, 0, 0, 0);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT);

            fpsSystem.render();
            renderingSystem.render();


            }

    }

    @Override
    public void dispose() {
        menuSystem.dispose();
        fpsSystem.dispose();
        renderingSystem.dispose();

    }

}

我有一个处理渲染的RenderingSystem类,一个FirstPersonSystem类初始化另一个类FPSCameraController类,它控制逻辑和输入,代码借用了libGDX附带的FirstPersonCameraController类。

所以我可以一起测试这些类,我使用了一个名为isGameOn的布尔值,它运行得很好。经过一段时间的测试和重构,我设法让一切工作除了输入。按下“新游戏”后,3D框会完美呈现,但输入不起作用。如果我将布尔值更改为true,它将呈现框但仍然没有输入。

代码似乎独立工作,但试图将它们组合在一起对我来说有点棘手。

我认为这可能是一个代码顺序问题,但我很难过。我是libGDX的新手,而且我过去一直都在认真地工作过Java,所以我的代码基础可能会阻止我搞清楚这一点。

其余代码在github Here

任何帮助洞察力/侮辱将非常感激。谢谢!

答案

answered one problem关于在LibGdx中使用GameScreen类来使切换更好,这可能对你的情况有所帮助。

该片段的Game/Screen tutorial使用Gdx.input.方法进行鼠标,键盘和触摸事件。

其余的应该是相当简单的。

以上是关于如何使用libgdx编写一个简单的游戏的主要内容,如果未能解决你的问题,请参考以下文章

如何从菜单切换到3D FPS设置? (libGDX)

如何将脚本实现到 LibGDX 中?

如何将 Libgdx 游戏部署到 iOS

如何通过 LibGdx 使用 Google Play 游戏服务

LibGDX:安卓游戏安全

在 Libgdx 中使用 SQLite 数据库