ในเกมแบบ 2d ที่ใช้วิธีการเลื่อนแบบไหนดี?


9

ฉันใช้ Direct3D กับ wrapper D3DXSPRITE เพื่อวาดแผ่นกระเบื้องไปที่หน้าจอ ฉันมีคลาสกระเบื้องที่ประกอบด้วยสมาชิกเช่นชนและประเภทกระเบื้องแล้วฉันมีอาร์เรย์ของกระเบื้องเช่น

ตารางไทล์ [256] [256];

ซึ่งจะเป็นวิธีที่ดีกว่า

วาดผู้เล่นที่อยู่ตรงกลางของหน้าจอและชดเชยที่แผนที่วาด

- เคลื่อนย้ายเครื่องเล่นโดยใช้กล้องต่อไปนี้

ฉันใช้วิธีแรก แต่มันซับซ้อนขึ้นมากเมื่อคุณไปถึงขอบด้านซ้ายบนของแผนที่และเมื่อผู้เล่น / ศัตรูคนอื่นอยู่บนแผนที่และเคลื่อนที่ในเวลาเดียวกัน

ถ้าฉันทำให้กล้องติดตามผู้เล่นฉันจะต้องเรียก spriteBatch-> Draw (... ) สำหรับไทล์กริดเดี่ยวทุกแผ่นแม้ว่าจะมีเพียงไม่กี่คนที่สามารถวางบนหน้าจอได้หรือไม่?

คำตอบ:


4

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


คุณอาจต้องการเขียนโค้ดเพื่อวาด sprites ที่มองเห็นได้โดยเฉพาะถ้าคุณพบว่าคุณต้องการเพิ่มขนาดของกริด

2

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

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

  • สร้างคลาส tile บางตัวซึ่งสามารถเก็บพิกัดขอบเขตของไทล์และทรัพยากรใด ๆ ที่กระเบื้องเฉพาะอาจต้องการ (sprite, ศัตรู, ฯลฯ .. )

  • ตัดสินใจเกี่ยวกับขนาดของโลกของคุณและสร้างอาเรย์ 2 มิติ (คุณสามารถใช้มิติเดียวและเข้าถึงมันเป็นแบบ 2 มิติ) ของกระเบื้องแต่ละอันแทนบิตของโลกของคุณด้วยทรัพยากรที่เกี่ยวข้องทั้งหมด

  • ดึงทรัพยากรจากไทล์ที่ผู้เล่นอยู่และเพื่อนบ้านเท่านั้น

ด้วยกริดคุณสามารถค้นหาไทล์ที่ผู้เล่นตั้งอยู่โดยขึ้นอยู่กับตำแหน่งของมันเมื่อเทียบกับจุดเริ่มต้นของกริด

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


0

ฉันใช้พื้นผิว ฉันสร้างโลกทั้งใบบนพื้นผิวหน้าจอปิดและประสานงานกับ x และ y ฉันเปลี่ยนสิ่งเหล่านี้เมื่อผู้เล่นเคลื่อนที่และแต่ละเฟรมวาดสี่เหลี่ยมขนาด 1028 x 768 จากพื้นผิวเป็นแบ็คบุฟเฟอร์โดยใช้ x และ y

สำหรับคนอื่นฉันให้ x และ y แก่พวกเขาและปล่อยให้พวกเขาเคลื่อนที่ไปทั่วโลกตามที่พวกเขาต้องการเมื่อฉันวาดรูปตรวจสอบว่ามี x และ y อยู่ในสี่เหลี่ยม 1028 x 768 หรือไม่และถ้าเป็นเช่นนั้น .

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

ฉันใช้กระเบื้อง 64 x 64 และโลกที่ยิ่งใหญ่ที่สุดที่ฉันเคยใช้มาคือ 50 x 60 แผ่น

ทั้งหมดนี้ทำใน direct x ด้วย c ++


1
ดูเหมือนว่าจะเป็นหมูหน่วยความจำขนาดใหญ่ การรักษาโลกทั้งใบไว้ในพื้นผิวนอกจอจะนำคุณไปสู่ปัญหาหน่วยความจำเมื่อคุณเริ่มอยากทำสิ่งต่าง ๆ เช่นมีเลเยอร์ (ภาพเคลื่อนไหว) สำหรับโลกของคุณและขยายออกไปมากกว่าที่คุณมีอยู่ตอนนี้ มันจะดีกว่ามากในการเก็บข้อมูลเกี่ยวกับโลกและวาดเฉพาะส่วน / วัตถุที่ต้องวาดเมื่อจำเป็นต้องวาด แค่ 2 เซ็นต์ของฉัน :)
Richard Marskell - Drackir

@Drackir ฉันคิดว่าคุณเข้าใจผิด มีเพียงโลกที่ถูกดึงออกจากหน้าจอสิ่งต่าง ๆ เช่นคนอื่น ๆ จะถูกติดตามและวาดลงบนบัฟเฟอร์ของผู้สนับสนุนเมื่อพวกเขาต้องการ นอกจากนี้ฉันไม่เห็นตัวเองทำมากขึ้นในโลกที่ 70 x 70 เมื่อฉันพูดว่าโลกที่ฉันหมายถึงพื้นที่นี้อาจเป็นเมืองดันเจี้ยนหรือในบ้านเมื่อผู้เล่นย้ายระหว่างพวกเขาพื้นผิวหน้าจอปิดถูกสร้างขึ้นใหม่ ใช่ใช้หน่วยความจำ แต่ไทล์ 2d บนไดรฟ์ terrabite ที่ทันสมัยทำให้มันมีความสำคัญน้อยมากและการโหลดเพียงไม่กี่วินาทีนั้นเป็นราคาขนาดเล็กที่จ่ายสำหรับการเลื่อนและภาพเคลื่อนไหวที่ราบรื่น แต่ใช่มีดีกว่าและวิธีการที่ยาก :)
Skeith

ควรเก็บพื้นผิวไว้ในหน่วยความจำการ์ด GFX ไม่ใช่ในฮาร์ดไดรฟ์ อย่างไรก็ตามฉันเชื่อว่าหากการ์ดหน่วยความจำ GFX มีขนาดใหญ่เกินไปมันจะย้ายพื้นผิวไปยัง HD ซึ่งจะทำให้สิ่งต่าง ๆ ช้าลงอย่างมาก เป็นที่ยอมรับมานานแล้วตั้งแต่ฉันได้จัดการกับสิ่งนั้นดังนั้นฉันจำไม่ได้ว่ามันทำงานอย่างไร แต่ฉันเดาว่าตราบใดที่คุณไม่ได้วาดภาพใหญ่เกินไปในโลกมันคงจะโอเค :)
Richard Marskell - Drackir

@Drackir ที่น่าสนใจรู้ฉันไม่เคยคิดเช่นนั้น ฉันพบว่าวิธีนี้ให้การเลื่อนที่นุ่มนวลยิ่งขึ้นถ้าฉันดึงแบบไดนามิกใหม่ ๆ ไปเรื่อย ๆ ฉันคิดว่ามันใช้ได้ดี แต่ฉันต้องดูด้วย
Skeith

ฉันกำลังเล่นเกมที่ฉันมีแผนที่ 31x31 แต่พวกเขาติดกันแบบเคียงข้างกัน ฉันพยายามทำงานจากเอนจิ้นของคนอื่นและพวกเขาจะวาดแผนที่ทั้งหมดที่อยู่รอบ ๆ เครื่องเล่นที่เปิดอยู่ ทั้งหมดเก้าแผนที่ แต่ละแผนที่มีเลเยอร์หลายอัน (ฉันคิดว่า 6) เช่นเดียวกับ 31x31x9x6 = 51894 ไทล์ที่กำลังถูกดึง (สูงสุดไม่เต็มทุกไทล์) ทุกครั้งที่ผู้ใช้สลับแผนที่ นั่นเป็นเรื่องที่ช้าลงอย่างมากสำหรับฉันดังนั้นฉันจึงเขียนซ้ำขั้นตอนการวาดภาพเพื่อวาดเฉพาะภาพวาดที่ล้อมรอบผู้เล่นจนถึง 1 แผ่นผ่านขอบหน้าจอ
Richard Marskell - Drackir

0

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

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