ब्रेकआउट टक्कर: टक्कर का पक्ष का पता लगाना


10

मैं एक ब्रेकआउट क्लोन (मेरा पहला गेम) लिख रहा हूं और पूरी तरह से अटका हुआ हूं कि मैं कैसे पता लगाता हूं कि ईंट किस तरफ से टकरा गई थी।

मेरे पास एक टकराव का पता लगाने का तरीका है जो इस तरह दिखता है:

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

यह देखने के लिए कि दो गेंद ईंट के ऊपर या नीचे है या नहीं। यदि न तो यह ईंट के बगल में होना चाहिए, तो जांचें कि यह किस तरफ है। यह उस स्थान पर फिट करने के लिए आवश्यक है जहाँ से आप स्थान ले रहे हैं, अर्थात ईंटपोज़ ईंट का केंद्र है या ईंटपोज़िशन शीर्ष बाएँ कोने में है।


1
लेकिन आप खिलाड़ी का स्थान बदलने के लिए इसका उपयोग कैसे करेंगे, क्योंकि यह खिलाड़ी एक ईंट के अंदर चला जाता है, उन स्थितियों में से कई मिलेंगे, और यदि आप वांछित x को दीवार के किनारे पर रीसेट करते हैं, उदाहरण के लिए यदि यह कुंजी मारा एक ईंट को दीवार के ठीक बगल में वांछित x सेट करें, तो यह वास्तव में काम नहीं करेगा क्योंकि जब आप चरित्र की सैद्धांतिक स्थिति की जांच करते हैं कि यह किस दिशा से टकरा रहा है, तो इनमें से कई शर्तों को पूरा किया जाएगा, तो आप कैसे करेंगे खिलाड़ी को रीसेट करने के लिए इसका उपयोग करें, क्या आपको प्रत्येक के अंत में और जोड़ने की आवश्यकता है)?
ब्लूजैके

जहां तक ​​मुझे पता है कि ब्रेकआउट प्रकार के खेल में "खिलाड़ी" पैडल है। पैडल एक ईंट के अंदर नहीं जा रहा है, और न ही आप ईंटों के साथ गेंद की बातचीत के आधार पर पैडल की स्थिति बदल रहे हैं। यदि आप ऐसा कर रहे हैं, तो आपको अतिरिक्त तर्क की आवश्यकता नहीं है, बस जब तक आप सभी टकराव की जाँच नहीं कर लेते, तब तक पुन: प्रस्ताव की प्रक्रिया न करें। या चेक के सही होने के बाद वापस लौटें।
MichaelHouse

8

आप उनके बीच के कोणों की खोज के लिए वेक्टर गणित का उपयोग कर सकते हैं!

यहाँ एक छोटा जवाब है:

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


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

ईंट का सामना करना पड़ एक मुश्किल वेक्टर है, यह कोण की गणना का "प्रारंभ बिंदु" है। और यदि आप वेक्टर को इंगित करना चाहते हैं, तो इसे (0, 1), बिंदु बाएं (-1, 0), दाएं (1, 0), बिंदु नीचे (0, -1) बनाएं। यह मानते हुए कि आप ओपनजीएल अक्ष में हैं, जहां ऊपर और दाएं सकारात्मक हैं।

यदि आप नहीं जानते, तो यहां इस्तेमाल किए गए प्रत्येक फ़ंक्शन की परिभाषाएँ हैं:

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/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.