سؤال

وأريد أن يكون لعبة حيث سيتم نقل وجهة النظر حول ما يصل الماوس الحافة الخارجية من النافذة (على غرار العديد من الألعاب RTS). لقد قرأت أن هناك فوق هام عند استخدام MouseMotionListener.

هل هناك ربما يكون وسيلة من وجود عنصر شفاف الثاني ضمن إطار اللعبة (JPanel) التي لا تؤثر على لعبة اللعب، ولكن سيتم تسجيل عندما يترك الماوس المكون الداخلي عبر MouseAdapter.mouseEntered () / mouseExited ()؟

boolean mouseOnScreen;
boolean mouseWithinInnerComponent; //is (10 <= mouse.x <= screenWidth - 10) && (10 <= mouse.y <= screenHeight)

if(mouseOnScreen && !mouseWithinInnerComponent)
{
    //do something...
}

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

boolean mouseOnScreen;
boolean mouseWithinTopComponent; //is (0 <= mouse.y <= 10)
boolean mouseWithinBottomComponent; //is (screenHeight - 10 <= mouse.y <= screenHeight)
boolean mouseWithinLeftComponent; //is (0 <= mouse.x <= 10)
boolean mouseWithinRightComponent; //is (screenWidth - 10 <= mouse.x <= screenWidth)

if(mouseOnScreen)
{
    if(!mouseWithinBottomComponent)
    {
        //move view up
    }
    if(!mouseWithinTopComponent)
    {
        //move view down
    }
    if(!mouseWithinLeftComponent)
    {
        //move view right
    }
    if(!mouseWithinRightComponent)
    {
        //move view left
    }
}

وبالضبط كم فوق موجود مع MouseMotionListener؟ وهذا من شأنه أو طريقة مماثلة ربما تكون أكثر كفاءة إذا كان المكتشفة تحتاج فقط إلى أن تكون على طول حدود إطار اللعبة؟

ملحوظة: سوف تستخدم هذه في وضع إطارات وكذلك من الممكن تطبيق ملء الشاشة

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

المحلول

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

وتنفيذ بلدي يتكون من 4 قطع أساسيين: جزء التمرير، مناطق مستطيلة، جهاز توقيت، وMouseMotionListener

أولا، أنا خلق لوحة، ودعا AutoScrollPane، الذي يمتد JScollPane. على الرغم من أنه هو JScrollPane، يمكنك إخفاء أشرطة التمرير. وهذا ما يسمح لي للاستفادة من وظائف لتحريك العرض حول على خريطة أو ما شابه ذلك كما هو الحال في لعبة RTS كما تقول.

وثانيا، بالنسبة للمناطق التمرير، أنا فعلا 8: ن، شمال شرق، ه، حد ذاتها، ق، جنوب غرب، وث وشمال غرب (أي "الشمال" شمال شرق "، وما إلى ذلك)، مع الأقطار تسمح قطري . التمرير I تنفيذها ببساطة كما Rectangles لم يتم اختيارهم على الشاشة أو أي شيء - أنا فقط مثيل 8 المستطيلات في صفي الحجم المناسب ومع الإحداثيات التي تتطابق مع المناطق من النافذة أسمح الواقع نافذتي إلى أن يكون حجمها، ولذا فإنني تغيير حجم المستطيلات إذا لزم الأمر.

وثالثا، لدي جهاز توقيت التي يمكن أن تحول على نحو متقطع. عندما يتم تشغيله، كل "القراد" يولد Runnable. هذه المهمة هي Runnable's للتمرير العرض لوحة في الاتجاه المناسب مسافة معينة. يتم تسليم كل Runnable إلى قائمة انتظار الحدث سوينغ.

وأخيرا، لدي MouseMotionListener. انها وظيفة هي لاعتراض الماوس دخول والخروج، ونقل الأحداث. في كل مرة يتلقى حدث، فإنه يتحقق موقع الماوس الحالي وما إذا كان يتقاطع أحد المستطيلات. والتي على أساسها المستطيل، فإنه يختار الاتجاه للتمرير. ومن يتتبع ما إذا كان الماوس في منطقة التمرير على الحدث السابق أم لا. وبناء على هذه المعلومات فهو يعرف ما إذا كان ينبغي البدء في التمرير، ووقف التمرير، أو مجرد السماح أيا كان يجري متابعة. أردت بلدي التمرير لوقف إذا يذهب الماوس خارج الجزء، وبالتالي فإن استخدام خروج / دخول الأحداث. على أي حال، لبدء التمرير، والمستمع يحفظ بعيدا عن الاتجاه والمسافة للتمرير ويحكي توقيت لبدء. عندما حان الوقت لوقف التمرير (مثل عند إنهاء الماوس منطقة التمرير)، فإنه يقول الموقت للتوقف.

واستغرق الأمر بعض الوقت لاختيار الحق الموقت تحبب وانتقل بعد للالتمرير السلس، لكنه يعمل بشكل جيد جدا. آمل أن يكون هذا المخطط يوفر بعض المساعدة.

نصائح أخرى

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

وهناك شيء خاطئ مع MouseMotionListener عندما قرأت عن الحمل ربما كان حصول exmaple واحد محدد

وأي شيء يمكنك القيام به في أي لغة برمجة يمكن القيام به سيئة أو خاطئة.

إذا كنت الالتفات الى ما تفعله في المستمع الخاص يجب أن يكون كل شيء بخير

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