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

StackOverflow https://stackoverflow.com/questions/1241633

  •  12-09-2019
  •  | 
  •  

سؤال

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

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

أنا أعتبر نفسي ما زلت جديدا إلى جافا.

شكرا مقدما.

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

المحلول

قد تحاول النظر في شيء مشابه لنمط الاستراتيجية.

أساسا، تبدأ بالنقر فوق الزر الغرفة على شريط الأدوات. يمر شريط الأدوات وإخبار الشبكة باستخدام ActionListener "مكان الغرفة". يفترض إزالة أي مستمع عمل سابق كان يستمع

ستنفذ Base Action ActionListener بدوره جميع القليل المثالي من المنطق بالنقر الأيمن / الأيمن، والسحب، إلخ.

إذا كان لديك مراحل متعددة لبناء غرفة (قل، وضع الأبواب، ثم النوافذ، ثم فخ الأبواب)؛ سيكون مستمعي العمل مسؤولا عن تسليم التحكم في المرحلة التالية: قليلا من آلة الحالة المحدودة.

لذلك، ابدأ بالنقر فوق زر "الغرفة"، يتم إضافة مستمع "مكان". اسحب المنطقة التي تريد أن تكون الغرفة، "غرفة المكان" تعدل حالة اللعبة، ثم يغير ActionListener إلى مستمع "Place Windows". infinitum الإعلانية ... حتى تنتهي.

مثال بسيط للغاية (غير متركي):

class GridPanel extends JPanel
{
    void SetMouseListener(MouseListener newListener)
    {
        for(MouseListener ml : getMouseListeners())
            removeMouseListener(ml);
        addMouseListener(newListener);
    }
}

class ControlPanel extends JPanel
{
    GridPanel gameGrid;

    void OnRectangleButtonClicked(some stuff)
    {
        gameGrid.SetMouseListener(new PlaceRoomListener(gameGrid));
    }
}

class PlaceRoomListener extends MouseAdapter
{
    GridPanel gameGrid;

    //constructor, etc

    void OnClick(mouse event)
    {
        gameGrid.doCoolStuff();
        gameGrid.SetMouseListener(new PlaceTrapDoorListener());
    }
}

//etc

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

(أيضا، ربما تكون هناك طرق أفضل للمضي قدما في إزالة المستمع الماوس ثم إزالة جميع المستمعين بشكل عشوائي ... كنت في حالة من الاندفاع، آسف)

نصائح أخرى

يبدو أنك بحاجة إلى تحديد نموذج اللعبة / الحالة واحتفظ بها منفصلة عن إجراءات الماوس الخاصة بك.

هل تستخدم MVC؟

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