মাইক্রোসফ্ট এক্সএনএ প্ল্যাটফর্মার উদাহরণ, সংঘাত সনাক্তকরণ সঠিকভাবে প্রয়োগ করা হয়েছে?


11

মাইক্রোসফ্ট সরবরাহিত উদাহরণটি দেখে মনে হচ্ছে যেন সংঘর্ষ সনাক্তকরণ (যা আমি দেখতে পাচ্ছি) তাতে একটি ছোট ত্রুটি ঘটবে। যখন ব্যবহারকারী একটি আনপাসেবল টাইলের সাথে সংঘর্ষ হয় তখন ছেদটির গভীরতা গণনা করা হয়। গভীরতার মানগুলি X এবং Y এর ক্ষুদ্রতর ব্যবহারকারীর অবস্থান ঠিক করতে ব্যবহৃত হয় যাতে এটি আর টাইলের সাথে সংঘর্ষে না থাকে। তবে যদি ব্যবহারকারীটি তির্যকভাবে ভ্রমণ করে তবে এর ফলে ব্যবহারকারীটি ঠিক কীভাবে বিন্দুতে শেষ না হতে পারে যেখানে চরিত্রটি প্রথমে টাইলের সাথে সংঘর্ষ করবে?

আমি সম্ভবত ভুল কিন্তু আমি এটি দেখানোর উপায়।

   private void HandleCollisions()
        {
            // Get the player's bounding rectangle and find neighboring tiles.
            Rectangle bounds = BoundingRectangle;
            int leftTile = (int)Math.Floor((float)bounds.Left / Tile.Width);
            int rightTile = (int)Math.Ceiling(((float)bounds.Right / Tile.Width)) - 1;
            int topTile = (int)Math.Floor((float)bounds.Top / Tile.Height);
            int bottomTile = (int)Math.Ceiling(((float)bounds.Bottom / Tile.Height)) - 1;

            // Reset flag to search for ground collision.
            isOnGround = false;

            // For each potentially colliding tile,
            for (int y = topTile; y <= bottomTile; ++y)
            {
                for (int x = leftTile; x <= rightTile; ++x)
                {
                    // If this tile is collidable,
                    TileCollision collision = Level.GetCollision(x, y);
                    if (collision != TileCollision.Passable)
                    {
                        // Determine collision depth (with direction) and magnitude.
                        Rectangle tileBounds = Level.GetBounds(x, y);
                        Vector2 depth = RectangleExtensions.GetIntersectionDepth(bounds, tileBounds);
                        if (depth != Vector2.Zero)
                        {
                            float absDepthX = Math.Abs(depth.X);
                            float absDepthY = Math.Abs(depth.Y);

                            // Resolve the collision along the shallow axis.
                            if (absDepthY < absDepthX || collision == TileCollision.Platform)
                            {
                                // If we crossed the top of a tile, we are on the ground.
                                if (previousBottom <= tileBounds.Top)
                                    isOnGround = true;

                                // Ignore platforms, unless we are on the ground.
                                if (collision == TileCollision.Impassable || IsOnGround)
                                {
                                    // Resolve the collision along the Y axis.
                                    Position = new Vector2(Position.X, Position.Y + depth.Y);

                                    // Perform further collisions with the new bounds.
                                    bounds = BoundingRectangle;
                                }
                            }
                            else if (collision == TileCollision.Impassable) // Ignore platforms.
                            {
                                // Resolve the collision along the X axis.
                                Position = new Vector2(Position.X + depth.X, Position.Y);

                                // Perform further collisions with the new bounds.
                                bounds = BoundingRectangle;
                            }
                        }
                    }
                }
            }

            // Save the new bounds bottom.
            previousBottom = bounds.Bottom;
        }

3
বিয়োগ 1, পিপিএল কেন? প্রশ্নটি আমার পক্ষে বৈধ। তবে এখানে একটি সংক্ষিপ্ত উত্তর: এক্সএনএর সাথে আসা প্ল্যাটফর্মার ডেমোটি যাইহোক, কেবল একটি উদাহরণ। আপনার গেমসের মডেল হিসাবে কঠোরভাবে অনুসরণ করা হবে না। এটি আপনাকে দেখানোর জন্য যে একটি গেম সম্পন্ন করতে পারে। এটি বাস্তবায়ন যদি সর্বোত্তম না হয় তবে আপনার মাথা ঘামানো উচিত নয়।
গুস্তাভো ম্যাকিয়েল

ধন্যবাদ, আমি কেবল উদাহরণ দিয়ে ধরে নিয়েছি যে তারা যা করেছে তা হ'ল সর্বোত্তম উপায় এবং আমি কিছু মিস করছি। আমার জন্য এটি সাফ করার জন্য ধন্যবাদ।
প্রিস্টভ্যালন

উত্তর:


12

তুমি একদম সঠিক । এক্সএনএ প্ল্যাটফর্মার নমুনায় সংঘর্ষের রুটিনগুলির সাথে আমার সমস্যাগুলির অংশ ছিল। তবে আমি নমুনায় প্রদত্ত কোড থেকে শুরু করতে সক্ষম হয়েছি এবং যতক্ষণ না আমি পরীক্ষার প্রতিটি দৃশ্যে আমি এটি ফেলতে পারি তার ধারাবাহিক ফলাফল অর্জন না করা পর্যন্ত এটিকে কিছুটা সংশোধন করেছি।

বিশেষত, যখন প্রাচীরের বিরুদ্ধে তির্যকভাবে সরানোর চেষ্টা করছিলাম তখন আমি যে ধরণের সমস্যার মুখোমুখি হয়েছি। এই অনুমানের কারণে যে নমুনাটি স্থানচ্যুতিটির ক্ষুদ্রতম অক্ষের ভিত্তিতে সংঘর্ষগুলি সমাধান করার জন্য করে তোলে, এর ফলে কোনও দিকের প্রাচীরের বিরুদ্ধে চাপ দেওয়ার সময় চরিত্রটি চলতে সক্ষম হয় না । উদাহরণস্বরূপ, একটি চিহ্ন ব্যবহার করে, সিলিংটি আলিঙ্গন করার সময় এবং বাম থেকে ডানদিকে এর বিরুদ্ধে যাওয়ার চেষ্টা করার সময় আমি আটকে যাব (নির্দিষ্টকরণগুলি মনে করতে পারি না)। সাইন স্যুইচ করা সেই পরিস্থিতিটি সমাধান করবে তবে বিপরীত পরিস্থিতিতে একটি সমস্যা দেখা দেবে। নীচের লাইনটি হ'ল প্রদত্ত বাস্তবায়নের সাথে আমি এটি সমস্ত দিক এবং প্রতিটি দিক থেকে সঠিকভাবে কাজ করতে পারি না - এটি সর্বদা কমপক্ষে একটি ক্ষেত্রে ব্যর্থ হয়।

সুতরাং আমি যে পরিবর্তনগুলি করেছি তার মূলগুলি হ'ল Y অক্ষের উপর চলাচল থেকে আলাদাভাবে দুটি অক্ষরে এক্স অক্ষের উপর চলাচল পরিচালনা করা শুরু করা। আমি আগে এই উত্তরটি সম্পর্কে লিখেছি তাই বিশদ জন্য এখানে যান।

এবং যদি আমি সঠিকভাবে মনে রাখি তবে এর আসল কারণটি ছিল এরকম:

এখানে চিত্র বর্ণনা লিখুন


1
ডেভিড সর্বদা এক্সএনএ-তে বর্ষণ করছে!
গুস্তাভো ম্যাকিয়েল

1
@ গুস্তাভো-গোটোকনু আমি দয়া করে অনুভব করেছি যে এটিকে এখনও সমস্যার আঁকার দরকার: পি
ডেভিড গওভিয়া

1
এই উত্তরটি সবেমাত্র এলো - দুর্দান্ত কাজ! ধন্যবাদ ডেভিড
অস্টিন ব্রুনখার্স্ট

1

আপনি যদি জড়িত প্রতিটি আয়তক্ষেত্রের কেন্দ্র থেকে দূরে থেকে দূরে থেকে আপনার সংঘর্ষগুলি সংশোধন করেন তবে আপনার একাধিক সংঘর্ষ রয়েছে, আপনার কাছে "ঝুলন্ত" সমস্যা থাকবে না।

1) সংঘর্ষের সমস্ত আয়তক্ষেত্র সন্ধান করুন

২) যদি একের বেশি থাকে (আপনার ব্যবহারের ক্ষেত্রে এটি নির্ভর করে যা ঘন ঘন বা বিরল হতে পারে), সবচেয়ে কাছেরটি সন্ধান করুন।

3) সংঘর্ষগুলি একবারে সমাধান করুন এবং অন্যরা এখনও বৈধ সংঘর্ষ কিনা তা পরীক্ষা করুন

গৃহীত উত্তরে সংঘর্ষ এবং ইনপুট যুক্তি জঞ্জাল; শিরোনাম ইত্যাদি নির্ধারণের জন্য এটির পরীক্ষা রয়েছে the

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.