आयत से टकराव का विवरण प्राप्त करें।


9

मेरे पास एक ब्रेकआउट गेम है, जिसमें कुछ बिंदु पर, मैं इस तरह से गेंद और पैडल के बीच टकराव का पता लगाता हूं:

// Ball class
rectangle.Intersects(paddle.Rectangle);

क्या मेरे पास टक्कर के सटीक निर्देशांक, या इसके बारे में किसी भी विवरण को वर्तमान के साथ मिल सकता है XNA API?

मैंने कुछ बुनियादी गणना करने के बारे में सोचा, जैसे कि टक्कर के क्षण पर प्रत्येक वस्तु के सटीक निर्देशांक की तुलना करना। यह कुछ इस तरह दिखेगा:

// Ball class
if((rectangle.X - paddle.Rectangle.X) < (paddle.Rectangle.Width / 2))
    // Collision happened on the left side
else
    // Collision happened on the right side

लेकिन मुझे यकीन नहीं है कि यह करने का सही तरीका है।

क्या आप लोगों के पास शायद कोई ऐसा कोई सुझाव है, जिसे हासिल करने के लिए मुझे इंजन का इस्तेमाल करना पड़ सकता है? या इस विधि का उपयोग करते हुए भी अच्छा कोडिंग अभ्यास?

जवाबों:


8

XNA की आयतें बहुत सीमित हैं। Rectangle.Intersects()विधि केवल एक बूलियन परिणाम देता है, तो आप और अधिक परीक्षण अपने आप को ऐसा करने के लिए यदि आप विवरण चाहते की आवश्यकता होगी। हालाँकि, Rectangle.Intersect(Rectangle, Rectangle)आप उस आयत को प्राप्त करने के लिए विधि का उपयोग कर सकते हैं जहाँ दो ओवरलैप होते हैं। यह आपको कम से कम गहराई और स्थान पर कुछ जानकारी देगा।


क्या यह get the rectangle where the two overlapफ़ंक्शनलाइन उपलब्ध है XNA APIया मुझे कुछ अतिरिक्त सामान डाउनलोड करना है, जैसे Platformer Starter Kit?
डैनियल रिबेरो

1
यह कौन सी विधि है? मुझे याद नहीं है कि XNA 4.0 समर्थन करता है Rectangle Rectangle.Intersects(...)
ashes999


ठीक है, लौटे आयत के साथ, मैं गेंद से टकराए गए पैडल की स्थिति की जांच कैसे कर सकता हूं?
डैनियल रिबेरो

आप जानते हैं कि चप्पू और गेंद तो अन्तर्विभाजक रहे हैं, तो आप चप्पू आयत के स्थान की जानकारी है कि आप पहली जगह में जाँच की है, यानी उपयोग करें rectangle.Xया rectangle.Yया जो भी आप का उपयोग करना चाहते हैं।
एसएसबी

4

अद्यतन: यदि आप मोनोगेम का उपयोग कर रहे हैं, तो 3.0 बीटा के रूप में Rectangle Rectangle.Intersect(rectangle, rectangle)मौजूद नहीं है। आप इसके बजाय XNA प्लेटफ़ॉर्मर किट से नीचे दिए गए कोड का उपयोग कर सकते हैं।


आप XNA प्लेटफ़ॉर्मर स्टार्टर किट ( विंडोज 7 में पोर्ट किया गया ) डाउनलोड कर सकते हैं । यह एक सहायक विस्तार विधि के साथ जहाज करता है जो दो आयतों के प्रतिच्छेदन का वर्णन करते हुए एक आयत लौटाता है:

static class RectangleExtensions
    {
        /// <summary>
        /// Calculates the signed depth of intersection between two rectangles.
        /// </summary>
        /// <returns>
        /// The amount of overlap between two intersecting rectangles. These
        /// depth values can be negative depending on which wides the rectangles
        /// intersect. This allows callers to determine the correct direction
        /// to push objects in order to resolve collisions.
        /// If the rectangles are not intersecting, Vector2.Zero is returned.
        /// </returns>
        public static Vector2 GetIntersectionDepth(this Rectangle rectA, Rectangle rectB)
        {
            // Calculate half sizes.
            float halfWidthA = rectA.Width / 2.0f;
            float halfHeightA = rectA.Height / 2.0f;
            float halfWidthB = rectB.Width / 2.0f;
            float halfHeightB = rectB.Height / 2.0f;

            // Calculate centers.
            Vector2 centerA = new Vector2(rectA.Left + halfWidthA, rectA.Top + halfHeightA);
            Vector2 centerB = new Vector2(rectB.Left + halfWidthB, rectB.Top + halfHeightB);

            // Calculate current and minimum-non-intersecting distances between centers.
            float distanceX = centerA.X - centerB.X;
            float distanceY = centerA.Y - centerB.Y;
            float minDistanceX = halfWidthA + halfWidthB;
            float minDistanceY = halfHeightA + halfHeightB;

            // If we are not intersecting at all, return (0, 0).
            if (Math.Abs(distanceX) >= minDistanceX || Math.Abs(distanceY) >= minDistanceY)
                return Vector2.Zero;

            // Calculate and return intersection depths.
            float depthX = distanceX > 0 ? minDistanceX - distanceX : -minDistanceX - distanceX;
            float depthY = distanceY > 0 ? minDistanceY - distanceY : -minDistanceY - distanceY;
            return new Vector2(depthX, depthY);
        }

        /// <summary>
        /// Gets the position of the center of the bottom edge of the rectangle.
        /// </summary>
        public static Vector2 GetBottomCenter(this Rectangle rect)
        {
            return new Vector2(rect.X + rect.Width / 2.0f, rect.Bottom);
        }
}

इस लिंक के लिए आपका बहुत-बहुत धन्यवाद। क्या मैं आपसे पूछ सकता हूं कि आपको एक संशोधित संस्करण का उपयोग करने की आवश्यकता क्यों है? क्या वह पोर्ट आधिकारिक है?
डैनियल रिबेरो

@DanielRibeiro मैंने अपना इतिहास चेक किया और जाहिर तौर पर मैंने इसे बिल्कुल भी संशोधित नहीं किया। बंदरगाह अनौपचारिक है; मैं बस मूल नहीं ढूँढ सका। यह मोनोगेम / सी # के साथ काम करता है, जो मेरे लिए काफी अच्छा था।
ashes999

लेकिन एक मूल बंदरगाह है, है ना? क्या यह इतनी सरल विशेषता नहीं है? वैसे भी, मैं मोनो का उपयोग नहीं कर रहा हूं, सिर्फ एक्सएनए। क्या आप अभी भी मुझे इस पोर्ट का उपयोग करने की सलाह देंगे?
डैनियल रिबेरो

मुझे इसका सही उत्तर देना था ssb, लेकिन इसके लिए बहुत-बहुत धन्यवाद। मुझे यकीन है कि इस बंदरगाह में जाओगे! बहुत धन्यवाद!
डैनियल रिबेरो

1
@DanielRibeiro आह, मैं देखता हूं। मुझे लगता है कि मोनोमेग में यह विधि मौजूद नहीं है, यही वजह है कि मैंने इस दृष्टिकोण का उपयोग करके समाप्त किया। चियर्स हालांकि।
as999999
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.