2015-06-23 20 views
5

मैं हाल ही में एंड्रॉइड के लिए एक गेम विकसित कर रहा हूं। यह गेम क्लासिक पोक्मोन गेम्स (काफी जटिल) के समान प्रारूप का है। मुझे बिना किसी समस्या के काफी दूर मिल गया है। हालांकि, मुझे संवाद (टाइपराइटर टेक्स्ट) बॉक्स विकसित करना मुश्किल लगता है जो किसी के साथ बात करते समय स्क्रीन के निचले हिस्से में दिखाई देता है। मैं रेंडर और अपडेट विधियों को अवरुद्ध किए बिना किसी भी इनपुट की प्रतीक्षा करने पर अटक गया हूं (क्योंकि वे सभी एक ही थ्रेड पर चलते हैं)।गेम थ्रेड को अवरोधित किए बिना स्पर्श इनपुट की प्रतीक्षा

यह मेरे गेम लूप का एक सरलीकृत संस्करण है, संरचना को रेखांकित करता है और मैं प्रत्येक फ्रेम क्या करता हूं। दिखाए गए अद्यतन विधि को व्यू # ऑन ड्रा विधि के माध्यम से बुलाया जाता है।

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) को आवंटित किए जाते हैं और जब ऊपर बटन दबाया जाता है उदाहरण के लिए, उस इनपुट डेटा को गेम के माध्यम से मौजूदा संवाद या युद्ध या जो कुछ भी चाहिए उसे पारित किया जाता है। ये बटन मुख्य गतिविधि के स्पर्श कार्यक्रमों पर भरोसा करते हैं जहां मोशनवेन्ट, ऑनड्रा विधि के गेम लूप को चलाने के परिणामस्वरूप, गेम के समान ही धागे पर टंस करता है। यहाँ कैसे मैं संवाद संभाल है:

जावास्क्रिप्ट (राइनो पार्सर) के रूप में (चर 'संवाद' में स्क्रिप्ट का एक संवाद वस्तु गुजर)
  1. मैं का उपयोग करें: वर d = dialog.show ("हैलो! क्या हाल है।");

  2. इनपुट प्राप्त करने के लिए, मैं getInput विधि को कॉल करता हूं जो संवाद में लेता है, और चयन विकल्पों के रूप में 4 तार तक। यह विधि एक पूर्णांक मान वापस करने के लिए माना जाता है। var response = dialog.getInput(d, "I'm fine, thank you!", "Who wants to know.");

  3. 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 के मान को सेट करते हैं जब उपयोगकर्ता स्क्रीन के किसी निश्चित क्षेत्र को स्पर्श करता है (जहां गुई का चयन बटन होता है)।

यदि इस प्रश्न में मुझसे पूछने की कोशिश करने के बारे में कोई संदेह है, तो कृपया एक टिप्पणी छोड़ दें क्योंकि मैं काफी थक गया हूं और इसे हल करने का प्रयास करने में कुछ समय बिताया है।

संपादित करें:

मैं एक अलग थ्रेड पर इनपुट चलाने के बारे में सोचा है लेकिन यह अभी भी (जैसे संवाद में चयनित विकल्प बदलना) बुलाया जा रहा से अन्य इनपुट पद्धतियों को अवरुद्ध करने के लिए नेतृत्व करेंगे।

उत्तर

0

मैंने इसके बजाय इवेंट हैंडलर के रूप में इसे देखने का निर्णय लिया है। जब आवश्यक इनपुट डाउन हो जाता है, तो निर्दिष्ट स्क्रिप्ट गेम द्वारा चलायी जाती है।

0

आप धागे को रोकने के लिए नहीं करना चाहते हैं और आप पहले से ही आधे रास्ते के माध्यम से

Method1 हैं: उपयोग ConcurrentLinkedQueue, ArrayBlockingQueue और स्थिर चर और डाल अपने इसके अंदर मूल्यों के रूप में अपने परिवारों।

Method2: आप

कोशिश एक संदेश कतार सिस्टम की तरह एडाप्टर स्थानीय होस्ट का उपयोग कर टीसीपी/यूडीपी सॉकेट का उपयोग करें और एक ही ConcurrentLinkedQueue साथ उन मूल्यों को प्राप्त करने की कोशिश कर सकते हैं, ArrayBlockingQueue तकनीक किसी भी खुले स्रोत का उल्लेख करने का उपयोग जावा गेम इंजन स्रोत कोड और पहचानें कि उन्होंने कैसे किया है या आप उन गेम इंजनों का उपयोग कर सकते हैं, जैसे कि "जेमोनकीइंजिन" "एलडब्ल्यूजेजीएल" ... आदि

+0

मैं मदद की सराहना करता हूं और समझता हूं कि आप क्या कह रहे हैं लेकिन यह थ्रेड को अवरुद्ध किए बिना मूल्य की प्रतीक्षा करने की समस्या का समाधान नहीं करता है। – rodit

संबंधित मुद्दे