আয়তক্ষেত্র থেকে সংঘর্ষের বিবরণ পান n


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

এক্সএনএ এর আয়তক্ষেত্রগুলি বেশ সীমাবদ্ধ। 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বা যা আপনি অ্যাক্সেস করতে চান তা ব্যবহার করুন।
ssb

4

আপডেট: আপনি যদি মনোগেম ব্যবহার করেন তবে 3.0 বিটা হিসাবে Rectangle Rectangle.Intersect(rectangle, rectangle)উপস্থিত নেই। পরিবর্তে আপনি XNA প্ল্যাটফর্মার কিট থেকে নীচের কোডটি ব্যবহার করতে পারেন।


আপনি এক্সএনএ প্ল্যাটফর্মার স্টার্টার কিটটি ডাউনলোড করতে পারেন ( উইন্ডোজ to এ পোর্ট করা )। এটি একটি সহায়ক সম্প্রসারণ পদ্ধতি সহ জাহাজগুলি যা দুটি আয়তক্ষেত্রের ছেদটি বর্ণনা করে একটি আয়তক্ষেত্র প্রদান করে:

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);
        }
}

এই লিঙ্কের জন্য আপনাকে অনেক ধন্যবাদ। আমি আপনাকে জিজ্ঞাসা করতে পারি কেন আপনার একটি পরিবর্তিত সংস্করণ ব্যবহারের দরকার ছিল? সে বন্দরের কর্মকর্তা?
ড্যানিয়েল রিবেইরো

@ ড্যানিয়েল রিবিরো আমি আমার ইতিহাস যাচাই করেছি এবং স্পষ্টতই আমি এটিকে সংশোধন করি নি। বন্দরটি বেসরকারী; আমি কেবল আসলটি খুঁজে পেলাম না। এটি মনোগেম / সি # এর সাথে কাজ করে, যা আমার পক্ষে যথেষ্ট ভাল ছিল।
ashes999

তবে একটি আসল বন্দর আছে, তাই না? এটি কি এত সাধারণ বৈশিষ্ট্য বলে মনে হচ্ছে না? যাইহোক, আমি মনোগেম ব্যবহার করছি না, কেবল এক্সএনএ। আপনি কি আমাকে এই বন্দরটি ব্যবহার করার জন্য সুপারিশ করবেন?
ড্যানিয়েল রিবেইরো

আমাকে সঠিক উত্তরটি সেট করতে হয়েছিল ssb, তবে এর জন্য আপনাকে অনেক ধন্যবাদ। আমি অবশ্যই এই বন্দরে প্রবেশ করব! অনেক ধন্যবাদ!
ড্যানিয়েল রিবেইরো

1
@ ড্যানিয়েলি রিবেরো আহ, আমি দেখছি আমি মনে করি যে মনোগামে সেই পদ্ধতির অস্তিত্ব নেই, এই কারণেই আমি এই পদ্ধতির ব্যবহারটি শেষ করেছি। চিয়ার্স যদিও।
ashes999
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.