ฉันจะตรวจสอบ "ห้อง" ในเกมเลื่อนด้านข้างได้อย่างไร?


24

ฉันต้องการสร้างระบบที่รู้จักอาคารและห้องพักบางประเภทที่คุณสามารถสร้างในเกมได้เช่นเดียวกับที่ Terraria ตรวจจับ "ที่อยู่อาศัย" ในเกมนั้นบ้านสามารถสร้างได้ในโลกแบบกระเบื้องโดยสร้างโซนของบล็อกที่เป็นไปตามเงื่อนไข:

  1. โซนนี้ได้รับการหุ้มฉนวนอย่างสมบูรณ์จาก "นอก" โดยบล็อกที่ผู้เล่นวางไว้
  2. โซนนี้สามารถบรรจุสี่เหลี่ยมผืนผ้าได้ 5x7
  3. มีอย่างน้อยหนึ่งโต๊ะแหล่งกำเนิดแสงหนึ่งตัวและเก้าอี้ในพื้นที่ปิดล้อม
  4. มีประตูที่ยื่นออกมาจากโซน
  5. Terraria มีทั้งพื้นหน้าและพื้นหลังเลเยอร์ พื้นหลังทั้งหมดของโซนจะต้องเต็มไปด้วยบล็อคที่ผู้เล่นวางไว้

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

ตัวอย่างของโซนภายในที่เป็นไปตามข้อกำหนดทั้งหมดของที่พัก

ป้อนคำอธิบายรูปภาพที่นี่


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

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

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

คำตอบ:


37

ฉันไม่คุ้นเคยกับ Terraria แต่ที่สามารถทำได้อย่างง่ายดายโดยใช้อัลกอริทึมน้ำท่วมเติม

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

อัลกอริทึมเริ่มต้นที่ไทล์ที่ตัวละครอยู่ที่ คุณสามารถเริ่มแต่ละ 1 วินาที 2 ... มันเป็นเรื่องของการปรับแต่งเพื่อหาช่วงเวลาที่ดีที่สุด

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

แก้ไข

ตามที่ระบุไว้ในความคิดเห็นคุณสามารถใช้วิธีการอื่นในการเริ่มอัลกอริทึมเช่นเมื่อผู้เล่นเปลี่ยนไทล์หรือไทล์ที่มีam I modified?ตัวแปรที่ถ้าtrueเริ่มอัลกอริทึม อย่างไรก็ตามคุณต้องระวังด้วยวิธีนี้:

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

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

สิ้นสุดการแก้ไข


9
ทำไมไม่เติมน้ำท่วมในแผ่น "บล็อกที่ผู้เล่นวาง" เท่านั้น? สิ่งนี้สามารถป้องกันหรือลดการเติมน้ำท่วมที่ไม่มีที่สิ้นสุดในพื้นที่เปิดโล่ง (ตราบเท่าที่ถ้ำ / แมนชั่นไม่เต็มไปด้วย "บล็อกที่วางโดยผู้เล่น")
jimbo1qaz

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

3
@ กลไก: ฉันค่อนข้างมั่นใจว่า Terraria ไม่ต้องการให้คุณเปลี่ยนพื้น ฉันยังไม่คิดว่าเกมจะเปลี่ยนเป็นห้องที่รับรู้พฤติกรรมตามผู้ที่วางไทล์ไว้ จะเป็นเช่นไรถ้าฉันสร้างห้องที่อยู่ติดกับหน้าผา
Flater

3
Terraria กำหนดให้วางกำแพงพื้นหลังและจะไม่สร้างบ้านที่มีดิน / หินพื้นหลังตามธรรมชาติ มันตรวจสอบบล็อคที่ผู้เล่นวางไว้จริงๆเท่านั้น
loa_in_

3
หากต้องการบันทึก CPU ฉันจะเรียกใช้อัลกอริทึมเมื่อเปลี่ยนบล็อกแล้วเก็บสถานะสำหรับแต่ละบล็อก ด้วยวิธีนี้มันจึงเป็นเรื่องง่ายisRoom()
Herr Derb

3

เช่นเดียวกับ @Ferreira da Selva พูดว่าลองอัลกอริทึมเติมน้ำท่วม แม้ว่าคุณจะสามารถใช้เกณฑ์ที่แตกต่างกันสองสามข้อเมื่อเรียกใช้อัลกอริทึมเพื่อตรวจสอบว่ามีการปิดล้อมหรือไม่

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

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


3

วิทยาศาสตร์คอมพิวเตอร์มีปัญหาอย่างหนัก 2 ข้อ การตั้งชื่อสิ่งการตรวจสอบความถูกต้องของแคชและข้อผิดพลาดแบบออฟไลน์

นี่เป็นปัญหาการทำให้แคชใช้ไม่ได้

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

เพื่อเพิ่มประสิทธิภาพสิ่งนี้คุณอาจต้องการชุดของระดับ "insideness"

"เซลล์" เป็นพื้นที่ที่ล้อมรอบด้วยบล็อกที่ผู้เล่นวางไว้ (ขึ้นกับขนาดที่แน่นอน)

"ห้อง" เป็นเซลล์ที่มีแผ่นพื้นหลัง

"ข้างใน" เป็นห้องที่มีประตูแสงและเก้าอี้

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

เมื่อเซลล์ใหม่ก่อตัวหรือไม่มีรูปแบบตรวจสอบเซลล์นั้นเป็นห้องหรือภายใน

เซลล์สามารถติดตามจำนวนแผ่นพื้นหลังที่ต้องการเป็นห้อง จากนั้นนับอย่างง่าย ๆ เมื่อเซลล์เกิดขึ้นมีการเพิ่มหรือลบไทล์พื้นหลังออกจากเซลล์สามารถพิจารณาได้ว่าเป็นห้องหรือไม่

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

สามารถนับเข้าได้


ดังนั้นเราจึงเพิ่มแผนที่ด้วย "เซลล์" เมื่อมีการเพิ่มหรือลบไทล์เราจะตรวจสอบเซลล์ของตำแหน่งและเพิ่ม / ลดจำนวนในเซลล์

ใช้การเดินตามเข็มนาฬิกา / ทวนเข็มนาฬิกาเพื่อกำหนดการตกแต่งภายในและภายนอกของเซลล์เมื่อมีการเพิ่มหรือลบบล็อกพื้นหน้า เนื่องจากขนาดของเซลล์ถูก จำกัด การเดินนี้จะใช้จำนวนก้าวที่ จำกัด

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

แต่ละตำแหน่งอยู่ในหนึ่งเซลล์มากที่สุดดังนั้นคุณสามารถจัดเก็บรหัสเซลล์ของแต่ละตำแหน่งบนแผนที่หลัก


0

เมื่อใช้อัลกอริธึมเติมน้ำท่วมให้สร้างตัวแปรซึ่งจะเพิ่มขึ้นตามการตรวจสอบไทล์แต่ละอันดังนั้นหากสูงกว่า 35 (7 * 5 ขนาดสูงสุดของห้อง) มันก็หยุดตรวจสอบ!


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