2009-03-07 7 views
8

तो मैं अपने आप को गेम प्रोग्रामिंग सिखाने के लिए जावा में पॅकमैन गेम बना रहा हूं।जावा में पॅकमैन भूलभुलैया

मेरे पास पैकमैन स्प्राइट के साथ मूल गेम विंडो है और भूत sprites खींचा है, pacman तीर कुंजियों के साथ चलता है, खिड़की की दीवारों से परे नहीं चलता है, आदि अब मैं भूलभुलैया बनाने की कोशिश कर रहा हूँ , इस तस्वीर में के रूप में:

Pacman maze

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

1) सबसे कुशल एल्गोरिथ्म/इस भूलभुलैया बनाने के लिए विधि क्या है:

यहाँ मेरी सवाल कर रहे हैं? जब भी पेंट() विधि को बुलाया जाता है या इसे केवल खेल की शुरुआत में खींचने का कोई तरीका होता है और फिर कभी नहीं होता है?

2) यह वास्तव में स्क्रीन पर कैसे खींचा जाएगा? मुझे लगता है कि fillRect() का उपयोग किया जाएगा?

3) टकराव का पता लगाने पर कोई संकेत (इसलिए पॅकमैन/भूत दीवारों के माध्यम से नहीं जा सकते हैं) सहायक होंगे।

4) पाइप के बीच खाली जगह की गणना कैसे की जाएगी इस पर कोई संकेत है कि उनके बीच बिंदु भरे जा सकते हैं, यह भी बहुत उपयोगी होगा।

धन्यवाद

उत्तर

9

मैं ऐसा नहीं करता।

मैं ग्राफिकल मानचित्र खींचता हूं और फिर 2 डी डेटा सरणी बनाता हूं जो मानचित्र का प्रतिनिधित्व करता है। डेटा मैप टकराव, डॉट्स खाने, जहां कैंडी है और जहां भूत हैं, निर्धारित करने के लिए जिम्मेदार होगा। एक बार सबकुछ के लिए सभी तर्कों को संभाला जाता है, तो ग्राफिकल मानचित्र पर उनके उचित पिक्सेल निर्देशांक में सब कुछ प्रदर्शित करने के लिए बस 2 डी सरणी का उपयोग करें।

उदाहरण के लिए उपयोगकर्ता बाएं कुंजी दबा रहा है। सबसे पहले आप यह निर्धारित करते हैं कि pacman तत्व 3 पर है, 3. तत्व 3, 2 में दीवार को इंगित करने वाली जानकारी होती है ताकि आप उसे आदेश को अनदेखा करने के लिए कोड को कार्यान्वित कर सकें।

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

प्रत्येक तत्व के बारे में जहां एक बिंदु हो सकता है का प्रतिनिधित्व करेंगी। उदाहरण के लिए:

नहीं, बोर्ड को देखकर मैं कहूंगा कि सरणी इस तरह कुछ दिखाई देगी।

d,d,d,d,d,d,d,d,d,d,d,d,w,w,d,d,d,d,d,d,d,d,d,d,d,d 
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d 
p,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,p  
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d  
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 

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

एक और चीज जिसे आप याद रखना चाहते हैं वह यह है कि पॅकमैन और भूत अक्सर अंक के बीच होते हैं, जिसमें ऐसी जानकारी होती है जो 1,2 और 1,3 के बीच की जा रही जगह के प्रतिशत का प्रतिनिधित्व करती है टकराव का पता लगाने के लिए महत्वपूर्ण है साथ ही यह निर्धारित करना कि आप बोर्ड से डॉट्स, पावरअप और कैंडी को कब हटाना चाहते हैं।

+0

यह सरणी मानचित्र का प्रतिनिधित्व कैसे करेगी? एक पिक्सेल में पिक्सेल प्रतिनिधित्व के रूप में? –

+0

संपादित। ऊपर देखो। –

+0

धन्यवाद। तो अगर मैं पॅकमैन को 100 x, 50 y स्थिति में ले जाना चाहता था, तो मैं यह दिखाने के लिए मानचित्र में कैसे सेट करूं कि उस स्थिति पर कब्जा कर लिया गया है? उसके लिए कोई कोड? –

2
  1. आप मानचित्र को एक बुफर्ड इमेज में पेंट कर सकते हैं और केवल प्रत्येक पेंट() पर ड्रॉ कर सकते हैं। आपको इस तरह काफी उचित प्रदर्शन मिलेगा।

  2. यदि आप ठोस दीवारों से खुश हैं, तो आप fillRect के साथ प्रत्येक वर्ग दीवार ब्लॉक को आकर्षित कर सकते हैं। यदि आप तस्वीर में समान दिखना चाहते हैं, तो आपको यह समझने की ज़रूरत है कि लाइनों को सही तरीके से कैसे खींचना है और कोनों के लिए आर्क का उपयोग करना है।

  3. पॅकमैन गेम नक्शा वर्गों और पॅकमैन से बना है और भूत हमेशा एक स्क्वायर से पड़ोसी स्क्वायर में एनिमेटेड चरण में जाते हैं (यानी आप सही दबाते हैं, पॅकमैन एक वर्ग को दाईं ओर ले जाता है)। इसका मतलब है कि टकराव का पता लगाना आसान है: बस चाल को उन वर्गों को अनुमति न दें जो खाली नहीं हैं।

  4. मुझे समझ में नहीं आता कि आप यहां क्या पूछने की कोशिश कर रहे हैं।

+0

एक वर्ग से क्या आपका मतलब पिक्सेल/एक्स, वाई समन्वय या 10 पिक्सेल ब्लॉक वर्ग है? –

+0

मेरा मतलब पिक्सल का एक ब्लॉक है। स्पेंसर रूपर्ट एक ही चीज़ के बारे में बात कर रहा है। – TrayMan

2

1) बस पुनर्विचार पर मेरी सलाह देने के लिए। अगर आप पूरी छवि को फिर से खींचना चाहते हैं तो आप कुछ कर सकते हैं, केवल उन तत्वों को निर्धारित करता है जो स्क्रीन पर बदल गए हैं और उनको दोबारा हटा दें। इसके लिए एक दृष्टिकोण निम्नलिखित होगा: स्प्राइट्स को निर्धारित करें जो स्थानांतरित हो गए हैं। उन sprites के चारों ओर एक आयताकार (अनुमानित) निर्धारित करें। केवल उन आयतों को दोबारा हटाएं। इस तरह आप स्क्रीन के केवल ताज़ा हिस्सों हैं, न कि पूरी स्क्रीन पर। इसके परिणामस्वरूप पूरी स्क्रीन को फिर से चलाने पर प्रदर्शन में वृद्धि होनी चाहिए।

अन्य उत्तरों आपके द्वारा पूछे गए अन्य प्रश्नों के लिए उचित हैं।

7

यहाँ आप के लिए एक संकेत है:

alt text http://www.freeimagehosting.net/uploads/66e4131f59.jpg

इस संकेत, ठीक से इस्तेमाल किया है, तो आप प्रतिपादन और टक्कर पता लगाने को संभालने के लिए अनुमति देगा, और यह भी आप एक कॉम्पैक्ट फैशन में भूलभुलैया का प्रतिनिधित्व करने की अनुमति देगा।

+0

कृपया इस संकेत के कार्यान्वयन पर कुछ विवरण दें (यानी टाइल आधारित मानचित्र) भी! –

+0

इसे करने के कई तरीके हैं। मेरा प्रारंभिक दृष्टिकोण इस तथ्य पर आधारित होगा कि पीएसी-मैन भूलभुलैया कभी नहीं बदलेगी। उस धारणा के साथ आप आसानी से भूलभुलैया का प्रतिनिधित्व 28 x 31 ग्रिड 0 और 1 के रूप में कर सकते हैं। फिर ग्रिड से उत्पन्न करने के बजाय वास्तविक भूलभुलैया के लिए बस बिटमैप का उपयोग करें। –

+0

... 0 और 1 का प्रतिनिधित्व दीवार से उपस्थिति या अनुपस्थिति का प्रतिनिधित्व करता है।उस प्रतिनिधित्व का बिंदु दीवारों के साथ टकराव का पता लगाने का समर्थन करना है। बिटमैप का बिंदु बस प्रतिपादन है। इस दृष्टिकोण को ग्रिड और बिटमैप को सिंक में मैन्युअल रूप से रखने की आवश्यकता है। –

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