觸屏pos機(jī)怎樣使用,Java游戲框架LibGDX的使用

 新聞資訊  |   2023-05-17 09:40  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于觸屏pos機(jī)怎樣使用,Java游戲框架LibGDX的使用的知識(shí),也有很多人為大家解答關(guān)于觸屏pos機(jī)怎樣使用的問題,今天pos機(jī)之家(www.rcqwhg.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!

本文目錄一覽:

1、觸屏pos機(jī)怎樣使用

觸屏pos機(jī)怎樣使用

Libgdx 是一個(gè)用java開發(fā)的一款跨平臺(tái)游戲框架。它目前支持的平臺(tái)有 Windows,Mac OS X,Android,IOS 和 HTML5。下面使用LibGDX實(shí)現(xiàn)一個(gè)水桶接水滴的一個(gè)小游戲。

項(xiàng)目設(shè)置

這里使用 LibGDX提供的項(xiàng)目創(chuàng)建工具LibGdx Project Setup Tool來創(chuàng)建一個(gè)游戲項(xiàng)目,該工具的獲取可以查看置頂評(píng)論,設(shè)置如下:

Application name: dropPackage name: com.badlogic.drop Game class: Drop 其他設(shè)置不動(dòng)就可以了

工具默認(rèn)選擇Desktop和Android,這里可以只選用Desktop來做測(cè)試,如果需要在安卓上運(yùn)行,也可以勾選上Android, 但是勾選上后需要配置好安卓的開發(fā)環(huán)境,其他平臺(tái)也是同理。

工具生成的項(xiàng)目其實(shí)就是一個(gè)gradle項(xiàng)目工程,可以選擇自己喜歡的IDE來進(jìn)行導(dǎo)入,這里我將其導(dǎo)入到Eclipse IDE中。在drop-desktop模塊下點(diǎn)擊DesktopLauncher運(yùn)行,效果如下:

游戲設(shè)計(jì)

該游戲的規(guī)則很簡(jiǎn)單:

用一個(gè)水桶去接雨滴。水桶位于屏幕的底部。雨滴每秒在屏幕頂部隨機(jī)產(chǎn)生,并向下加速。玩家可以通過鼠標(biāo)水平移動(dòng)、觸摸或者移動(dòng)左右鍵來操控水桶。游戲資源

在這個(gè)游戲中需要的資源有如下幾個(gè):

滴水的音效聲下雨的聲音雨滴資源圖片水桶資源圖片

資源也在評(píng)論區(qū)置頂中查看哦。

下載的資源文件中有: drop.WAV、 rain.mp3、 droplet.png 和 bucket.png,將它們放在 drop_desktop/assets/中。如果有其他模塊,比如android等,我們只需要隨便放在其中一個(gè)assets就可以了,這里的資源是各個(gè)模塊中公用的。

配置啟動(dòng)類

我們配置啟動(dòng)類。在 drop_desktop模塊中打開 DesktopLauncher.java 啟動(dòng)類。我們?cè)O(shè)置游戲窗口的大小為800x480,并將標(biāo)題設(shè)置為“ Drop”。代碼如下:

package com.badlogic.drop.desktop;import com.badlogic.gdx.backends.lwjgl.LwjglApplication;import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;import com.badlogic.drop.Drop;public class DesktopLauncher { public static void main (String[] arg) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); config.title = "Drop"; config.width="360px",height="auto" />

游戲核心邏輯

我們的游戲核心邏輯都是在drop_core模塊中,我們打開drop_core模塊下的Drop.java。

刪除其默認(rèn)生成的代碼,只留下以下的基礎(chǔ)代碼:

public class Drop extends ApplicationAdapter { @Override public void create() { } @Override public void render () { }}加載資源

通常在其create方法中加載游戲相關(guān)的資源。代碼如下:

public class Drop extends ApplicationAdapter { private Texture dropImage; private Texture bucketImage; private Sound dropSound; private Music rainMusic; @Override public void create() { // 加載雨滴和桶的資源圖片,每個(gè)像素大小為64*64 dropImage = new Texture(Gdx.files.internal("droplet.png")); bucketImage = new Texture(Gdx.files.internal("bucket.png")); // 加載雨滴音效和下雨的背景聲音 dropSound = Gdx.audio.newSound(Gdx.files.internal("drop.wav")); rainMusic = Gdx.audio.newMusic(Gdx.files.internal("rain.mp3")); // 循環(huán)播放背景音樂 rainMusic.setLooping(true); rainMusic.play(); // ... 其他代碼塊 ... } // ... 其他代碼塊 ...}

在上面的示例代碼中,每一個(gè)資源,我們?cè)?Drop 類中都有一個(gè)字段與其對(duì)應(yīng),create ()方法是ApplicationAdapter的生命周期方法,我們通常在其create()方法中加載資源,前兩行加載雨滴和桶的圖像資源。Texture為紋理。通常不能直接繪制紋理。可以通過將 FileHandle 傳遞給資源文件的構(gòu)造函數(shù)來加載紋理。這樣的 FileHandle 實(shí)例通過 Gdx.files 提供的方法之一獲得。在libGDX中有著不同類型的文件,我們?cè)谶@里使用“Gdx.files.internal”文件類型來加載資源。Gdx.files.internal為從其資源目錄assets中加載資源,所傳為相對(duì)于assets的文件路徑。

接下來加載雨滴音效和背景音樂。libGDX 區(qū)分了存儲(chǔ)在內(nèi)存中的聲音效果和存儲(chǔ)在任何地方的流媒體音樂。音樂通常太大而不能完全保存在內(nèi)存中,因此才有了差異。一般按照經(jīng)驗(yàn),如果小于10秒的音頻文件,則應(yīng)該使用 Sound 實(shí)例,如果較長(zhǎng)的音頻片段,則應(yīng)該使用 Music 實(shí)例。

注意: libGDX 支持 MP3、 OGG 和 WAV 文件。你可以根據(jù)自身需求來進(jìn)行選擇,每種格式都有自己的優(yōu)點(diǎn)和缺點(diǎn)。例如,與其他格式相比,WAV 文件相當(dāng)大,OGG 文件在 RoboVM (iOS)和 Safari (GWT)上都不能工作,而且 mp3文件存在不適當(dāng)?shù)难h(huán)問題。

示例代碼中通過 Gdx.audio.newSound ()和 Gdx.audio.newMusic ()加載音效資源。這兩個(gè)方法都采用 FileHandle。

在 create ()方法的最后,我們還設(shè)置了 Music 實(shí)例為立即循環(huán)播放。運(yùn)行這個(gè)應(yīng)用程序,你會(huì)聽到嘩啦嘩啦的下雨聲。

Camera和Spritebatch

接下來,我們?cè)贒rop類中創(chuàng)建一個(gè)相機(jī)Camera和一個(gè) SpriteBatch。SpriteBatch 是一個(gè)特殊的類,用于繪制二維圖像,比如將紋理繪制到屏幕上。

private OrthographicCamera camera;private SpriteBatch batch;

然后在create() 方法中實(shí)例化它:

camera = new OrthographicCamera(); camera.setToOrtho(false, 800, 480); batch = new SpriteBatch();

這里創(chuàng)建了一個(gè)區(qū)域?yàn)?00*400單位的相機(jī)。把它想象成一個(gè)通向游戲世界的虛擬窗口。目前,我們可以將這些單位理解為像素。但是將其理解為其他的單位也沒錯(cuò),比如米或者其他你想要的單位。相機(jī)是非常強(qiáng)大的,允許你做很多事情。

SpriteBatch在下面具體細(xì)說。

添加水桶

接下來往我們的游戲中添加水桶。為了描述水桶和雨滴,我們需要存儲(chǔ)它們的位置和大小。libGDX 提供了一個(gè) Rectangle 類,我們可以為此使用它。讓我們從創(chuàng)建一個(gè)矩形代表我們的桶開始。我們給Drop類添加了一個(gè)新字段:

private Rectangle bucket;

在 create ()方法中,我們實(shí)例化了 Rectangle 并指定了它的初始值。我們希望桶在屏幕底部邊緣上方20像素,水平居中。

bucket = new Rectangle(); bucket.x = 800 / 2 - 64 / 2; bucket.y = 20; bucket.width="360px",height="auto" />

我們將桶水平放置在屏幕底部邊緣上方20像素的位置。默認(rèn)情況下,libGDX (和 OpenGL)中的所有展現(xiàn)都是在 y軸朝上的情況下執(zhí)行的。桶的 x/y 坐標(biāo)定義了桶的左下角,繪圖原點(diǎn)位于屏幕的左下角。矩形的寬度和高度被設(shè)置為64x64。

注意: 這種設(shè)置是可以更改的,使 y 軸向下,原點(diǎn)在屏幕的左上角。OpenGL 和相機(jī)類是很靈活的,你可以使用幾乎任何你想要的視角,在 2D 和 3D中。然而,一般不推薦這樣干。

渲染水桶

渲染方法為ApplicationAdapter的生命周期render方法。第一步我們先用深藍(lán)色清除屏幕:

ScreenUtils.clear(0, 0, 0.2f, 1);

ScreentUtils.clear的參數(shù)為red, green, blue 和 alpha, 每一個(gè)分量為[0-1]之間。

接下來,我們需要調(diào)用相機(jī)的update方法更新相機(jī)。相機(jī)使用矩陣的數(shù)學(xué)實(shí)體,負(fù)責(zé)建立渲染坐標(biāo)系。每次我們更改了相機(jī)的任何屬性,比如它的位置,相機(jī)的這些矩陣都需要重新update更新計(jì)算。在此示例中我們雖然還沒有涉及到相機(jī)的相關(guān)操作,但是通常每幀更新一次相機(jī)是一個(gè)很好的習(xí)慣:

camera.update();

現(xiàn)在我們可以渲染我們的水桶了:

batch.setProjectionMatrix(camera.combined); batch.begin(); batch.draw(bucketImage, bucket.x, bucket.y); batch.end();

第一行告訴 SpriteBatch 使用相機(jī)指定的坐標(biāo)系。如前所述,這是通過數(shù)學(xué)矩陣來完成的,更具體地說,就是一個(gè)投影矩陣。camera.combined字段就是這樣的一個(gè)矩陣。從那里,在 SpriteBatch 上將呈現(xiàn)前面描述的坐標(biāo)系中的所有內(nèi)容。

接下來,我們告訴 SpriteBatch 準(zhǔn)備開始繪制。我們?yōu)槭裁匆胋atch繪制呢?因?yàn)镺penGL最討厭提供給他渲染的是一個(gè)一個(gè)的單張圖片,OpenGL希望是一次性提交給它盡可能多的渲染的圖片。所以這里使用batch,批次的提交給OpenGL渲染。

SpriteBatch 類是一個(gè)對(duì) OpenGL 很友好的類。它將記錄在 SpriteBatch.begin ()和 SpriteBatch.end ()之間的所有繪圖命令。一旦我們調(diào)用了 SpriteBatch.end () ,它將同時(shí)提交所有的繪圖請(qǐng)求,這將大大加快渲染速度。這些在一開始看起來可能有些麻煩,但是這將提高渲染速度,在60幀率渲染500個(gè) sprites 和在20幀率渲染100個(gè) sprites 之間是有很大區(qū)別的。

運(yùn)行目前我們的示例代碼,我們可以看到如下的效果:

通過鼠標(biāo)/觸摸使桶移動(dòng)

現(xiàn)在我們讓用戶來控制桶。之前我們說過我們會(huì)允許用戶拖動(dòng)這個(gè)桶。我們可以先做一個(gè)簡(jiǎn)化一點(diǎn)的功能。如果用戶觸摸屏幕(或按下鼠標(biāo)按鈕),我們希望桶水平圍繞該位置居中。在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; }

首先,我們通過調(diào)用 Gdx.input.isTouched ()來詢問輸入模塊屏幕當(dāng)前是否被觸摸(或鼠標(biāo)按鈕是否被按下)。接下來,我們要將觸摸/鼠標(biāo)的坐標(biāo)轉(zhuǎn)換為相機(jī)的坐標(biāo)系。這是必要的,因?yàn)槲覀兊玫降挠|摸/鼠標(biāo)坐標(biāo)的坐標(biāo)系可能不同于我們用來表示游戲世界中物體的坐標(biāo)系。

Gdx.input.getX()和Gdx.input.getY()返回當(dāng)前的觸摸/鼠標(biāo)位置(libGDX 也支持多點(diǎn)觸摸,這在后續(xù)的文章中詳細(xì)介紹)。為了將這些坐標(biāo)轉(zhuǎn)換為我們相機(jī)的坐標(biāo)系,我們需要調(diào)用 camera.unproject ()方法,它請(qǐng)求一個(gè) Vector3,一個(gè)三維矢量。我們創(chuàng)建這樣一個(gè)向量,設(shè)置當(dāng)前的觸摸/鼠標(biāo)坐標(biāo)并調(diào)用該方法。該三維矢量現(xiàn)在將包含我們的水桶所在的坐標(biāo)系中的觸摸/鼠標(biāo)坐標(biāo)。最后,我們將水桶的位置更改為圍繞觸摸/鼠標(biāo)坐標(biāo)的中心。

注意1: 在這里的代碼中,實(shí)例化大量新對(duì)象是非常非常糟糕的,例如 vector3實(shí)例。這是因?yàn)槔占鞅仨氼l繁地收集這些短命的對(duì)象。雖然在桌面上這沒什么大不了的(由于可用的資源) ,但在 Android 上 GC 可能會(huì)導(dǎo)致長(zhǎng)達(dá)幾百毫秒的暫停,從而導(dǎo)致卡頓。在這種特殊情況下,如果您想解決這個(gè)問題,只需將 touchPos 作為 Drop 類的私有最終字段,而不是在render方法中一直實(shí)例化它。

注意2: touchPos 是一個(gè)三維向量。OrthographicCamera 實(shí)際上是一個(gè)3d 相機(jī),它也考慮了 z 坐標(biāo)。想想 CAD 的應(yīng)用,他們也使用三維正投影相機(jī)。我們只是簡(jiǎn)單地用它來繪制二維圖形。

現(xiàn)在我們就得到了如下效果,當(dāng)我們失敗點(diǎn)擊其中某個(gè)點(diǎn)的時(shí)候,水桶就會(huì)在底部跑到我們點(diǎn)擊的那個(gè)位置的下方。

通過鍵盤使桶移動(dòng)

在桌面和瀏覽器上,我們也可以接收鍵盤輸入。當(dāng)按鍵左或按鍵右被按下時(shí),讓桶發(fā)生移動(dòng)。

我們希望桶在按鍵按下并且不需要加速的情況下,以每秒200個(gè)像素/單位的速度向左或向右移動(dòng)。為了實(shí)現(xiàn)這種基于時(shí)間的移動(dòng),我們需要知道從最后一個(gè)渲染幀到當(dāng)前渲染幀之間的時(shí)間。我們可以這樣做:

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.getdeltatiana ()以秒為單位返回上一幀和當(dāng)前幀之間傳遞的時(shí)間。我們所需要做的就是通過加減200個(gè)單位乘以以秒為單位的增量時(shí)間來修改桶的 x 坐標(biāo)。

我們還需要限制確保我們的水桶不能跑出屏幕外面去:

if(bucket.x < 0) { bucket.x = 0; } if(bucket.x > 800 - 64) { bucket.x = 800 - 64; }添加下雨雨滴

對(duì)于雨滴,我們?cè)贒rop類中添加一個(gè)矩形實(shí)例的列表字段,每個(gè)實(shí)例都記錄了雨滴的位置和大小:

private Array<Rectangle> raindrops;

Array 類是一個(gè) libGDX 提供的工具類,用于替代 ArrayList 等標(biāo)準(zhǔn) Java 集合。后者的問題在于它們以各種方式產(chǎn)生垃圾。Array 類試圖盡可能減少垃圾。libGDX 還提供了其他垃圾收集器感知的集合,比如散列映射或集合。

我們還需要記錄上次產(chǎn)生雨滴的時(shí)間,所以我們添加了另一個(gè)字段:

private long lastDropTime;

我們將采用納秒為單位的時(shí)間,所以類型這里我們選擇為long。

我們新建一個(gè)spawnRaindrop ()的方法來創(chuàng)建雨滴,實(shí)例化一個(gè)新的 Rectangle,將其設(shè)置為屏幕頂部邊緣的一個(gè)隨機(jī)位置,并將其添加到雨滴數(shù)組中。

private void spawnRaindrop() { Rectangle raindrop = new Rectangle(); raindrop.x = MathUtils.random(0, 800-64); raindrop.y = 480; raindrop.width="360px",height="auto" />

這個(gè)方法顯而易見。MathUtils 類是一個(gè) libGDX 類,提供了各種與數(shù)學(xué)相關(guān)的靜態(tài)方法。在這里,它將返回一個(gè)0到800-64之間的隨機(jī)值。TimeUtils 是另一個(gè) libGDX 類,它提供了一些非常基本的與時(shí)間相關(guān)的靜態(tài)方法。在這里,我們以納秒為單位記錄當(dāng)前時(shí)間。

在 create ()方法中,我們實(shí)例化raindrops并生成第一個(gè)雨滴:

raindrops = new Array<Rectangle>(); spawnRaindrop();

接下來,我們?cè)?render ()方法中添加幾行代碼,用于檢查自產(chǎn)生新雨滴以來已經(jīng)過去了多少時(shí)間,如果有必要,還可以創(chuàng)建一個(gè)新雨滴:

if(TimeUtils.nanoTime() - lastDropTime > 1000000000) {spawnRaindrop();}

我們還需要讓雨滴移動(dòng),簡(jiǎn)單點(diǎn),我們讓它們以每秒200像素/單位的恒定速度移動(dòng)。如果雨滴在屏幕的底部邊緣之下,我們將其從數(shù)組中移除。

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

接著我們?cè)赽atch.begin()和batch.end()之間來渲染雨滴,代碼如下:

for(Rectangle raindrop: raindrops) { batch.draw(dropImage, raindrop.x, raindrop.y); }

最后,如果我們用桶接住了雨滴,也就是一個(gè)雨滴打在桶上,我們希望回放聲音并從數(shù)組中移除雨滴。我們只需在雨滴更新循環(huán)中加入以下幾行:

if(raindrop.overlaps(bucket)) { dropSound.play(); iter.remove(); }

Rectangle.overlaps()方法檢查該矩形是否與另一個(gè)矩形重疊。

清理

用戶可以隨時(shí)關(guān)閉應(yīng)用程序。對(duì)于這個(gè)簡(jiǎn)單的例子,沒有什么需要做的。不過,幫助操作系統(tǒng)解決一點(diǎn)問題并清理我們?cè)斐傻幕靵y通常是一個(gè)好習(xí)慣。

在libGDX中任何實(shí)現(xiàn) Disposable 接口并因此具有 dispose ()方法的 libGDX 類在不再使用后都需要手動(dòng)清理。在我們的示例中,對(duì)于紋理、聲音、音樂和 SpriteBatch 來說,都是需要清理掉的。我們將在ApplicationAdapter的生命周期dispose ()方法下進(jìn)行清理:

@Override public void dispose() { dropImage.dispose(); bucketImage.dispose(); dropSound.dispose(); rainMusic.dispose(); batch.dispose(); }

一旦您清理釋放了一個(gè)資源,就不應(yīng)該以任何方式訪問它。

一次性資源通常是本機(jī)資源,不由 Java 垃圾收集器處理。這就是為什么我們需要手動(dòng)處理它們的原因。libGDX 提供了各種幫助資產(chǎn)管理的方法。這在后續(xù)的章節(jié)中詳細(xì)介紹。

處理暫停/恢復(fù)

安卓系統(tǒng)有這樣一個(gè)操作: 每當(dāng)用戶接到一個(gè)電話或者按下 home 鍵時(shí),就暫停并恢復(fù)你的應(yīng)用程序。在這種情況下,libGDX 會(huì)自動(dòng)為您做很多事情,例如重新加載可能丟失的圖像(OpenGL 上下文丟失,這本身就是一個(gè)可怕的主題) ,暫停并恢復(fù)音樂流等等。

在我們的游戲中,沒有真正需要處理暫停/恢復(fù)。只要用戶返回到應(yīng)用程序,游戲就會(huì)繼續(xù)。通常人們會(huì)實(shí)現(xiàn)一個(gè)暫停屏幕,并要求用戶觸摸屏幕繼續(xù)??梢允褂?ApplicationAdapter的生命周期pause ()和 resume ()方法。

效果

在桌面上的運(yùn)行效果如下:

將其運(yùn)行到Android上效果為:

完整的代碼

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; @Override public void create() { // load the images for the droplet and the bucket, 64x64 pixels each dropImage = 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.wav")); rainMusic = Gdx.audio.newMusic(Gdx.files.internal("rain.mp3")); // start the playback of the background music immediately rainMusic.setLooping(true); rainMusic.play(); // create the camera and the SpriteBatch camera = new OrthographicCamera(); camera.setToOrtho(false, 800, 480); batch = new SpriteBatch(); // create a Rectangle to logically represent the bucket bucket = new Rectangle(); bucket.x = 800 / 2 - 64 / 2; // center the bucket horizontally bucket.y = 20; // bottom left corner of the bucket is 20 pixels above the bottom screen edge bucket.width="360px",height="auto" />

以上就是關(guān)于觸屏pos機(jī)怎樣使用,Java游戲框架LibGDX的使用的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于觸屏pos機(jī)怎樣使用的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://www.rcqwhg.com/news/43418.html

你可能會(huì)喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。