سؤال

أنا جديد على Android وأتطور لعبة صغيرة تستند إلى وندند (www.andengine.org).

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

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

لقد قرأت كل ما يمكنني العثور عليه على دورة حياة التطبيق وحاولت تعيين كائنات مختلفة على Null في طريقة OnDestroy () ولكن لم يحدث أي فرق. من الواضح أن هناك شيئًا ما "يتسكع" من أول تطبيق للتطبيق ويتسبب في مشكلات عند بدء تشغيله للمرة الثانية. الرجاء المساعدة ، كان 24 ساعة من غوغلينغ وتدمير عقلي غير مثمر.

شكرا ، ستيف

PS نفس السلوك عند تشغيله في المحاكي.

تحديث:

لقد بحثت عن الكود الخاص بي أكثر:

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

باستخدام Andengine ، يجب على المرء تجاوز OnloadScene (). في هذه الطريقة ، تحدد ما تريده على الشاشة عند بدء التشغيل وتُرجع الطريقة كائن مشهد. يعالج المشهد ما تراه على الشاشة ، لذلك إذا كنت تريد أن تقول ، فأضف خطًا جديدًا (أو العفريت ، أو أي شيء آخر) على الشاشة ، فأنت تتصل myscene.addentity (myLine). لقد قمت بإنشاء فئة نشاط رئيسية وفئة تسمى MyLine التي ترسم الخط.

نشاطي الرئيسي:

public class LineTest extends BaseGameActivity {

@Override
    public Scene onLoadScene() {
        scene = new Scene(1);
        myLine = new MyLine();
        myLine.displayLine();   
        return scene;
    }
}

فئة MyLine:

public class MyLine {

    static final Scene SCENE = LineTest.scene;
    static final int LINE_WIDTH = 4;

    Line line = new Line(0,0,0,0);

    public MyLine() {
    }

    public void displayLine() {
        line.setLineWidth(4);
        line.setColor(1f, 0f, 0f);
        line.setPosition(10, 10, 400, 400);
        SCENE.getBottomLayer().addEntity(line); 
    } 

    public void removeLine() {
        SCENE.getBottomLayer().removeEntity(line);
    }
}

قد تلاحظ مشكلة مع ما سبق ، في دفاعي أنا جديد على Java و OOP. يستخدم نشاطي مشهدًا واحدًا فقط ، لذلك فكرت ، داخل فصل MyLine الخاص بي ، يمكنني إعلان المشهد كنهائي ثابت لأنه لن يتغير. خاطئ - ظلم - يظلم! تصحيح البرنامج للبرنامج ، وجدت أن المشهد النهائي الثابت بمجرد تعيينه ، ولا يتغير أبدًا ، حتى بعد إيقاف البرنامج (باستخدام المفتاح الخلفي) وإعادة تشغيله. ومع ذلك ، عندما يقوم البرنامج بإعادة تشغيل مشهد الكود = مشهد جديد (1) ؛ يخلق مشهدًا جديدًا مع معرف جديد ، وبالتالي يشير المشهد النهائي الثابت إلى المشهد القديم وليس المشهد الجديد ، وبالتالي لا يتم إنشاء خط في المشهد الجديد.

لقد وجدت أن خيارين يعملان على حل هذا:

أيضاً:

Scene SCENE = LineTest.scene;

أو:

static Scene SCENE;

وفي المنشئ:

    SCENE = LineTest.scene; //I could also pass scene as param to 
constructor which may be better OOP practice.

أظن أن مشكلاتي الأخرى في تطبيق اللعبة كلها مرتبطة بإعلان الأشياء على أنها نهائية ثابتة أو ثابتة عندما لا ينبغي أن تكون.

هل هناك قاعدة من الإبهام يمكنني استخدامها عند تحديد أي نوع من المتغيرات (والطرق) يجب أن تكون؟

استكمال: كان لدي ثلاثة متغيرات في فئة اللعبة التي تم إعلانها كنهائي ثابت عندما كان ينبغي أن يكون ثابتًا. تغييرها إلى ثابت وتعيينها في المُنشئ قد حل جميع المشكلات ، Woohoo! {:-)

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

المحلول

لماذا لديك حتى حقل ثابت في صفك عندما يكون خاصًا بالمثال؟ اجعله متغيرًا مثيلًا أو نحو ذلك.

يمكنك أيضًا إعادة ضبط جميع الحقول الثابتة يدويًا عند فتح الطلب ، لكن هذا سيكون جداً البشع.

نصائح أخرى

من الواضح أن هناك شيئًا ما "يتسكع" من أول تطبيق للتطبيق ويتسبب في مشكلات عند بدء تشغيله للمرة الثانية.

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

كن حذرا مع استخدام المتغيرات النهائية الثابتة !!! حل لمشاكلي أعلاه.

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

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