ก่อนอื่นฉันเพิ่งเขียนตรรกะเกมของตัวเองในระยะเวลาหนึ่งดังนั้นฉันต้องขออภัยถ้าสิ่งนี้อาจดูตรงไปตรงมา
ฉันอ่านเกี่ยวกับต้นไม้สี่ต้นและการตรวจจับการชนกันของกริดเป็นอย่างมาก ฉันเข้าใจตรรกะ - โดยทั่วไปจะไม่ตรวจสอบการชนยกเว้นว่าวัตถุอยู่ใกล้พื้น แต่มันก็ไม่เคยถูกกล่าวถึงว่ามันใช้งานจริงอย่างไร
ฉันมีวิธีที่เป็นไปได้สองสามอย่างในหัว แต่ก็ไม่แน่ใจว่าวิธีไหนดีที่สุด
การทดสอบการชนทั่วไป - ไม่มีการเพิ่มประสิทธิภาพ
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
เก็บเพื่อนบ้าน (วิธีที่ 1) แต่ถ้าเราต้องการปรับการชนให้เหมาะสมเพื่อตรวจสอบเฉพาะวัตถุที่อยู่ใกล้ เรายังคงวิ่งผ่านวัตถุทั้งหมดหรือไม่หรือเราสร้างอาร์เรย์ด้วยวัตถุใกล้เพื่อตรวจสอบ?
var objects:Array = new Array();
var neighbours:Array = new Array();
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
neighbours.push(objectA, objectB);
}
}
}
//somewhere else
for(i:int = 0; i < neighbours.length; i++){
//only check neighbours
for(j:int = i + 1; j < neighbours.length; j++){
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
วนรอบวัตถุทั้งหมด แต่เพียงตรวจสอบเพื่อนบ้านเพื่อหาการชนกัน (วิธีที่ 3) ความเป็นไปได้อื่น ๆ คือเรายังคงวนรอบทุกอย่าง แต่ตรวจสอบว่าวัตถุอยู่ใกล้ก่อนทดสอบการชนกันหรือไม่
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
//they are near - check collision!
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
}
จัดเก็บวัตถุในข้อมูลไทล์ (วิธีที่ 3) การใช้ sytem แบบเรียงต่อกันอนุญาตให้มีตัวเลือกอื่น เก็บวัตถุที่อยู่บนไทล์เฉพาะในข้อมูลไทล์เอง ตรวจสอบดูว่าไทล์ของวัตถุใดที่เป็นกระเบื้องล้อมรอบมีวัตถุใด ๆ ที่มันอาจชนกับ:
var ObjectA;
for(var i:int = 0; i < 4; i ++){
//check 4 surrounding tiles from object A
if(Object.currentTile + surroundingTile[i] CONTAINS collidable object){
//check collision!
if(objectA.collidesWith(surroundingTile.object){
//handle collision logic
}
}
}
ฉันมักจะลองดูที่โลกแห่งความจริงเป็นตัวอย่าง ถ้าฉันต้องการเปรียบเทียบรายการที่มีสีเดียวกันมันก็ดูไร้เหตุผลที่จะตรวจสอบทุกรายการแม้ว่าพวกเขาจะไม่ตรงกับสี (วิธีที่ 2 ให้ตรวจสอบแต่ละรายการ) ฉันอาจจะรวบรวมสิ่งของที่มีสีเดียวกัน (วัตถุที่อยู่ใกล้กัน) และตรวจสอบสิ่งเหล่านั้น (วิธีที่ 1) แทนที่จะตรวจสอบทุกอย่าง
นี่ไม่ใช่การเปรียบเทียบที่เหมาะสมเนื่องจากรายการที่อยู่ในการตรวจสอบการชนนั้นมีการเคลื่อนไหวอยู่ตลอดเวลาเพื่อให้คำสั่งซื้อผสมกัน นั่นทำให้ฉันสับสน
มันจะมีประสิทธิภาพมากขึ้นในการตรวจสอบแต่ละรายการซึ่งจะเป็นการขจัดความเครียดในการสร้างอาร์เรย์ของเพื่อนบ้าน
หรือมีประสิทธิภาพมากขึ้นในการค้นหาเพื่อนบ้านจึงไม่ต้องวนซ้ำวัตถุมากมายเพื่อตรวจสอบการชนกันหรือไม่
การเปลี่ยนแปลงข้อมูลในไทล์แต่ละไฟล์ดูเหมือนจะเข้มข้นมากเช่นกันดังนั้นฉันไม่แน่ใจว่าเป็นความคิดที่ดีหรือไม่
ฉันเคยคิดถึงเกมป้องกันหอคอยที่หอคอยต้องการตรวจจับวัตถุหากวัตถุอยู่ในระยะก่อนที่มันจะยิงเข้ามา และดูเหมือนว่าโง่ที่จะตรวจสอบสิ่งของทั้งหมดในบางครั้งจะไม่มีวัตถุใด ๆ อยู่ใกล้เลย
ฉันขอโทษสำหรับการโพสต์ยาวมักจะมีปัญหาในการอธิบายตัวเอง!