2009-02-26 11 views
6

संपादित करें: यह अब मुझे बहुत अधिक समझ में आता है कि मैंने कोड से एक कदम दूर किया है, मदद के लिए धन्यवाद।जे 2 एमई "टर्न-आधारित" गेम के लिए Gameloop

बस कोडिंग डरावनी के माध्यम से दूसरे दिन ढेर अतिप्रवाह पाया और यह शानदार लग रहा है। चित्रा कि मैं समुदाय को एक समस्या के बारे में पूछूंगा जिसे मैं वर्तमान में काम करने की कोशिश कर रहा हूं।

मैं मध्य 2.0 फोन के लिए j2me का उपयोग कर एक roguelike sortof खेल विकसित कर रहा हूँ। यह परियोजना अभी भी विकास के बुनियादी चरणों में है क्योंकि मुझे पता चलता है कि यह कैसे काम करेगा। जिस हिस्से में मैं वर्तमान में फंस गया हूं उसे थ्रेडिंग के साथ करना है।

इस गेम में एक कस्टम HaxCanvas वर्ग है जो GameCanvas और कार्यान्वयन को चलाने योग्य बनाता है। यह रन विधि कॉल repaint() और फिर 50 एमएस के लिए सोता है, जिसके परिणामस्वरूप 20 एफपीएस की फ्रेम दर होती है। यह मुझे बाकी के खेल को हर जगह पेंट करने के बिना लिखने की अनुमति देता है और बाद में एनिमेशन और प्रभावों को आसान बनाना चाहिए। (कम से कम सिद्धांत में)।

खेल का प्रवाह गेममैनेजर क्लास द्वारा नियंत्रित होता है, जो मानचित्र पर सभी एनपीसी के माध्यम से लूप करता है, जब तक यह खिलाड़ी की बारी न हो जाए, तब तक उनके मोड़ लेते हैं। इस बिंदु पर मुझे खिलाड़ी को स्थानांतरित करने और/या चीजों पर हमला करने की अनुमति देने के लिए इनपुट प्राप्त करने की आवश्यकता है। मैं मूल रूप से HaxCanvas की keyPressed विधि में gameManager.runUntilHeroTurn() पर कॉल कर रहा था। हालांकि j2me सिस्टम थ्रेड पर पढ़ने के बाद मुझे एहसास हुआ कि कॉलबैक में थोड़ी देर के लिए चलाने की क्षमता के साथ एक विधि डालना एक बुरा विचार है। हालांकि मुझे इनपुट हैंडलिंग करने के लिए कुंजी दबाया जाना चाहिए, क्योंकि मुझे संख्या कुंजी तक पहुंच की आवश्यकता है, और getKeyStates() इसका समर्थन नहीं करता है।

सोफार मेरे गैमेलोप को अपने स्वयं के धागे में रखने के मेरे प्रयासों के कारण आपदा हुई है। एक अजीब "बेकार ArrayIndexOutOfBoundsException" बिना किसी स्टैक ट्रेस के खेल दिखाता है जब गेम कई मोड़ों के लिए चलाया जाता है।

तो मैं लगता है मेरे सवाल यह है:

एक J2ME में खेल "आधारित बारी", क्या खेल पाश लागू करने के लिए सबसे अच्छा तरीका है इनपुट केवल handeling जब यह खिलाड़ी की बारी है के लिए अनुमति देता है, के लिए?

+0

वैसे, अच्छा सवाल। +1 – Fostah

उत्तर

3

मैं पाठ्यक्रम के निर्माता के आधार पर जे 2 एमई थ्रेडिंग के रूप में गेम तर्क के लिए थ्रेडिंग से बचूंगा, सीमित संसाधनों को साझा करने का एक अच्छा काम नहीं करता है। थ्रेड भारी प्रोसेसिंग करते समय आपको अक्सर विराम दिखाई देंगे। मैं केवल लोडिंग या नेटवर्क कनेक्टिविटी सुविधाओं के लिए धागे की सिफारिश करता हूं क्योंकि इस मामले में आप उपयोगकर्ता को मूलभूत "लोड हो रहा है ..." प्रतिक्रिया दे रहे हैं।

इसे संभालने के लिए, मेरे पास एक फ्रेम में प्रत्येक एआई को अपडेट करने के लिए सब-लूप नहीं होंगे।मैं रन समारोह में निम्नलिखित की तरह कुछ करना होगा:

public void run() { 
    while(true) { 
     // Update the Game 
     if(gameManager.isUsersTurn()) { 
      // Collect User Input 
      // Process User Input 
      // Update User's State 
     } 
     else { 
      // Update the active NPC based on their current state 
      gameManager.updateCurrentNPC(); 
     } 

     // Do your drawing 
    } 
} 

आप सब कुछ 1 के रूप में एक फ्रेम में अद्यतन) को अपडेट करने में धीमी गति से हो सकता है, उपयोगकर्ता 2 के लिए तत्काल कोई विज़ुअल फ़ीडबैक में जिसके परिणामस्वरूप होने से बचना चाहते हैं) आप कर सकते हैं प्रत्येक व्यक्ति एनपीसी को एनिमेट नहीं करते क्योंकि वे अपना कार्य करते हैं। इस सेटअप के साथ आप एनपीसी राज्य, एनपीसी_DECIDE_MOVE और NPC_ANIMATING प्राप्त कर सकते हैं, जो आपको एनपीसी क्या कर रहा है इसके बारे में और अधिक नियंत्रण करने की अनुमति देगा। एनीमेशन पूरा होने तक एनपीसी_एनिमैटिंग मूल रूप से एनीमेशन के लिए एक प्रतीक्षा स्थिति में गेम डाल देगा, जब तक कि एनीमेशन पूरा नहीं हो जाता है, आगे की प्रक्रिया से परहेज करें। फिर यह अगले एनपीसी की बारी पर जा सकता है।

इसके अलावा, मेरे पास एक गेममैनेजर.अपडेट() और गेममैनेजर.paint (g) (पेंट से पेंट कहा जाएगा) होगा जो सबकुछ संभालेगा और रन विधि को पतला रखेगा।

अंत में, क्या आपने फ्लशग्राफिक्स() में देखा? GameCanvas के साथ आप आमतौर पर ग्राफिक्स ऑब्जेक्ट बनाते हैं, उस पर सबकुछ खींचते हैं और फिर flushGraphics() को कॉल करते हैं, फिर प्रतीक्षा करें। जिस विधि का आप उल्लेख करते हैं वह कैनवास वर्ग के लिए इसे संभालने का तरीका है। बस सोचा कि मैं इसका जिक्र करूंगा और एक लिंक पोस्ट करूंगा: Game Canvas Basics

5

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

input ---> queue <---> Manager(loop) 

इस तरह आप डीबग उद्देश्यों के लिए भी स्क्रिप्ट इनपुट कर सकते हैं।

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