การสร้างกำแพงในเกมที่เป็นกระเบื้อง


25

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

สำคัญ: ตัวละครสามารถยืนบนแผ่นกระเบื้องที่มีกำแพงได้โดยไม่คำนึงถึงรูปร่างของพวกเขา

สิ่งที่พบได้ทั่วไปสำหรับทั้งสามรูปแบบ: tilemap จะ "เก็บไว้" ในคอนเทนเนอร์แบบมิติเดียว std :: vector (หรือคล้ายกัน) เหตุผลในการอธิบาย (ต่างไปจากเดิม) ในคำตอบของคำถามอื่น

คลาสคอนเทนเนอร์ในเกมแบบเรียงต่อกัน

กลับไปที่ผนัง

A) วิธีการง่ายๆ

ไม่มีอะไรแฟนซีที่นี่ แต่ละคอนเทนเนอร์แบบเรียงต่อกันสามารถเก็บอักขระไม่เพียง แต่วัตถุ Wall หนึ่งหรือหลายซึ่งแนบกับขอบภายในกระเบื้อง

วิธีแรก

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

B) วิธีการอันชาญฉลาด (?)

แทนที่จะปล่อยให้ผู้เล่นตีสองครั้งทั่วทั้งแผนที่ฉันจะเอาชนะพวกมัน ผนังทุกหลังมีสองส่วนที่ติดกับขอบของกระเบื้องจากด้านใน ดังนั้นในการสร้าง "Wall Unit" เดียวฉันจะต้องสร้างวัตถุ Half-Wall สองชิ้นในแผ่นกระเบื้องสองอัน

แนวทางที่สอง

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

C) ชุดยกเครื่องทั้งหมด

หรือฉันอาจสร้างเส้นขอบและมุมเป็นตู้คอนเทนเนอร์แยกต่างหากสำหรับวัตถุในเกม เป็นแบบนั้น.

แนวทางที่สาม

จุดเด่น: ไม่แน่ใจด้วยซ้ำ มันตรงไปตรงมา อย่างแน่นอน. จุดด้อย: มันจะต้องมีการยกเครื่อง ไม่ใช่โค้ดขอบคุณ แต่เป็นเกมที่ช่างคิดในปัจจุบัน - แน่นอน ประโยชน์ไม่ชัดเจนนัก นอกจากนี้ aprroach นี้ต้องมากภาชนะมากกว่าสองคนก่อนหน้านี้ คณิตศาสตร์การจัดทำดัชนีก็จะเจ็บปวดเช่นกัน

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


2
A.2: ในฐานะ A เพียงแค่สองข้างเท่านั้น - ตัวอย่างเช่นเหนือและตะวันตกสามารถมีกำแพงได้ นั่นเป็นวิธีที่ X-Com ใช้
Martin Sojka

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

ดังนั้นกำแพงจึงมองเห็นได้ ไม่เพียง แต่บล็อกขอบของกระเบื้อง ทำไมคุณต้องใช้สองตัวเลือกในส่วน B? ทำไมไม่เพียงแค่ผนังด้านเดียวครึ่งชดเชยลงบนกระเบื้องอื่น ๆ ?
Richard Marskell - Drackir

@eBusiness หากคุณอนุญาตให้มีกำแพงทางทิศเหนือและทิศตะวันตกคุณสามารถจำลองผนังทางทิศใต้และทิศตะวันออกได้โดยการวางกำแพงไว้ทางทิศเหนือและทิศตะวันตกของแผ่นกระเบื้องด้านล่าง
Tetrad

ฉันขอแนะนำให้ไปกับ C. มันเป็นสิ่งที่ฉันทำในjemgine.omnisu.com/wp-content/uploads/2011/06/gnomecolony.pngนี้และใช้งานได้ดี ปัญหาเดียวคือขอบด้านใต้ / ตะวันออกของแผนที่ คุณจะต้องทำอะไรบางอย่างเกี่ยวกับเรื่องนั้น
Blecki

คำตอบ:


14

ฉันจะใช้วิธีการ 'B' ของคุณ

เพื่อหลีกเลี่ยงความต้องการ 'หมวก' เพียงแค่ขยายผนังแต่ละ "ความหนาของผนัง 1/2" ในทั้งสองทิศทาง สิ่งนี้จะสร้างกำแพงที่ทับซ้อนกันซึ่งไดอะแกรมของคุณแสดงให้เห็นแล้วว่านี่ไม่ใช่ปัญหา

ดังนั้นในเมธอด 'B', Pic # 3 กำแพงแนวนอนจะขยายไปทางซ้ายเล็กน้อยและผนังแนวตั้งจะขยายออกไปเล็กน้อย

[ฉันใหม่ที่นี่เพิ่งลงทะเบียน ฉันทำบางสิ่งบางอย่างหายไปหรือไม่เพราะฉันไม่เห็นปุ่ม 'เพิ่มความคิดเห็น' ในโพสต์ต้นฉบับ นั่นเป็นสิทธิพิเศษของคนที่มีชื่อเสียงมากกว่าหรือไม่? หรือฉันกำลังมองเห็นสิ่งที่ชัดเจน? ขออภัยที่เพิ่มสิ่งนี้เป็น 'คำตอบ']


1
นี่คือคำตอบและฉันเชื่อว่าเป็นระดับชื่อเสียง 100 (?) เพื่อแสดงความคิดเห็น ยินดีต้อนรับสู่ Gamedev SE! :)
The คอมมิวนิสต์ Duck

2

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

ข้อดี: การคำนวณและการจัดตำแหน่งเป็นเรื่องเล็กน้อยการปะทะกันเป็นเรื่องเล็กน้อยที่การคำนวณและการชนทั้งหมดจะขึ้นอยู่กับพิกัดของการวางกำแพง

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

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

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


1

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

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

ดูเหมือนว่ามันเป็นเกม 2D จากบนลงล่างที่กำแพงมี "ความกว้าง" ดังนั้นพวกเขาจึงต้องการมุมนั้น (วัตถุ 'หมวก' ของคุณ) นี่เป็น 'กราฟิก' โดยเฉพาะดังนั้นฉันจะไปกับ:

แผนที่ 2 มิติที่มีแผ่นกระเบื้อง (เช่นชนิดของกระเบื้องและเช่น)

แผนที่ 2 มิติที่มีผนัง 2 ด้านเช่น ด้านล่างและขวา (ผนังด้านซ้ายจะเป็น 'กำแพงด้านขวา' ในแผ่นกระเบื้องที่เหลือจากอันนี้)

+ ลอจิกที่วาดผนังทั้งหมดและ 'หมวก' เป็นต้น

ดังนั้นการแยกตรรกะและกราฟิก คุณอาจใช้ "อินเทอร์เฟซ" ดูแลสิ่งต่าง ๆ เช่น SetWall (ThisTile, LEFT, NOWALL) -> การตั้งค่ากำแพงด้านขวาของไทล์ที่เหลือของ ThisTile เป็น "NOWALL" ...

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

++

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