【libGDX】初识libGDX
1 前言
libGDX 是一个开源且跨平台的 Java 游戏开发框架,于 2010 年 3 月 11 日推出 0.1 版本,它通过 OpenGL ES 2.0/3.0 渲染图像,支持 Windows、Linux、macOS、Android、iOS、Web 等平台,提供了统一的 API,用户只需要写一套代码就可以在多个平台上运行,官方介绍见 → Features。
libGDX 相关链接如下:
- libGDX 官网:https://libgdx.com
- libGDX 官方文档:https://libgdx.com/dev
- libGDX 启动简介:https://libgdx.com/wiki/start/setup
- libGDX 工具下载:https://libgdx.com/dev/tools
- libGDX GitHub:https://github.com/libgdx/libgdx
2 libGDX 环境搭建
1)下载 gdx-setup
官方下载链接:gdx-setup.jar,如果网速较慢,用户也可以从这里下载:libGDX全套工具包。
2)生成项目
双击 gdx-setup.jar 文件,填写 Project name、Package name、Game Class、Output folder、Android SDK、Supported Platforms 等信息,点击 Generate 生成项目。官方介绍见 → Generate a Project。

注意:JDK 最低版为 11,见官方说明 → Set Up a Dev Environment。
3)打开项目
使用 Android Studio 打开生成的 Drop 项目,等待自动下载依赖,项目结构如下。

注意:如果选择了 Android 启动,需要在 gradle.properties 文件中添加 AndroidX 支持,如下。
android.useAndroidX=true
DesktopLauncher.java
package com.zhyan8.drop;import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration;public class DesktopLauncher {public static void main (String[] arg) {Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();config.setForegroundFPS(60);config.setTitle("Drop");new Lwjgl3Application(new Drop(), config);}
}
AndroidLauncher.java
package com.zhyan8.drop;import android.os.Bundle;import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;public class AndroidLauncher extends AndroidApplication {@Overrideprotected void onCreate (Bundle savedInstanceState) {super.onCreate(savedInstanceState);AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();initialize(new Drop(), config);}
}
Drop.java
package com.zhyan8.drop;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.ScreenUtils;public class Drop extends ApplicationAdapter {SpriteBatch batch;Texture img;@Overridepublic void create () {batch = new SpriteBatch();img = new Texture("badlogic.jpg");}@Overridepublic void render () {ScreenUtils.clear(1, 0, 0, 1);batch.begin();batch.draw(img, 0, 0);batch.end();}@Overridepublic void dispose () {batch.dispose();img.dispose();}
}
4)运行项目(点击操作)
Desktop:

Android:
![]()
运行效果如下。

5)运行项目(通过命令)
可以通过在 Terminal 中运行以下命令来运行项目,见官方介绍 → Importing & Running。
Desktop:
./gradlew desktop:run
Android:
./gradlew android:installDebug android:run
iOS:
./gradlew ios:launchIPhoneSimulator
HTML:
./gradlew html:superDev
3 libGDX 官方案例
官方接水游戏见 → A Simple Game。
在第二节的基础上,修改 Drop.java,如下。
Drop.java
package com.zhyan8.drop;import java.util.Iterator;import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.TimeUtils;public class Drop extends ApplicationAdapter {private Texture dropImage;private Texture bucketImage;private Sound dropSound;private Music rainMusic;private SpriteBatch batch;private OrthographicCamera camera;private Rectangle bucket;private Array<Rectangle> raindrops;private long lastDropTime;@Overridepublic void create() {// load the images for the droplet and the bucket, 64x64 pixels eachdropImage = new Texture(Gdx.files.internal("droplet.png"));bucketImage = new Texture(Gdx.files.internal("bucket.png"));// load the drop sound effect and the rain background "music"dropSound = Gdx.audio.newSound(Gdx.files.internal("drop.mp3"));rainMusic = Gdx.audio.newMusic(Gdx.files.internal("rain.mp3"));// start the playback of the background music immediatelyrainMusic.setLooping(true);rainMusic.play();// create the camera and the SpriteBatchcamera = new OrthographicCamera();camera.setToOrtho(false, 800, 480);batch = new SpriteBatch();// create a Rectangle to logically represent the bucketbucket = new Rectangle();bucket.x = 800 / 2 - 64 / 2; // center the bucket horizontallybucket.y = 20; // bottom left corner of the bucket is 20 pixels above the bottom screen edgebucket.width = 64;bucket.height = 64;// create the raindrops array and spawn the first raindropraindrops = new Array<Rectangle>();spawnRaindrop();}private void spawnRaindrop() {Rectangle raindrop = new Rectangle();raindrop.x = MathUtils.random(0, 800-64);raindrop.y = 480;raindrop.width = 64;raindrop.height = 64;raindrops.add(raindrop);lastDropTime = TimeUtils.nanoTime();}@Overridepublic void render() {// clear the screen with a dark blue color. The// arguments to clear are the red, green// blue and alpha component in the range [0,1]// of the color to be used to clear the screen.ScreenUtils.clear(0, 0, 0.2f, 1);// tell the camera to update its matrices.camera.update();// tell the SpriteBatch to render in the// coordinate system specified by the camera.batch.setProjectionMatrix(camera.combined);// begin a new batch and draw the bucket and// all dropsbatch.begin();batch.draw(bucketImage, bucket.x, bucket.y);for(Rectangle raindrop: raindrops) {batch.draw(dropImage, raindrop.x, raindrop.y);}batch.end();// process user inputif(Gdx.input.isTouched()) {Vector3 touchPos = new Vector3();touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);camera.unproject(touchPos);bucket.x = touchPos.x - 64 / 2;}if(Gdx.input.isKeyPressed(Keys.LEFT)) bucket.x -= 200 * Gdx.graphics.getDeltaTime();if(Gdx.input.isKeyPressed(Keys.RIGHT)) bucket.x += 200 * Gdx.graphics.getDeltaTime();// make sure the bucket stays within the screen boundsif(bucket.x < 0) bucket.x = 0;if(bucket.x > 800 - 64) bucket.x = 800 - 64;// check if we need to create a new raindropif(TimeUtils.nanoTime() - lastDropTime > 1000000000) spawnRaindrop();// move the raindrops, remove any that are beneath the bottom edge of// the screen or that hit the bucket. In the latter case we play back// a sound effect as well.for (Iterator<Rectangle> iter = raindrops.iterator(); iter.hasNext(); ) {Rectangle raindrop = iter.next();raindrop.y -= 200 * Gdx.graphics.getDeltaTime();if(raindrop.y + 64 < 0) iter.remove();if(raindrop.overlaps(bucket)) {dropSound.play();iter.remove();}}}@Overridepublic void dispose() {// dispose of all the native resourcesdropImage.dispose();bucketImage.dispose();dropSound.dispose();rainMusic.dispose();batch.dispose();}
}
音频和图片资源放在 assets 目录下面,如下。

Desktop 运行效果如下:

Android 运行效果如下:

相关文章:
【libGDX】初识libGDX
1 前言 libGDX 是一个开源且跨平台的 Java 游戏开发框架,于 2010 年 3 月 11 日推出 0.1 版本,它通过 OpenGL ES 2.0/3.0 渲染图像,支持 Windows、Linux、macOS、Android、iOS、Web 等平台,提供了统一的 API,用户只需要…...
VIVADO+FPGA调试记录
vivadoFPGA调试记录 vitis编译vivado导出的硬件平台,提示xxxx.h file cant find vitis编译vivado导出的硬件平台,提示’xxxx.h file cant find’ 此硬件平台中,包含有AXI接口类型的ip。在vitis编译硬件平台时,经常会报错…...
Android——Gradle插件gradle-wrapper.properties
一、Android Studio版本,Android Gradle插件版本,Gradle版本 Android Studio 通过Android Gradle插件 使用 Gradle来构建代码; Android Studio每次升级后, Android Gradle 插件自动更新,对应的Gradle版本也会变动&…...
iOS应用加固方案解析:ipa加固安全技术全面评测
在移动应用开发领域,iOS应用的安全性一直备受关注。ipaguard作为一款专业的iOS应用加固方案,采用混淆加密技术,旨在保护应用免受破解、逆向和篡改等风险。本文将深入探讨ipaguard的产品功能、安全技术及其在iOS应用加固领域中的核心优势和特色…...
过滤器模式 rust和java的实现
文章目录 过滤器模式实现 过滤器模式实现javarustjavarust rust代码仓库 过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象&…...
Feature Pyramid Networks for Object Detection(2017.4)
文章目录 Abstract1. Introduction3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 7. Conclusion FPN Abstract 特征金字塔是识别系统中检测不同尺度物体的基本组成部分。但最近的深度学习对象检测器避免了金字塔表示,部分…...
Python3基础模块 random
Python3基础模块 random import random #作用:生成随机数使用dir(module)查看模块内容 >>> import random >>> dir(random) [BPF, LOG4, NV_MAGICCONST, RECIP_BPF, Random, SG_MAGICCONST, SystemRandom, TWOPI, _BuiltinMethodType, _MethodT…...
ubuntu安装pgsql16
ubuntu安装postgresSQL 官网地址: https://www.postgresql.org/download/ 1.安装 # 添加源 sudo sh -c echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list # 安装数字签名 w…...
数据管理70个名词解析
数据标准化70个名词解析 1、数据 是指任何以电子或者其他方式对信息的记录。在计算机科学技术中,“数据”是客观事物的符号表示,指所有可被输入到计算机中并可被计算机程序处理的符号的总称;在管理科学技术中,“数据”是描述事件或事物的属性…...
线性代数本质系列(二)矩阵乘法与复合线性变换,行列式,三维空间线性变换
本系列文章将从下面不同角度解析线性代数的本质,本文是本系列第二篇 向量究竟是什么? 向量的线性组合,基与线性相关 矩阵与线性相关 矩阵乘法与复合线性变换 三维空间中的线性变换 行列式 逆矩阵,列空间,秩与零空间 克…...
Linux-CentOS重要模块
软件包管理器:CentOS使用Yum(Yellowdog Updater, Modified)作为其包管理器。Yum提供了一种方便的方式来安装、更新和删除软件包,并自动解决依赖关系。 RPM:RPM(RPM Package Manager)是CentOS中…...
posix定时器的使用
POSIX定时器是基于POSIX标准定义的一组函数,用于实现在Linux系统中创建和管理定时器。POSIX定时器提供了一种相对较高的精度,可用于实现毫秒级别的定时功能。 POSIX定时器的主要函数包括: timer_create():用于创建一个定时器对象…...
安科瑞煤矿电力监控系统的研究与应用
摘要:作为一个巨大的能源消耗国家,我国每年对煤炭的市场需求巨大。煤炭作为我国点力气和供暖企业的重要原材料,煤矿的开采过程存在着难以消除的风险,我国的煤炭安全问题长期困扰着相关企业和监督部门,也受到社会的广泛…...
高教社杯数模竞赛特辑论文篇-2023年A题:基于机理分析法的定日镜场优化设计模型(附获奖论文及MATLAB代码实现)
目录 摘要 一、 问题重述 1 . 1 问题背景 1 . 2 问题要求 二、 问题分析...
缩点+图论路径网络流:1114T4
http://cplusoj.com/d/senior/p/SS231114D 重新梳理一下题目 我们先建图 x → y x\to y x→y,然后对点分类:原串出现点,原串未出现点。 假如我们对一个原串出现点进行了操作,那么它剩余所有出边我们立刻去操作必然没有影响。所…...
Go语言fyne开发桌面应用程序-环境安装
环境安装 参考https://developer.fyne.io/started/#prerequisites网站 之前的文章介绍了如何安装GO语言这里不在叙述 msys2 首先安装msys2,https://www.msys2.org/ 开始菜单打开MSYS2 执行 $ pacman -Syu$ pacman -S git mingw-w64-x86_64-toolchain注意&#…...
JavaWeb——CSS3的使用
目录 1. CSS概述 2. CSS引入方式 3. CSS颜色显示 4. CSS选择器 4.1. 元素(标签)选择器 4.2. id选择器 4.3. 类选择器 4.4. 三者优先级 5. 盒子模型 1. CSS概述 CSS,全称为“Cascading Style Sheets”,中文译为“层叠样式…...
AR导览小程序开发方案
一、背景介绍 随着科技的不断发展,虚拟现实(VR)和增强现实(AR)技术逐渐被应用于各个领域。其中,AR导览小程序作为一种新兴的导览方式,以其独特的视觉体验和互动性受到了广泛的关注。AR导览小程…...
继承、多态
复习 需求: 编写一个抽象类:职员Employee,其中定义showSalary(int s)抽象方法;编写Employee的子类,分别是销售员Sales和经理Manager,分别在子类中实现对父类抽象方法的重写,并编写测试类Test查看输出结果 package cn.…...
贪吃蛇小游戏代码
框架区 package 结果;import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.util.ArrayList; import java.util.List; import java.util.Random;import javax.s…...
2025届必备的六大AI辅助写作神器解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 处于人工智能技术基础之上的智能辅助系统,是可给学术研究者送去高效、规范的开题…...
别再只盯着数据了!用Arduino+GP2Y1014AU传感器,手把手教你做个能“看见”空气的PM2.5监测仪
用Arduino打造智能PM2.5监测仪:从硬件连接到可视化交互 在空气质量日益受到关注的今天,拥有一个实时监测PM2.5浓度的设备不仅能提升生活品质,还能为健康保驾护航。不同于市面上千篇一律的商用监测仪,自己动手打造一个兼具实用性和…...
为什么需要虚拟摄像头?OBS-VirtualCam 3大核心价值解析
为什么需要虚拟摄像头?OBS-VirtualCam 3大核心价值解析 【免费下载链接】obs-virtual-cam obs-studio plugin to simulate a directshow webcam 项目地址: https://gitcode.com/gh_mirrors/ob/obs-virtual-cam 在视频会议和在线教学中,你是否曾希…...
矩阵理论进阶:内积空间与正交变换的深度解析
1. 内积空间:从几何直觉到严格定义 第一次接触内积空间时,很多人会被各种抽象定义搞得晕头转向。其实我们可以从最熟悉的二维平面开始理解——当你计算两个向量的点积时,本质上是在测量它们的"相似程度"。这种几何直觉正是内积空间…...
Inconsolata字体高效使用实战指南:提升编程体验的专业字体方案
Inconsolata字体高效使用实战指南:提升编程体验的专业字体方案 【免费下载链接】Inconsolata Development repo of Inconsolata Fonts by Raph Levien 项目地址: https://gitcode.com/gh_mirrors/in/Inconsolata 作为开发者,我们每天与代码打交道…...
Seelen-UI终极指南:5分钟打造你的专属Windows桌面环境
Seelen-UI终极指南:5分钟打造你的专属Windows桌面环境 【免费下载链接】Seelen-UI The Fully Customizable Desktop Environment for Windows 10/11. 项目地址: https://gitcode.com/GitHub_Trending/se/Seelen-UI 想要彻底改造Windows 10/11的桌面体验吗&am…...
手把手教你用MCP+Selenium打造专属内容发布机器人(附避坑指南)
从零构建MCPSelenium自动化发布系统的实战指南 在当今内容为王的数字时代,如何高效管理多平台内容发布成为创作者和企业的核心需求。本文将带您深入探索如何利用MCP协议与Selenium技术栈,打造一个高度定制化的自动化内容发布系统,特别针对小红…...
ruoyi-vue-pro源码部署实战:如何选择稳定版本并快速搭建开发环境
RuoYi-Vue-Pro 稳定版部署指南:从版本选择到开发环境搭建全解析 第一次接触 RuoYi-Vue-Pro 这个 Java 快速开发框架时,我像大多数开发者一样直接克隆了 master 分支,结果编译阶段就遭遇了各种依赖冲突和接口报错。后来才发现,这个…...
3步解决字幕处理90%的麻烦:BiliBiliCCSubtitle效率革命
3步解决字幕处理90%的麻烦:BiliBiliCCSubtitle效率革命 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 开篇:三个真实场景的效率反差 场景…...
MaxKB:企业级AI知识库部署实战指南
MaxKB:企业级AI知识库部署实战指南 【免费下载链接】MaxKB 🔥 MaxKB is an open-source platform for building enterprise-grade agents. 强大易用的开源企业级智能体平台。 项目地址: https://gitcode.com/GitHub_Trending/ma/MaxKB 面对企业AI…...
