मैं हाल ही में एंड्रॉइड के लिए एक गेम विकसित कर रहा हूं। यह गेम क्लासिक पोक्मोन गेम्स (काफी जटिल) के समान प्रारूप का है। मुझे बिना किसी समस्या के काफी दूर मिल गया है। हालांकि, मुझे संवाद (टाइपराइटर टेक्स्ट) बॉक्स विकसित करना मुश्किल लगता है जो किसी के साथ बात करते समय स्क्रीन के निचले हिस्से में दिखाई देता है। मैं रेंडर और अपडेट विधियों को अवरुद्ध किए बिना किसी भी इनपुट की प्रतीक्षा करने पर अटक गया हूं (क्योंकि वे सभी एक ही थ्रेड पर चलते हैं)।गेम थ्रेड को अवरोधित किए बिना स्पर्श इनपुट की प्रतीक्षा
यह मेरे गेम लूप का एक सरलीकृत संस्करण है, संरचना को रेखांकित करता है और मैं प्रत्येक फ्रेम क्या करता हूं। दिखाए गए अद्यतन विधि को व्यू # ऑन ड्रा विधि के माध्यम से बुलाया जाता है।
public static void update(Canvas canvas, GameView view){
//time operations (calculating delta etc.)
long cTime = System.currentTimeMillis();
delta = cTime - time;
time = cTime;
globals.put("time", time);
globals.put("delta", delta);//set vars for scripts
camera.applyToCanvas(canvas);//apply camera matrix to canvas
if(map != null)map.update();
if(battle != null)map.update();
Effect.updateAll();//update everything (game logic)
render.load(canvas);//load the canvas into my custom render engine
render();//call render method (shown below)
view.invalidate();//reset view for redraw
}
public static void render(){
render.reset();//clears the canvas using canvas.setColor(Color.BLACK)
if(map != null)map.draw();
if(battle != null)battle.draw();
if(dialog != null)dialog.draw();
if(gui != null)gui.draw(); //draw everything using the renderengine
}
आप देख सकते हैं, इन आपरेशनों सभी खेल घटकों (नक्शा, लड़ाई, GUIs आदि) को अद्यतन और फिर स्क्रीन करने के लिए उन्हें बना देता है। कोड को देखकर, यह स्पष्ट है कि मैं इन परिचालनों को एक ही थ्रेड पर चला रहा हूं, इसलिए यह थ्रेड स्पष्ट रूप से अवरुद्ध नहीं किया जा सकता है (अन्यथा गेम बस रुक जाएगा)।
यह वह जगह है जहां मेरी समस्या है। मैं कुछ बटन के साथ खेल gui में एक का उपयोग करें। ये बटन 8 पूर्णांक (0-8) को आवंटित किए जाते हैं और जब ऊपर बटन दबाया जाता है उदाहरण के लिए, उस इनपुट डेटा को गेम के माध्यम से मौजूदा संवाद या युद्ध या जो कुछ भी चाहिए उसे पारित किया जाता है। ये बटन मुख्य गतिविधि के स्पर्श कार्यक्रमों पर भरोसा करते हैं जहां मोशनवेन्ट, ऑनड्रा विधि के गेम लूप को चलाने के परिणामस्वरूप, गेम के समान ही धागे पर टंस करता है। यहाँ कैसे मैं संवाद संभाल है:
जावास्क्रिप्ट (राइनो पार्सर) के रूप में (चर 'संवाद' में स्क्रिप्ट का एक संवाद वस्तु गुजर)मैं का उपयोग करें: वर d = dialog.show ("हैलो! क्या हाल है।");
इनपुट प्राप्त करने के लिए, मैं getInput विधि को कॉल करता हूं जो संवाद में लेता है, और चयन विकल्पों के रूप में 4 तार तक। यह विधि एक पूर्णांक मान वापस करने के लिए माना जाता है।
var response = dialog.getInput(d, "I'm fine, thank you!", "Who wants to know.");
getInput विधि मेरी संवाद कक्षा में इस प्रकार है:: इस प्रकार यह स्क्रिप्ट के माध्यम से कहा जा सकता है
public static int getInput(Dialog d, String... args){ d.waitingForInput = true; d.lastInput = -1; while(d.waitingForInput || d.lastInput == -1){ //render options //main thread is obviously blocked here. } return d.getLastInput();//returns the d.lastInput and resets waitingForInput and lastInput. The script can then use this value to decide what to do. }
अब मेरी मुख्य प्रश्न को रोके बिना इस पद्धति को चलाने के लिए कैसे है रेंडर और अद्यतन थ्रेड। उपयोगकर्ता विशेष रूप से d.lastInput और d.waitingForInput के मान को सेट करते हैं जब उपयोगकर्ता स्क्रीन के किसी निश्चित क्षेत्र को स्पर्श करता है (जहां गुई का चयन बटन होता है)।
यदि इस प्रश्न में मुझसे पूछने की कोशिश करने के बारे में कोई संदेह है, तो कृपया एक टिप्पणी छोड़ दें क्योंकि मैं काफी थक गया हूं और इसे हल करने का प्रयास करने में कुछ समय बिताया है।
संपादित करें:
मैं एक अलग थ्रेड पर इनपुट चलाने के बारे में सोचा है लेकिन यह अभी भी (जैसे संवाद में चयनित विकल्प बदलना) बुलाया जा रहा से अन्य इनपुट पद्धतियों को अवरुद्ध करने के लिए नेतृत्व करेंगे।
मैं मदद की सराहना करता हूं और समझता हूं कि आप क्या कह रहे हैं लेकिन यह थ्रेड को अवरुद्ध किए बिना मूल्य की प्रतीक्षा करने की समस्या का समाधान नहीं करता है। – rodit