การค้นหาแผ่นที่ไม่ได้แยกในเกมแบบเรียงต่อกัน


9

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

คำถามของฉันคือฉันจะหาจุดตัด / ขอบเหล่านี้ได้เร็วที่สุดเท่าที่จะเป็นไปได้หรือไม่?

ภาพแสดงเส้นสายตาโดยทั่วไปและไทล์ที่ได้รับผลกระทบ

คำตอบ:


12

มีงานจำนวนมากที่ดำเนินการเพื่อแก้ไขปัญหาดังกล่าวในชุมชนชาวโรกาไลค์

นี่คือหน้าเว็บที่แสดงรายการอัลกอริทึมและไลบรารีที่อาจช่วยคุณได้ http://roguebasin.roguelikedevelopment.org/index.php?title=Field_of_Vision


2

นี่ไม่ใช่คำตอบที่สมบูรณ์ แต่หวังว่ามันจะช่วยได้

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

จากนั้นที่รันไทม์การสืบค้นไทล์ที่มองเห็นควรตรงไปตรงมาและรวดเร็วมาก

แน่นอนถ้าคุณมีระดับที่สร้างขึ้นแบบไดนามิกนี่จะไม่ใช้เลย :-)


1

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


0

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


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

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