سؤال

أنا عالق في محاولة لمعرفة كيفية تغيير اكتشاف تصادمي للعمل بشكل صحيح، وحصلت على كل ما عندي من كائنات الحائط مكدسة داخل قائمة ثم عندما يتحرك المشغل أنا حلقة من خلال كل كائن جدار واستدعاء طريقة الكشف، هذا إرجاع صحيح أو خطأ اعتمادا على ما إذا كان الكائن داخل الجدار أم لا.

الكشف عن جدار التصادم (X- و Y-Encordate هو موضع الجدار)

public bool DetectCollision(float x, float y)
    {
        if ((x >= this.XCoordinate && x <= (this.XCoordinate + this.BlockWidth)) && (y >= this.YCoordinate && y <= (this.YCoordinate + this.BlockHeight)))
            return true;            
        else
            return false;
    }

لذلك في وظيفة المشغل الخاصة بي عندما يحاول اللاعب التحرك، أقوم بإضافة الحركة إلى X مؤقت، إحداثا واحدا وتحقق مما إذا كانت تلك تصطدم بالجدار، إذا لم يحدث أي شيء، فأنا أذهب إلى تشغيل المشغل.

لكنني لاحظت أنه لا يعمل كما ينبغي أن يكون، إذا أضفت قطعة من الجدار داخل لعبة Gamefield، فحسب فقط من الزاوية اليمنى السفلية للكشف عن الاصطدام؟

طريقة حركة اللاعبين:

        float x, y;
        if (direction == Direction.E)
        {
            x = LiveObjects.player.XCoordinate - MovementSpeed;
            y = LiveObjects.player.YCoordinate;
        }
        else if (direction == Direction.W)
        {
            x = LiveObjects.player.XCoordinate + MovementSpeed;
            y = LiveObjects.player.YCoordinate;
        }
        else if (direction == Direction.N)
        {
            x = LiveObjects.player.XCoordinate;
            y = LiveObjects.player.YCoordinate - MovementSpeed;
        }
        else
        {
            x = LiveObjects.player.XCoordinate;
            y = LiveObjects.player.YCoordinate + MovementSpeed;
        }

        if (GameMechanics.DetectWallCollision(x, y) || GameMechanics.DetectWallCollision((x + LiveObjects.player.BlockWidth), (y + LiveObjects.player.BlockHeight))
        {
            OnPlayerInvalidMove(null, new PlayerEventArgs());
            return;
        }

وحلقة detectwallcollision هي فقط:

foreach (Wall wall in LiveObjects.walls)
        {
            if (wall.DetectCollision(x, y))
                return true;
        }
        return false;

أيه أفكار؟

هل كانت مفيدة؟

المحلول

هناك شيء يزعجني، قلت أن طريقة الكشف التي تحصل على موقف الجدار - ولكن إذا قمت بتفسير الرمز الخاص بك بشكل صحيح، فإنك تسليم المعلمة x و y التي هي الموضع (بعد الحركة) للاعب واليد هذا الموقف لأسفل إلى طريقة الكشف ...

هل قمت بتصحيح التعليمات البرمجية الخاصة بك لمعرفة الإحداثيات التي يتم تمريرها إلى أساليب الاصطدام وتتبع الطرق التي تسير فيها البيانات الخاصة بك؟

إذا لم يكن من الممكن تصحيح التعليمات البرمجية الخاصة بك لأي سبب من الأسباب - اكتب ملف تتبع - أعتقد أن الحل سوف يقع في حضنك؛)

نصائح أخرى

أفترض أن هناك ليس هناك أي شيء في عالمك صغير بلا حدود (أي حجم بكسل). للحصول على تصادم مربع محيط صحيح، عليك أن تفكر في حجم على حد سواء الكائنات، وليس فقط واحد.

boolean intersectsEntity(Entity e)
{
    return (e.position.x <= position.x + size.x) &&
           (e.position.y <= position.y + size.y) &&
           (e.position.x + e.size.x >= position.x) &&
           (e.position.y + e.size.y >= position.y);
}

هذا بالطبع يفترض أن كيان يحتوي على ناقل لموقفه وحجمه. so so size.x == العرض، وحجم == الارتفاع.

شرقا وغربك هي الطريقة الخاطئة حولها. مع نظام تنسيق قدره 0،0 في الجزء العلوي الأيسر، يتزايد بشكل إيجابي أثناء الانتقال أو إلى اليمين، ثم تعني حركة الغرب عادة حركة اليسار، مما يعني انخفاض قيم X، والعكس للشرق. أنت تفعل العكس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top