2011-09-28 11 views
7

मैं गेम मेमोरी बना रहा हूं, जब आप दो कार्ड चुनते हैं और यदि वे मेल खाते हैं तो उन्हें रखने के लिए, अन्यथा आप उन्हें वापस कर देते हैं। यदि आप तब कार्ड याद करते हैं जिन्हें आपने पहले ही चुना है, तो आप अगले दो कार्डों पर बेहतर अनुमान लगा सकते हैं।मैं जावा जीयूआई में तत्काल अद्यतन कैसे शुरू करूं? (Thread.sleep() के साथ संघर्ष)

समस्या में मैंने repaint() विधि को तुरंत पुनर्स्थापित नहीं किया है।

जब मैं दूसरा कार्ड फ्लिप करता हूं, कोई फर्क नहीं पड़ता, मैं यह दिखाना चाहता हूं कि दोनों कार्ड उन्हें छोड़कर या उन्हें वापस फिसलने से पहले दाएं तरफ फिसल जाए। मैं sleep() पर कॉल करके ऐसा करता हूं।

बेशक अगर मैं repaint() कार्ड को दाएं तरफ फ्लिप करने के लिए कार्ड, एक सेकंड प्रतीक्षा करें, और फिर repaint() फिर से उनके मूल्यों के आधार पर, सहायक छोटे जावा केवल एक बार पेंट करेगा (मुझे सी याद आती है)।

असल में मैं sleep() से पहले एक अद्यतन को लागू करना चाहता हूं। मैंने कुछ अन्य धागे पढ़े हैं जो मूल रूप से कहते हैं कि आपके तर्क और ग्राफिक्स को अलग रखने के लिए दो धागे बनाने का सबसे अच्छा तरीका है, और फिर आप sleep() अपना तर्क दे सकते हैं और अपना जीयूआई अपडेट कर सकते हैं, लेकिन मैं पहले वर्ष सीएस के पहले सेमेस्टर में हूं हाई स्कूल में पाठ्यक्रम, और मैं इसे पाठ्यक्रम के स्तर पर रखना चाहता हूं (हालांकि मैंने गर्मी के वेब विकास और सी में कोडिंग के दौरान काफी समय बिताया)।

क्योंकि मुझे कोड पढ़ने के लिए स्टैक ओवरव्लो प्यार पर सहायक लोगों को पता है, यहां मैं उस कार्यक्रम का हिस्सा हूं जिसका मैं नीचे उल्लेख कर रहा हूं। कक्षा HitArea कार्ड ऑब्जेक्ट है और cards[] सरणी में HitArea है। (मुझे HitArea कक्षा का नाम बदलने के लिए नहीं मिला है)। activeCard1 और activeCard2HitArea उदाहरण हैं जिनका उपयोग मैं उपयोगकर्ता के दो चयनों का ट्रैक रखने के लिए करता हूं, और रिक्त कन्स्ट्रक्टर एक आरक्षित "अदृश्य" HitArea है, हालांकि मैं इसे बाद में शून्य में बदल दूंगा। अंत में, cards.flip() एक toggle बूलियन को निष्क्रिय करता है जो यह निर्धारित करता है कि कार्ड सही है या नहीं।

public void respond(HitArea choice) 
{ 
    if(choice.inGame) 
    { 
     if(activeCard1.value == 0 && activeCard1.value == 0) 
      activeCard1 = choice; 
     else if((!(activeCard1.value == 0) && activeCard2.value == 0) && (activeCard1.id != choice.id)) 
     { 
      activeCard2 = choice; 
      check(); 
     } 

    } 
} 
public void check() 
{ 
    update(); 
    pause(250); 
    if(activeCard2.value == activeCard1.value) 
    { 
     score += 2; 
     activeCard1.inGame = false; 
     activeCard2.inGame = false; 
    } 
    activeCard1.flip(); 
    activeCard2.flip(); 
    activeCard1 = new HitArea(); 
    activeCard2 = new HitArea(); 
} 
public void pause(int milliseconds) 
{ 
    try{ 
     Thread.currentThread().sleep(milliseconds); 
    } 
    catch(InterruptedException e){ 
     System.out.println("Exception: " + e); 
    } 
} 

public void mousePressed(MouseEvent e) 
{ 
    int x = e.getX(); 
    int y = e.getY(); 

    for (int i = 0; i < cardNum; i++) 
     if(cards[i].boundsCheck(x, y)) 
     { 
      repaint(); 
      cards[i].flip(); 
      respond(cards[i]); 
     } 
} 

मुझे कोई संदेह नहीं है कि मेरे कोड में कुछ समस्याएं हैं, इसलिए उन्हें इंगित करने के लिए स्वतंत्र महसूस करें। मुझे लगता है कि मेरी मूल संरचना ठीक है, और मैं इस परियोजना के लिए कई धागे नहीं बनाऊंगा (याद रखें, यह मूल है!)।

उत्तर

14

मुख्य स्विंग थ्रेड, ईडीटी पर Thread.sleep (...) को कॉल न करें। कभी। इसके बजाय एक स्विंग टाइमर का उपयोग करें।

अपनी छवियों को प्रदर्शित करने के लिए जेएलएबल्स का उपयोग करने पर विचार करें, और फिर आप ImageIcons को स्वैप करके अपने कार्ड "फ़्लिप" कर सकते हैं। जब दूसरा कार्ड फ़्लिप किया गया है, यदि कोई मिलान नहीं है, तो xxxx एमएस के लिए देरी के साथ एक गैर-दोहराने वाला स्विंग टाइमर शुरू करें, और टाइमर के एक्शनलिस्टर की कार्रवाई में कॉमांड विधि ने इसे जेएलएबल की पीठ को डिफ़ॉल्ट छवि आइकन पर वापस कर दिया है।

javax.swing.Timer ट्यूटोरियल यहां पाया जा सकता: How to use Swing Timers

संपादित करें:
g.drawString उपयोग के बारे में अपनी टिप्पणी के बारे में: यह अब और भी आसान है क्योंकि तुम सब करने की है स्वैप बाहर है आपके जेएलबेल का पाठ। लेकिन बाद में यदि आप छवियों को प्रदर्शित करने के लिए प्रोग्राम को अपग्रेड करने का निर्णय लेते हैं, तो आपको यह करने के लिए यह सब कुछ मिल गया है।

संपादित करें 2:
एक नया ActionListener वर्ग बनाने के बारे में अपने प्रश्न के बारे में: मैं इस के लिए एक गुमनाम आंतरिक वर्ग का उपयोग करेंगे। उदाहरण के लिए:

int delayTime = 2 * 1000; 
    javax.swing.Timer myTimer = new Timer(delayTime, new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO: put in the code you want called in xxx mSecs. 
    } 
    }); 
    myTimer.setRepeats(false); 
    myTimer.start(); 
+3

मैं "कभी" बोल्ड और इटैलिकिस करता हूं। :) – fireshadow52

+0

मैं बस कुछ g.drawString (...) पाठ प्रदर्शित करता हूं, कोई छवि नहीं। क्या वही लागू होगा? –

+0

धन्यवाद, और किया। :) –

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