Breakout Collision: ตรวจจับด้านข้างของการชน


10

ฉันกำลังเขียนโคลน breakout (เกมแรกของฉัน) และฉันติดอยู่กับวิธีที่ฉันคิดออกว่าด้านใดของก้อนอิฐที่ถูกกระแทก

ฉันมีวิธีตรวจจับการชนกันที่มีลักษณะดังนี้:

DetectCollision(Object a, Object b)

   x = distance(a.x, b.x);
   y = distance(a.y, b.y);

   if (x is smaller than the combined width &  y is smaller is than combined height {
       return true;
   }
return false;  

มันใช้งานได้ดี แต่ฉันต้องรู้ด้านของการชนและตำแหน่งที่สัมพันธ์กับศูนย์กลางเพื่อตอบสนองอย่างถูกต้อง

ฉันใช้เวลาสองสามวันที่ผ่านมาสอดแนม แต่ก็หายไป

คำตอบ:


13

ทั้งหมดนี้สามารถรวบรวมได้จากตำแหน่งของลูกบอลที่สัมพันธ์กับตำแหน่งของอิฐที่ชนกับ

เมื่อคุณตรวจพบการชนกัน:

if(ballPosition.y <= brickPosition.y - (brickHeight/2))
  //Hit was from below the brick

if(ballPosition.y >= brickPosition.y + (brickHeight/2))
  //Hit was from above the brick

if(ballPostion.x < brickPosition.x)
  //Hit was on left

if(ballPostion.x > brickPosition.x)
  //Hit was on right

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


1
แต่คุณจะใช้สิ่งนี้เพื่อเปลี่ยนตำแหน่งของเครื่องเล่นได้อย่างไรเนื่องจากผู้เล่นย้ายภายในก้อนอิฐเงื่อนไขเหล่านั้นจะถูกพบหลายอย่างและหากคุณรีเซ็ตค่า x ที่ต้องการไปที่ขอบของกำแพงตัวอย่างเช่นถ้ามันกดปุ่ม ของอิฐตั้งค่า x ที่ต้องการติดกับกำแพงจากนั้นมันจะไม่ทำงานจริง ๆ เพราะเมื่อคุณตรวจสอบตำแหน่งทางทฤษฎีของตัวละครเพื่อดูทิศทางที่มันชนกันจากหลายเงื่อนไขเหล่านี้จะเป็นไปได้อย่างไร ใช้สิ่งนี้เพื่อรีเซ็ตเครื่องเล่นคุณจำเป็นต้องเพิ่มสิ่งอื่น ๆ ในตอนท้ายของทุก ๆ ครั้งถ้าใช่หรือไม่?
bluejayke

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

8

คุณสามารถใช้ Vector Math เพื่อค้นหามุมระหว่างพวกเขา!

นี่คือคำตอบสั้น ๆ :

ballToBrick = ballPosition - brickPosition;
ballToBrick.Normalize();
brickFacing = Vector2(0,1).Normalize();


float angle = acos( Dot(ballToBrick, brickFacing) );

Brick หันหน้าไปทางเวกเตอร์หากินมันเป็น "จุดเริ่มต้น" ของการคำนวณมุม และถ้าคุณต้องการให้เวกเตอร์ชี้ขึ้นให้ทำ (0, 1), ชี้ไปทางซ้าย (-1, 0), ขวา (1, 0), ชี้ลง (0, -1) สมมติว่าคุณอยู่ในแกน OpenGL ที่ขึ้นและลงเป็นบวก

หากคุณไม่รู้นี่คือคำจำกัดความของแต่ละฟังก์ชันที่ใช้:

Vector2.Normalize()
{
    float length = squareroot(x * x + y * y);
    x = x / length;
    y = y / length;
    return this;
}

Dot(Vector2 a, Vector2 b)
{
    return a.x * b.x + a.y * b.y;
}

( https://en.wikipedia.org/wiki/Dot_product )

เอกสารอ้างอิง: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/

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