簡體   English   中英

在libGDX中擴展紋理

[英]Expanding textures in libGDX

我使用libgdx制作了簡單的基於圖塊的游戲,一切似乎都很好,直到我添加了一個跟隨鼠標位置的矩形。 我發現,每當我跳躍時,矩形(以及其他塊)可能會擴展1 px,直到我讓空格鍵為止。 當我再次按下空格鍵時,它恢復到正常大小。 我嘗試打印出矩形的寬度和高度,但是它們沒有改變,因此渲染存在問題。

一切正常在這張照片上,您可以看到跳前的比賽。

較寬的紋理這是跳躍后的游戲。 您也可以在玩家頭上清楚地看到它。

多一點細節。 我不使用block2d。 磁貼大小為8x8,縮放為20x20。 使用沒有填充的Texturepacker(無論如何填充都會出現問題)。 我不知道要發布哪個代碼,因為我不知道問題可能在哪里,所以這里只是簡單的塊類。 任何幫助將不勝感激,謝謝。

public class Block extends Sprite {

private int[] id = { 0, 0 };
public Rectangle rect;
private int textureSize = 8;

public Block(PlayScreen play,String texture, int x, int y, int[] id) {
    super(play.getAtlas().findRegion("terrain"));
    this.id = id;
    rect = new Rectangle(x, y, ID.tileSize, ID.tileSize);
    setRegion(id[0] * textureSize, id[1] * textureSize + 32, textureSize, textureSize);
    setBounds(rect.x, rect.y, rect.width, rect.height);
}

public void render(SpriteBatch batch) {
    draw(batch);

}

歡迎來到libGDX!

TL; DR-那里的代碼不足以告訴您確切的問題是什么,但是我猜測是在代碼中的某處您將像素空間與游戲空間混淆了。

觀點問題

當您首次創建2D的libGDX游戲時,很容易想到您只是在屏幕上繪制像素。 畢竟,屏幕以像素為單位,窗口以像素為單位,紋理以像素為單位。

但是,如果您開始更仔細地看一下API,您會發現一些奇怪的小事情,例如您的相機和子畫面的位置和大小被測量為浮點值而不是整數(為什么要浮點數? !)。

游戲對象尺寸與繪制對象尺寸不同的原因。 在3D世界中很容易理解這一點-當我接近某物時,它在屏幕上的顯示很大。 當我很遠的時候,它的確很小。 對象的實際大小不會根據我與它的距離而改變,但是感知的大小會改變。 這告訴我們,我們不能僅根據繪制方式安全地測量游戲中的事物,而必須根據其真實大小進行度量。

附帶說明一下,雖然您可能正在使用正交攝影機(即沒有透視圖的攝影機)並繪制2D精靈,但libGDX實際上是在幕后繪制平面3D對象(平面)。

游戲單位

那么,我們如何衡量事物的“真實大小”呢? 答案是我們可以使用所需的任何類型的單位進行測量! 我們可以說什么東西長3.5米,或者42根香蕉,隨您便! 為了便於討論,我將這些單元稱為“游戲單元”(GU)。

對於您的游戲,您可以考慮使每個塊高一個GU寬一個GU(本質上以塊為單位衡量游戲世界)。 您的角色可以移動幾分之一的塊,但是您可以通過“每秒的塊數”來衡量速度。 我幾乎可以保證,它將使您的游戲邏輯更加簡單。

但是我們的紋理以像素為單位!

您可能已經知道,您的游戲使用三件事進行渲染:視口(可以繪制游戲畫面的屏幕區域),攝像頭(將其視為真實的攝像頭,您可以更改鏡頭的位置和大小)更改您的世界處於“可見”狀態)和游戲對象(您可能想要或不希望繪制的對象,具體取決於相機是否可見)。

現在讓我們看一下它們的度量方式:

  • 視口:這是屏幕的一部分(設置為游戲窗口的大小),因此以像素為單位。
  • 攝影機:攝影機很有趣,因為它的大小和位置是以游戲單位而不是像素為單位的。 由於視口使用“攝影機”知道屏幕上要繪畫的內容,因此它確實包含GU到像素的映射。
  • 游戲對象:以游戲單位衡量。 它的紋理可能以像素為單位,但是不同於游戲對象的“真實大小”。

現在,libGDX將所有這些大小默認為1 GU == 1 Pixel,這使許多人誤以為一切都是以像素為單位的。 一旦意識到事實並非如此,就會有一些很酷的含義。

真的很酷的含義

第一個含義是,即使我的屏幕尺寸發生變化,我的相機尺寸也可以保持不變。 例如,如果我有一個800x600像素的小屏幕,則可以將相機尺寸設置為40x30。 這樣可以保持良好的寬高比,並允許我在屏幕上繪制40x30的塊。

如果屏幕尺寸更改(例如更改為1440x900),我的游戲仍將在屏幕上顯示40x30塊。 如果長寬比發生變化,它們可能看起來有些拉長,但是libGDX具有特殊的視口 ,可以為您抵消這一點。 這樣可以更輕松地在其他顯示器,其他設備上甚至在處理屏幕尺寸時支持您的游戲。

第二個很酷的含義是,您不再在乎紋理大小。 如果你開始告訴libGDX“嘿,你去畫這個1x1的GU對象上這個32x32px精靈”,而不是“嘿,你去畫這個32x32px精靈”(注意區別?)這意味着改變紋理尺寸不改變有多大的事在屏幕上繪制時,它會更改其詳細程度。 如果要更改繪制的大小,可以將相機尺寸更改為“放大”。

第三個很酷的含義是,這使您的游戲邏輯更加清晰。 例如,您開始以“每秒游戲單位”而不是“每秒像素數”來考慮速度。 這意味着圖紙尺寸的變化不會影響游戲中事物的運行速度,並且可以為您節省大量的錯誤尋找機會。 您還避免了很多奇怪的“調整屏幕大小時,我的跳轉行為有所不同”的錯誤。

摘要

我希望這會有所幫助並且有意義。 一開始很難讓您意識到這一點,但是從長遠來看,它將使您的生活變得更加輕松,並且您的游戲也會變得更好。 如果您想要一個更好的圖片示例,建議您由一位libGDX開發人員閱讀此文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM