การนำกล้อง / วิวพอร์ตไปใช้กับเกม 2D


20

วิธีการที่ใช้ประโยชน์ได้จริงในการนำกล้อง / วิวพอร์ตไปใช้กับเกม 2D คืออะไร?

ฉันได้อ่านแล้วฉันควรจะเก็บตำแหน่งของวัตถุในโลกแทนตำแหน่งที่สัมพันธ์กับหน้าจอหรือไม่?

สถานการณ์ปัจจุบัน:

ฉันใช้เกม 2D ง่าย ๆ ที่ฉันโหลดวัตถุและระดับจากไฟล์ XML ปัจจุบันไฟล์ XML ระดับมีลักษณะดังนี้:

<map>
   <tile obj="ground" x="0" y="555" />
   <tile obj="ground" x="16" y="555" />
   <tile obj="ground" x="32" y="555" />
   ...
</map>

วัตถุทั้งหมดมี 2d-vector "position" ที่เก็บตำแหน่งปัจจุบันของพวกเขาบนหน้าจอ

สิ่งที่ฉันต้องการให้เป็น:

ภาพประกอบวิวพอร์ต / gameworld

ในรูปภาพ:

  • กล้องมีทั้งแบบ 800x600 หรือ 640x480
  • บล็อกและสไปรต์คือ 16x16 พิกเซล
  • ขนาดโลกอาจแตกต่างกันไป
  • พิกัดที่ควรจะเป็นมาตรฐานเมื่อเทียบกับโลกไม่ใช่ที่หน้าจอ?
  • ตำแหน่งวิวพอร์ตที่สัมพันธ์กับ x, y ของผู้เล่นและเคลื่อนไหวเมื่อผู้เล่นมาถึงบริเวณที่กล้องตาย (คล้ายกับวิดีโอนี้ )

ฉันขอตัวอย่าง / บทความหลอก ๆ แต่ถ้าคุณจำเป็นต้องรู้ว่าฉันใช้อะไรในการพัฒนา: SDL & C / C ++


1
เพิ่มลิงค์ที่สามของคุณในความคิดเห็นที่นี่และฉันสามารถเพิ่มในคำถามของคุณ
MichaelHouse

นี่คือสิ่งที่ฉันหมายถึงโซนกล้องตาย: youtube.com/watch?v=89TRXUm8jMI
bluekirai

สำเนาซ้ำที่เป็นไปได้ของgamedev.stackexchange.com/questions/38672/…
wolfdawn

สวัสดี @Arthur Wulf White สนใจที่จะอธิบายอย่างละเอียดไหม? ขอบคุณ
bluekirai

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

คำตอบ:


19

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

สำหรับการวาดวัตถุที่กล้องสามารถ "เห็น" คุณต้องวาดวัตถุทั้งหมดที่สัมพันธ์กับพิกัดโลกของกล้อง ในการคำนวณตำแหน่งหน้าจอของวัตถุที่สัมพันธ์กับกล้องให้ทำดังนี้

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

เห็นได้ชัดว่ามีวัตถุบางอย่างที่ไม่สามารถมองเห็นได้จริงในกล้องดังนั้นคุณอาจต้องการใช้ระบบการคัดแยกมุมมอง


2

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

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

ใน SDL คุณสามารถอาจจะเพียงแค่ inline OpenGL เรียกเช่นและglOrthoglTranslate

ดูกระทู้นี้


บางคนสามารถอธิบาย downvote ได้บ้าง? มันสมเหตุสมผลแล้ว
สวัสดีชาวโลก

1
ฉันไม่ได้ลงคะแนน แต่ฉันคิดว่าเป็นเพราะนี่ไม่ได้ตอบคำถาม คำถามคือเกี่ยวกับวิธีการคำนวณบางอย่างไม่ว่าจะมีประสิทธิภาพมากกว่าหรือง่ายกว่าในการทำ GPU กับ CPU OP ยังกล่าวอีกว่าเขากำลังมองหาตัวอย่างเทียม ๆ ไม่ต้องสงสัยเลยว่าการใช้การผสมผสานระหว่างกล้อง / โลก / แบบจำลองจะมีประสิทธิภาพมากขึ้นดังนั้น mklingen จึงมีจุดน้อยที่สุด
Dan Watkins

คำตอบนี้ไม่เลวเลย! มันมีความเฉพาะเจาะจงมากขึ้นสำหรับการพัฒนา OpenGL / DX แต่เป็นวิธีการที่ถูกต้องในขณะที่คุณสามารถคำนวณเมทริกซ์การแปลตาม Coors กล้องและย้ายวัตถุผ่านทางกล้องเมทริกซ์โดยไม่ต้องเปลี่ยนตำแหน่งจริง
nenchev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.