การสร้างระดับผู้เล่นสองมิติแบบวนซ้ำได้อย่างราบรื่นหรือไม่


15

การสนทนาเกิดขึ้นเมื่อเร็ว ๆ นี้เกี่ยวกับวิธีสร้างเกมแบบผู้เล่นหลายคนเลื่อนด้าน 2D ซึ่งสามารถมีการออกแบบระดับการวนซ้ำ

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

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

ภาพ

ในตัวอย่างนี้ผู้เล่น 2 จะคิดว่าพวกเขาเห็นผู้เล่น 1 แต่พวกเขาจะได้เห็นโคลนของเขาและในทางกลับกัน

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


ผู้เล่นได้รับอนุญาตให้เลื่อนถอยหลังไปยังพื้นที่ก่อนหน้าหรือไม่?
XiaoChuan Yu

ใช่ไปๆมาๆแล้วมันให้ผลแบบ "เดินไปรอบโลก" เพื่อที่คล้ายกันว่าโลกในการเป็น Starbound
KenQueso

2
คุณคิดว่าจะทำให้โลกเป็นวงกลมใหญ่หรือไม่? หรือรักษาระดับเป็นวงกลมใหญ่แล้วแปลมันเป็นสเตจ 2D แบน?
Nzall

คุณไม่สามารถจัดตำแหน่งกล้องกับผู้เล่นที่ถูกควบคุมอยู่เสมอ?
Ali1S232

คำตอบ:


16

ระบบที่มีทริกเกอร์เหล่านี้ฟังดูซับซ้อนเกินไปและผิดพลาดได้ง่าย

คุณสามารถห่อตำแหน่งของผู้เล่นโดยใช้โมดูโลกับสิ่งที่ชอบ playerPositionX = playerPositionX % mapWidth

วิธีนี้เมื่อผู้เล่นของคุณถึงจะรีเซ็ตกลับไปที่ 0playerPosition == mapWidthplayerPosition

โซลูชันนี้สามารถขยายได้ด้วยระบบการแสดงผลทั้งหมด


1
สิ่งนี้จะไม่มีปัญหาเกิดขึ้นเมื่อผู้เล่นเห็นผู้เล่นที่รีเซ็ตตำแหน่งเทเลพอร์ตออกไปหรือไม่
KenQueso

คุณจะขยายสิ่งนี้ไปยังระบบการแสดงผลอย่างไร
Mikael Högström

คุณสามารถมีผู้เล่นอยู่ตรงกลางกล้องและวางแผนที่ไว้รอบ ๆ เหมือนแผนที่ในอารยธรรมในโหมด Earth อีกวิธีการหนึ่งที่สามารถแสดงส่วนที่มองเห็นได้ของผู้เล่นทั้งสองด้านของแผนที่
Exaila

4
@ MikaelHögströmเพียงสร้างภาพตามปกติ แต่สิ่งที่อยู่ใกล้กับขอบด้านขวาจะต้องแสดงผลเป็นครั้งที่สองทางด้านซ้าย (เช่นที่pos - map_width)
Mario

1
ทุกที่ในรหัสของคุณที่คุณกำลังมองหา 'วัตถุใดที่อยู่ในพิกัดนี้' หรือ 'พิกัดของวัตถุนี้คืออะไร' คุณจะทำให้มันเป็น xcoord% mapWidth เป็นการยากที่จะบอกว่าไม่มีรหัสของคุณ แต่นั่นอาจทำให้การแสดงผลถูกต้อง
Tin Man

13

วิธีการแก้ปัญหาที่ยอมรับคือการใช้พอร์ทัล ในตัวอย่างของคุณมีเพียงหนึ่งระดับเท่านั้นยกเว้นพอร์ทัลที่เชื่อมต่อปลายด้านซ้ายและขวา

สิ่งใดก็ตามที่เคลื่อนที่ข้ามพอร์ทัลนั้นจะมีพิกัดที่แปลไปยังส่วนอื่น ๆ ของพอร์ทัลดังนั้นหากมีสิ่งใดเคลื่อนย้ายไปทางซ้ายพอร์ทัลจะปรากฏอีกครั้งทางด้านขวาของระดับและในทางกลับกัน

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

ส่วนที่น่าเบื่อคือทุกอย่างที่เกี่ยวข้องกับการระยะทางหรือ pathing จะยังต้องพอร์ทัลการสนับสนุน ซึ่งรวมถึง AI, แอลกอสสายสายตา, การลดทอนเสียงและอื่น ๆ

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


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

6

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

ผู้เล่นแต่ละคนแบ่งปันข้อมูล แต่มีมุมมองของตัวเองของข้อมูล หน้าต่างของพวกเขามีประชากรแตกต่างกันไปขึ้นอยู่กับว่าพวกเขายืนอยู่ที่ไหนในโลก

ซึ่งหมายความว่าไม่จำเป็นต้องสร้างโคลนหรือส่งผ่านทางไกลทุกคน โดยพื้นฐานแล้วคุณกำลังสร้างโคลนเพียงแค่แสดงตัวอักษรไปยังหน้าจอของกันและกัน


3

ตัดการเชื่อมต่อการเรนเดอร์จากโลกและคุณสามารถทำการเรนเดอร์และแก้ไขการเรนเดอร์โดยไม่ต้องหันไปใช้อุปกรณ์โคลนหรือเทเลพอร์ต

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

ประการที่สองสำหรับการแสดงผลคุณจะทำโมดูโลในตำแหน่ง ด้านซ้ายของหน้าจอคือ "ฐาน" และด้านขวาคือ "ฐาน + ขนาด" ดังนั้นคุณมองผ่านโลกของคุณเพื่ออะไรในช่วงนั้น คุณจะค้นหาช่วงโมดูโลซึ่งแมปกลับไปที่0...Widthจริง

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

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

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


1

ฉันคิดว่าวิธีการที่เหมาะสมเพียงอย่างเดียวคือการทำให้โลกที่คุณใช้อยู่ในโครงสร้างข้อมูลต้นแบบโปร่งใสอย่างสมบูรณ์สำหรับเกมและผู้ใช้ ดังนั้นในระดับต่ำคุณจะมีฟังก์ชั่น mapCoordinate () ซึ่งห่อพิกัดที่แท้จริงของคุณเข้ากับแผนที่ทรัพยากรของคุณ ...

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

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


1

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

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