การแก้ปัญหาความเป็นอิสระใน libGDX


22

ฉันจะทำให้ความละเอียด / ความหนาแน่นของเกม libGDX ของฉันเป็นอิสระได้อย่างไร มีวิธีการระบุขนาดภาพเป็น "แน่นอน" โดยไม่คำนึงถึงความหนาแน่นพื้นฐานหรือไม่?

ฉันสร้างเกมสำหรับเด็กที่เรียบง่าย เพียงแค่สไปรต์แสดงบนหน้าจอและข้อความสำหรับเมนู (เมนูตัวเลือกเป็นหลัก) สิ่งที่ฉันต้องการรู้คือฉันจะทำให้การแก้ไข Sprite / แบบอักษรของฉันเป็นอิสระได้อย่างไร (ฉันห่อไว้ในชั้นเรียนของฉันเองเพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้น)

เนื่องจากเป็นเกมสำหรับเด็กที่เรียบง่ายฉันไม่จำเป็นต้องกังวลเกี่ยวกับ "พื้นที่ที่สามารถเล่นได้" ของเกม ฉันต้องการใช้พื้นที่หน้าจอให้มากที่สุด

สิ่งที่ฉันทำอยู่ในตอนนี้ซึ่งดูเหมือนไม่ถูกต้องที่สุดคือการสร้างภาพที่เหมาะสำหรับความละเอียดขนาดใหญ่จากนั้นย่อขนาด (หรือน้อยมาก) ให้พอดีกับขนาดหน้าจอ ดูเหมือนว่าจะทำงานได้ดี (ในเวอร์ชันเดสก์ท็อป) แม้ว่าจะมีการแมปเชิงเส้นบนพื้นผิวของฉัน แต่ความละเอียดที่น้อยลงนั้นดูน่าเกลียด

นอกจากนี้ดูเหมือนว่ามันจะบินไปที่ใบหน้าของ "พิกเซลอุปกรณ์อิสระ" (DPs) ของ Android หรือบางทีฉันอาจจะพลาดบางสิ่งบางอย่างและ libGDX ก็ดูแลเรื่องนี้อยู่แล้ว?

วิธีที่ดีที่สุดในการแก้ไขปัญหานี้คืออะไร ฉันพบลิงค์นี้ นี้เป็นวิธีที่ดีในการแก้ปัญหา ?: http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

มันกล่าวถึงวิธีการควบคุมภาพ แต่มันไม่ได้พูดถึงวิธีการระบุขนาดตัวอักษร / ภาพโดยไม่คำนึงถึงความหนาแน่น


อาจเกี่ยวข้องกัน gamedev.stackexchange.com/questions/34/…
thedaian

@thedaian ไม่มาก นั่นเป็นเรื่องของความละเอียด ฉันกังวลเกี่ยวกับการมีอิทธิพลซึ่งกันและกันระหว่างความหนาแน่นและความละเอียด
ashes999

คำตอบ:


12

เนื่องจากคุณสามารถอ่านความหนาแน่นของอุปกรณ์และแสดงแบบอักษรระหว่างรันไทม์ใน libgdx ฉันจึงใช้โซลูชันนี้เพื่อให้ได้ขนาดฟอนต์ที่เป็นอิสระต่อกัน:

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );

การอภิปรายของฉันเกี่ยวกับภาพรวมถึงแบบอักษร +1 สำหรับการแสดงผลตัวอักษรแบบไดนามิก (ฉันทำแล้ว)
ashes999

10

เพื่อให้บรรลุสิ่งนี้ใน libgdx คุณสามารถใช้ "orthographicCamera" ที่นั่นคุณกำหนดขนาดที่คุณต้องการใช้และในทุกความละเอียดคุณอาจเห็นภาพทั้งหมดของคุณมีขนาดเท่านั้น (ฉันใช้ 800X480 เพราะหน้าจอใหญ่ขึ้นใน Android ) และมันใช้งานได้ดี :)

public class GameStage extends Stage 
{ 
     public GameStage(float width, float height, boolean stretch) 
     { 
          this.camera = new OrthographicCamera(800, 480);
          this.camera.position.set(800/2, 480/2, 0f); 
     } 
}

ฉันขอตัวอย่างรหัสได้ไหม
ashes999

นั่นคือรหัสและคุณสร้างคลาสที่ใช้อินเทอร์เฟซหน้าจอในตัวสร้างที่คุณสร้างสเตจของคุณและในวิธีการเรนเดอร์คุณใส่ stage.draw () หากคุณไม่ต้องการใช้สเตจคุณอาจประกาศตัวแปรในคลาสที่ติดตั้งกล้องชนิดใช้งานและทำแบบเดียวกับในสเตจ แต่ในวิธีการเรนเดอร์คุณใช้การอัปเดตกับกล้อง
Rudy_TM

มันใช้งานได้ดีจริง ๆ
you786

4

ฉันเชื่อว่า "พิกเซลอุปกรณ์ที่เป็นอิสระ" ของ Android เป็นเพียงเครื่องมือวัดขนาดสำหรับการจัดประเภทอุปกรณ์และไม่สามารถใช้เป็นพิกเซลที่แสดงผลได้ ดังนั้นคุณจะไม่พลาดโครงสร้างพื้นฐานการแก้ DPI ที่น่าอัศจรรย์ เท่าที่ฉันเข้าใจสถานะของศิลปะที่นี่คุณได้ค้นพบตัวเลือกทั้งหมด มีสองวิธีพื้นฐานสำหรับการจัดการกับอุปกรณ์ต่าง ๆ :

  1. ปรับขนาดภาพที่มีอยู่ล่วงหน้าเพื่อให้ตรงกับอุปกรณ์จริง DPI
  2. เลือกจากภาพที่ปรับขนาดล่วงหน้าจำนวนมาก ณ เวลาทำงานตาม DPI

แน่นอนว่าคุณสามารถผสมสองอย่างเข้าด้วยกัน (เลือกภาพที่มีความแม่นยำโดยประมาณแล้วปรับขนาด) หรือใช้วิธีการที่แตกต่างกันสำหรับองค์ประกอบที่แตกต่างกันของ UI ของคุณ (เช่นภาพที่มีอยู่แล้วสำหรับแบบอักษร / ข้อความ สไปรท์)

สิ่งที่เกมเฉพาะของคุณพยายามทำสามารถสร้างความแตกต่างในแนวทางที่เหมาะสมกว่า ตัวอย่างเช่นหากคุณมีเมนูบนหน้าจอคุณจะต้องตรวจสอบให้แน่ใจว่าปุ่มนั้นมีขนาดเท่าปลายนิ้วที่เหมาะสม (เพื่อให้ปุ่มนั้นง่ายต่อการตี แต่ไม่จำเป็นต้องใหญ่กว่า อุปกรณ์ขนาดใหญ่เช่นแท็บเล็ต) อีกทางเลือกหนึ่งถ้าคุณกำลังพยายามสร้างเกมไขปริศนาที่คุณต้องการให้แน่ใจว่าสามารถมองเห็นปริศนาทั้งหมดได้ในครั้งเดียวคุณจะต้องปรับขนาดองค์ประกอบให้พอดีกับหน้าจอ (ตัวอย่างเช่นด้วยนิ้วเท้านิ้วเท้า เกมบางทีคุณอาจต้องการให้แต่ละองค์ประกอบใช้ประมาณ 1/3 ของหน้าจอ)

ฉันคิดว่าสิ่งต่าง ๆ เช่นแบบอักษรที่มีรายละเอียดที่ดีมากมายคุณจะต้องมีรูปภาพที่แสดงผลล่วงหน้าด้วยข้อความที่หลากหลายและจากนั้นเลือกการจับคู่ที่ดีที่สุด ดังนั้นปุ่มอาจเปลี่ยนรูปร่าง / ขนาดสัมพัทธ์จากอุปกรณ์หนึ่งเป็นอุปกรณ์อื่น แต่โดยทั่วไปจะดูดีเสมอ

ลองดูเกม Androidสำหรับเริ่มต้นของ Mario Zerchner สำหรับการอภิปรายปัญหาและวิธีแก้ปัญหาบางอย่าง โปรดทราบว่า Mario เป็นผู้เขียน libGDX ดังนั้นวิธีการของหนังสือจึงสะท้อน libGDX หนึ่งตัว (โปรดทราบว่าพวกเขาไม่ได้เป็นแบบหนึ่งต่อหนึ่งหนังสือครอบคลุมการเขียนไลบรารีที่คล้ายกับ libGDX แต่ไม่ใช่ libGDX)


แม้ว่าฉันเลือกจากคอลเลกชันภาพที่สร้างไว้ล่วงหน้าตาม DPI ฉันไม่เห็นว่าฉันจะรับประกันได้อย่างไรว่า "สไปรต์นี้ต้องแสดงเป็น 64x64"
ashes999

1
ฉันสมมติว่าคุณตั้งกล้อง OpenGL ของคุณให้ตรงกับจอแสดงผลทางกายภาพดังนั้น 1 OpenGL pixel maps เป็น 1 display pixel ณ จุดนั้นภาพขนาด 64x64 จะปรากฏเป็น 64x64 บนหน้าจอ เมื่อ Rudy_TM ชี้ให้เห็นคุณสามารถยุ่งเกี่ยวกับการจับคู่กล้องเพื่อปรับขนาดทั้งหน้าจอ
PT

โอเคดูเหมือนว่า "ซีเคร็ทซอส" หลังจากนั้น ฉันจะตรวจสอบและแจ้งให้คุณทราบขอบคุณ
ashes999

0

วิธีหนึ่งที่ทำได้คือกำหนดอัตราส่วนขั้นต่ำและอัตราส่วนสูงสุดสำหรับเกมของคุณ สิ่งเหล่านี้จะเป็นอัตราส่วนที่คุณต้องการให้การสนับสนุน จากนั้นคุณต้องใช้ Viewport ที่มีให้ใน libGdx วิวพอร์ตจะขยายโลกของคุณตามการตั้งค่าที่คุณให้

มีวิวพอร์ตหลายประเภทและคุณต้องเลือกประเภทที่เหมาะสมที่สุดสำหรับเกมของคุณ

คุณสามารถใช้ ExtendViewport ตัวอย่างเช่นและแก้ไขความสูงหรือความกว้างของคุณและคำนวณอันอื่น จากนั้นคุณต้องตรวจสอบให้แน่ใจว่ากราฟิกทั้งหมดสามารถเห็นได้ในอัตราส่วนขั้นต่ำของคุณ วิวพอร์ตแบบขยายจะปรับขนาดกราฟิกของคุณตามอัตราส่วนภาพที่ถูกต้องโดยไม่บิดเบือนกราฟิก อย่างไรก็ตาม ExtendViewport ทำงานโดยการเพิ่มพื้นที่เพิ่มเติมให้กับโลกของคุณดังนั้นคุณควรให้กราฟิกสำหรับพื้นหลังเช่นครอบคลุมอัตราส่วนภาพที่ครอบคลุมทั้งหมดของคุณเมื่อโลกมีขนาดเล็กกว่าอัตราส่วนสูงสุดของคุณส่วนเพิ่มเติมของกราฟิกจะไม่ จะแสดง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.