سؤال

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

هذه هي الحلقة الرئيسية لألعابي:

while(true)
    // Perform Ticks until the player makes a mistake
    c = _surfaceHolder.lockCanvas();
    if ((toDraw = rh.performTick()) == null) {
         lose();
         break;
     }
     _surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}

الوظيفة performTick() يعالج منطق اللعبة ويعود null عندما تنتهي اللعبة. draw()يفعل التقديم.كلتا الوظيفتين تعملان بشكل مثالي - المشكلة هي lose(), ، والذي لا يفعل شيئًا سوى بدء نشاط جديد:

    protected void lose() {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(_context, MainMenu.class);
                _context.startActivity(intent);
            }
        });
    }

عندما تنتهي اللعبة، يبدأ النشاط الجديد (القائمة الرئيسية) بشكل طبيعي ولكنه لا يتفاعل مع أي أحداث لمس.لا يوجد إخراج LogCat ولا يحدث أي استثناء.الاسوأ، lose()يعمل بشكل طبيعي عندما يتم استدعاؤه قبل بدء الحلقة الرئيسية.

لقد كنت أعمل على هذا لعدة أيام الآن.حاولت بدء النشاط مباشرة من سلسلة العمل (دون استخدام ملف Handler في lose()) وبحثت في الإنترنت لساعات - لا شيء يساعد.يبدو أن مؤشر ترابط واجهة المستخدم محظور بطريقة أو بأخرى أو عالق في حلقة لا نهائية، وليس لدي أي فكرة عن كيفية إصلاح ذلك.

تم تصحيح كل شيء على جهاز Nexus 4.

بالمناسبة: MainMenu.onCreate() يعمل بشكل طبيعي عندما يبدأ بطريقة أخرى.

الرجاء المساعدة ، ma3o

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

المحلول

لا يمكنك فتح اللوحة القماشية عندما تكون عبارة if صحيحة.ستخرجك الاستراحة من الوقت، وتترك اللوحة القماشية مغلقة.

while(true)
    // Perform Ticks until the player makes a mistake
    c = _surfaceHolder.lockCanvas();
    if ((toDraw = rh.performTick()) == null) {
         lose();
         break;
     }

     // this line won't be executed whether the if statement above is true
     _surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}

يجب عليك أيضًا إلغاء القفل داخل عبارة if (قبل الخسارة () أو بعدها).

نصائح أخرى

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

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