libGDX跨平台游戏开发框架入门:开发一个小游戏之监听屏幕触摸和鼠标键盘移动精灵物体...

目录

前言

使桶移动(监听屏幕触摸和鼠标)

使桶移动(键盘)

游戏中的暂停和恢复

结语


前言

在前面四章中(libGDX跨平台游戏开发框架入门:搭建开发环境和生成libGDX项目_汤姆猫不是猫的博客-CSDN博客_libgdx框架),(libGDX跨平台游戏开发框架入门:运行libGDX项目_汤姆猫不是猫的博客-CSDN博客),(libGDX跨平台游戏开发框架入门:开发一个小游戏之加载资源_汤姆猫不是猫的博客-CSDN博客), (libGDX跨平台游戏开发框架入门:开发一个小游戏之渲染和清屏_汤姆猫不是猫的博客-CSDN博客)我们介绍了如何搭建libGDX开发环境和如何运行项目,以及项目中的模块作用等情况,对libGDX有了基本认识,以及通过加载资源篇和图形渲染篇,了解了libGDX资源管理、图形渲染和音效播放相关的api内容,本章,我们将通过代码了解libGDX如何监听屏幕触摸、鼠标和键盘的输入动作。

为了更加清楚的描述每个api作用,我们将使用大量的代码和描述,来阐述每个api的作用和用途,所以我们将开发小游戏分为四个部分讲解,由于篇幅限制,我们分为三章讲解各个部分主要内容,最后一篇进行汇总: 1. 加载资源篇 2. 图形渲染、清屏和音效播放篇 3. 鼠标键盘输入和移动篇 4. 小游戏完整版汇总篇

本篇为鼠标键盘输入和移动篇

使桶移动(监听屏幕触摸和鼠标)

是时候让用户控制存储桶了。之前说过我们将允许用户拖动桶。现在我们把事情变得简单一点,如果用户触摸屏幕(或按下鼠标按钮),我们希望桶围绕该位置水平居中。将以下代码添加到该render()方法的底部将执行此操作:

if(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; 
}

首先,我们通过调用输入模块的Gdx.input.isTouched()方法来询问当前用户是否触摸了屏幕(或按下了鼠标按钮)。接下来,我们要将触摸/鼠标坐标转换为camera坐标系,这是必须要转换的,因为触摸/鼠标坐标的坐标系与我们游戏世界中对象的实际坐标系不同。

Gdx.input.getX()Gdx.input.getY()返回当前的触摸/鼠标位置(libGDX 也支持多点触摸,但这是另一篇文章的主题)。要将这些坐标转换为我们camera的坐标系,我们需要调用camera.unproject()方法,该方法请求Vector3一个三维向量。创建这样一个向量,设置当前的触摸/鼠标坐标并调用该方法。该向量现在将包含桶所在坐标系中的触摸/鼠标坐标。最后,我们将桶的位置更改为以触摸/鼠标坐标为中心。

注意:实例化许多新对象(例如:Vector3实例)非常非常糟糕。这样做的原因是垃圾收集器必须经常启动以收集这些短命的对象。虽然在pc桌面上这不是什么大问题(因为pc电脑性能更好),但在 Android 上,GC 可能会导致长达数百毫秒的暂停,从而导致卡顿。为了在这种特殊情况下解决这个问题,我们可以简单地创建类的touchPos一个Drop字段,而不是一直实例化它。

注: touchPos是一个三维向量。您可能想知道为什么我们只在 2D 中操作。OrthographicCamera实际上是一个 3D 相机,它也考虑了 z 坐标。想想 CAD 应用程序,它们也使用 3D 正交相机。我们只是滥用它来绘制 2D 图形。

使桶移动(键盘)

在pc桌面和浏览器中,我们也可以接收键盘输入。让我们在按下左光标键或右光标键时让桶移动。

我们希望桶以每秒 200 像素/单位的速度向左或向右移动而没有加速度。为了实现这种基于时间的移动,我们需要知道最后一帧和当前渲染帧之间经过的时间。以下是我们如何做到这一切: java

if(Gdx.input.isKeyPressed(Input.Keys.LEFT)) bucket.x -= 200 * Gdx.graphics.getDeltaTime(); if(Gdx.input.isKeyPressed(Input.Keys.RIGHT)) bucket.x += 200 * Gdx.graphics.getDeltaTime();

该方法Gdx.input.isKeyPressed()告诉我们是否按下了特定的键。该Keys枚举包含所有的键码是libGDX支持。该方法Gdx.graphics.getDeltaTime()以秒为单位返回上一帧和当前帧之间经过的时间。我们需要做的就是通过添加/减去 200 个单位乘以增量时间(以秒为单位)来修改存储桶的 x 坐标。

我们还需要确保“桶”保持在屏幕限制内: 

if(bucket.x < 0) bucket.x = 0; if(bucket.x > 800 - 64) bucket.x = 800 - 64;

游戏中的暂停和恢复

每次用户接听电话或按下主页按钮时,Android 都会暂停和恢复您的应用程序。在这种情况下,libGDX 会自动为您做很多事情,例如重新加载可能丢失的图像(OpenGL 上下文丢失,本身就是一个可怕的话题),暂停和恢复音乐流等等。

在我们的游戏中,没有真正需要处理暂停/恢复。一旦用户回到应用程序,游戏就会从它离开的地方继续。通常会实现一个暂停屏幕并要求用户触摸屏幕以继续,可以查看ApplicationAdapter.pause()ApplicationAdapter.resume()方法。

结语

到这里为止,我们的小游戏就编写完成了,下一章我们会汇总前面几章的代码,完成完整的游戏代码。

如果觉得博主写的还不错,欢迎“点赞、收藏、关注”一键三连。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤姆猫不是猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值