Arduino के लिए गेम कंसोल। Arduino UNO R3 (ग्रा यू पिंग पोंग रोबिमो सामी)। मास्टर फ़ॉन्ट्स का निर्माण



आइए "अंकगणित कैलकुलेटर" नामक एक मानसिक ग्रीज़ बनाना शुरू करें। ग्रेवेट्स को 128×90 मापने वाले क्षेत्र के चारों ओर घूमने की क्षमता वाले जॉयस्टिक द्वारा नियंत्रित किया जाता है। शून्य जॉयस्टिक गति के साथ, गुरुत्वाकर्षण केंद्र पर गति करता है। जॉयस्टिक का अधिकतम नियंत्रण बजरी की अधिकतम गति से मेल खाता है। नियमित अंतराल पर वस्तुएं-अंक उत्पन्न होते हैं, जो नरक की तरह नीचे की ओर ढह जाते हैं। स्क्रीन के निचले स्थान पर पहुंचने के बाद, इस अंक के मान से बजरी गेंदों की संख्या को बदलते हुए, वस्तु-अंक ज्ञात होता है। जैसे ही ग्रेवेक्स स्क्रीन पर ऑब्जेक्ट-नंबर के माध्यम से स्क्रॉल करता है, इसके परिणामस्वरूप एक स्पष्ट ऑब्जेक्ट-नंबर दिखाई देगा और ग्रेवेट्स के उपचार मूल्य में वृद्धि होगी। नियमित अंतराल के साथ, ग्रेविटी आइकन अपना मान 0 से 9 तक बदलता है। जब आप ऑब्जेक्ट-अंक को स्थानांतरित करते हैं, तो उपचारक का स्कोर उस राशि से बढ़ जाता है जो ऑब्जेक्ट-अंक की पिछली राशि और गुरुत्वाकर्षण की संख्या के बराबर होता है , जो संख्या गुरुत्वाकर्षण प्राचीन अंक वस्तु-अंक है, तो कब्रों का उपचारक संख्या प्राप्त करके बढ़ जाएगा। अंकों की पिछली सीमा तक पहुँचने के बाद, मूल्यों के उच्च स्तर पर संक्रमण की आवश्यकता होती है, जिससे गति की अधिक गति और ऑब्जेक्ट-अंकों की पीढ़ी की गति बढ़ जाएगी। इसके अलावा, ऑब्जेक्ट-डिजिट के साथ बंद बजरी के चौथे स्तर से, न केवल बजरी के उपचार मूल्य को बढ़ाना आवश्यक है, बल्कि इसे बदलना भी आवश्यक है (क्योंकि बजरी का आंकड़ा के आंकड़े से कम है) वस्तु-अंक)। जैसे ही खेल में अंकों की संख्या 0 से कम हो जाती है, खेल शुरू से शुरू हो जाता है।

जो सामने आया उसका वीडियो एक्सिस

आप अनुरोध पर TVOut लाइब्रेरी से स्केच और फ़ाइलों के साथ अभिलेखागार तक पहुंच सकते हैं

मैं सृजन की प्रक्रिया ही हूँ

महान खेलों का निर्माण

हीटिंग के लिए, हम हीटिंग की प्रवाह स्थिति को संरक्षित करने के लिए ऑब्जेक्ट बनाते हैं। प्रतीक जो बजरी का प्रतिनिधित्व करता है, और प्रतीक जो संख्यात्मक वस्तुओं को प्रदर्शित करते हैं, उन्हें पाठ जानकारी के रूप में प्रदर्शित किया जाता है, इसलिए पंक्तियों में खेल का पूरा क्षेत्र और वस्तुओं की सभी गतिविधियाँ ऐसे काम करेंगी जैसे कि प्रतीक एक निश्चित स्थान पर प्रदर्शित होता है। फ़ील्ड। MAX_X=31 और MAX_Y=14 मान क्षैतिज और ऊर्ध्वाधर आयामों की संख्या के आधार पर खेल के मैदान का आकार निर्धारित करते हैं। मान MAX_OBJ=30 अंक वाली वस्तुओं की अधिकतम संख्या को इंगित करता है जो एक समय में खेल के मैदान पर हो सकती हैं। Int FIGURA सरणी उन अंकीय वस्तुओं के बारे में जानकारी संग्रहीत करती है जो वर्तमान में फ़ील्ड पर हैं:

  • FIGURA[i] - अंक वस्तु का संख्यात्मक मान (0 - खाली वस्तु);
  • FIGURA[i] - वस्तु-अंक का सटीक निर्देशांक x;
  • FIGURA[i] - अंक वस्तु का सटीक y निर्देशांक।

उत्पादन लाइन का वर्णन करने वाले अन्य चरों को सहेजने के लिए, हम GAME संरचना बनाते हैं। संरचना क्षेत्रों की सूची:

  • xk - बजरी का समन्वय x(/4);
  • yk - गुरुत्वाकर्षण का समन्वय y(/6);
  • tekCursor – कर्सर के लिए अधिक सटीक मान;
  • ब्लिंककर्सर - कर्सर को ब्लिंक करने के लिए कटिंग मिल;
  • वीब्लिंक - वीके में ब्लिंक गति;
  • वीके - बजरी हैंडल की चिकनाई - इनपुट ए0, ए1 की जांच;
  • vo_10 - बजरी संख्या बदलने की गति;
  • vo_11 - वस्तुओं-अंकों की उपस्थिति की गति;
  • vo_12 - अंक-उद्देश्यों की तरलता;
  • count_objects - फ़ील्ड में ऑब्जेक्ट-अंकों की संख्या;
  • स्तर - रूबर्ब ग्रिस;
  • गेंदें - गेंदों की संख्या।

int MAX_X=31; int MAX_Y=14; // गेम डेटा संरचना गेम की संरचना // गेम डेटा की संरचना ( int xk; // x(/4) बजरी का समन्वय int yk; // y(/6) बजरी का समन्वय int tekCursor; // अधिक सटीक कर्सर मान int blinkCursor; // कर्सर की थ्रेडिंग मिल int vblink; // vk long vk में ब्लिंक की गति; // बजरी की गति की गति - इनपुट A0, A1 long vo_10 का पुन: सत्यापन; // बजरी लंबी vo_11 के अंकों को बदलने की गति; // संख्याओं की उपस्थिति की गति लंबी vo_12; // गति संख्याओं की संख्या int count_objects; // फ़ील्ड int स्तर पर वस्तुओं की संख्या; // गेंदों की संख्या ; // गेंदों की संख्या); int MAX_OBJ=30; पूर्णांक चित्र=((0,0,0),(0,0,0),(0,0,0),(0,0,0),(0,0,0), (0,0,0 ) ),(0,0,0),(0,0,0),(0,0,0),(0,0,0), (0,0,0),(0,0,0) , (0,0,0),(0,0,0),(0,0,0), (0,0,0),(0,0,0),(0,0,0),( 0 ,0,0),(0,0,0), (0,0,0),(0,0,0),(0,0,0),(0,0,0),(0, 0) ,0), (0,0,0),(0,0,0),(0,0,0),(0,0,0),(0,0,0) );

ड्राइवर जॉयस्टिक के पीछे स्थित है।

स्क्रीन पर बजरी की स्थिति जॉयस्टिक नियंत्रणों द्वारा इंगित की जाती है। जॉयस्टिक कनेक्टर Arduino बोर्ड के एनालॉग पोर्ट A0, A1 से जुड़े हुए हैं। पोर्ट एक घंटे के बाद सक्रिय हो जाते हैं, मान GAME.vk पैरामीटर द्वारा निर्धारित किए जाते हैं, और यह डेटा मैप() फ़ंक्शन द्वारा संसाधित किया जाता है, जो आनुपातिक रूप से प्रवाह सीमा 0-124 के मान को एक नए में स्थानांतरित करता है रेंज (स्क्रीन की चौड़ाई और ऊंचाई का मान)। फिर यह मान संपर्क निर्देशांक में परिवर्तित हो जाता है। इस स्थान पर, छवि को बजरी के प्रतीक पर ले जाना आवश्यक है, और स्किप प्रतीक को बजरी के सामने वाले स्थान पर रखें। बजरी को प्रदर्शित करने के लिए, एक चमकता प्रतीक प्रदर्शित किया जाता है - एक संख्या और एक स्थान।

//********************* एक नई गुरुत्वाकर्षण स्थिति सेट करना void set_iam() (TV.set_cursor(min(123,GAME1.xk*4),min(84,GAME1) ) . yk*6));TV.print(" "); , 96);GAME1.xk=GAME1.xk/4;GAME1.yk=GAME1.yk/6;GAME1.vblink–;if(GAME1.vblink<0) { GAME1.blinkCursor=1-GAME1.blinkCursor; GAME1.vblink=5+GAME1.blinkCursor*5; } TV.set_cursor(min(123,GAME1.xk*4),min(84,GAME1.yk*6)); if(GAME1.blinkCursor==1) TV.print(GAME1.tekCursor); else TV.print(” “); }

बजरी जिस प्रतीक का प्रतिनिधित्व करती है वह एक घंटे के बाद बदल जाता है, set_new_cursor() फ़ंक्शन का उपयोग करके GAME.vo_10 पैरामीटर का उपयोग करके, अतिरिक्त यादृच्छिक() फ़ंक्शन का उपयोग करके चरण दर चरण परिवर्तन किया जाता है।

//********************* एक नए प्रकार का बजरी प्रतीक सेट करना void set_new_cursor() ( GAME1.tekCursor=random(0,10); )

डिजिटल वस्तुओं का सृजन और संचलन।

GAME.vo11 पैरामीटर का उपयोग करके ऑब्जेक्ट-नंबर एक घंटे के बाद उत्पन्न होते हैं। Set_new_object() फ़ंक्शन को कॉल किया जाता है। सभी डिजिटल वस्तुओं के बारे में जानकारी FIGURA सरणी में सहेजी जाती है। प्रोग्राम ऐरे (FIGURA=0) में पहले खाली इंडेक्स की तलाश करता है, और एक नया ऑब्जेक्ट-डिजिट रखता है। नई वस्तु का डिजिटल मान और क्षैतिज समन्वय यादृच्छिक फ़ंक्शन द्वारा उत्पन्न होता है, और ऊर्ध्वाधर समन्वय शून्य पर सेट होता है। नए नंबर ऑब्जेक्ट का प्रतिनिधित्व करने वाला प्रतीक स्क्रीन पर दिखाई देता है।

//***************** एक नए नंबर ऑब्जेक्ट का प्रकट होना void set_new_object() ( int null_index=0; if(GAME1.count_objects)<>(for(int i=0;i;i++)<>( if(FIGURA[i]==0) (null_index=i;break;) ) FIGURA=random(1,9); FIGURA=यादृच्छिक(0,MAX_X); चित्र = 0; // टीवी.सेट_कर्सर बोर्ड पर विस्नोवोक (फिगुरा * 4.0); टीवी.प्रिंट(फिगुरा); GAME1.count_objects++; )

ऑब्जेक्ट-अंकों को स्थानांतरित करने का कार्य (go_object()) एक घंटे के बाद कॉल किया जाता है, जैसा कि GAME.vo12 पैरामीटर द्वारा निर्धारित किया जाता है। विज़ुएलिज़त्स्य रुखु ओफ़्टीक-त्सिफ़्रे विदबुवास, धोखेबाज़ के प्रतीक का भाग्य (संभावना के प्रतीक का नोट), ओ'स्काटा के प्रतीक की रिकॉर्डिंग के साथ (ऊर्ध्वाधर समन्वय तज़ीफ़्री ज़बिलशाह को अकेला जानें)। जब आप स्क्रीन के नीचे पहुंचेंगे, तो आपको एक नया ऑब्जेक्ट-अंक (FIGURA[i] सरणी का रिकॉर्ड 0 तत्व) दिखाई देगा, साथ ही बजरी बिंदुओं की संख्या में बदलाव भी दिखाई देगा।

//********************* वस्तु-अंक शून्य go_object() (for(int i=0;i;i++)<>( if(FIGURA[i]>0) ( TV.set_cursor(FIGURA[i]*4,FIGURA[i]*6); TV.print(" "); if(FIGURA[i]))<>( FIGURA[i]++; TV.set_cursor(FIGURA[i]*4,FIGURA[i]*6); TV.print(FIGURA[i]); ) else ( TV.tone(294,200); Change_balls(FIGURA ) [i]*(-1));FIGURA[i]=0;GAME1.count_objects–; )))))

मुद्रित बजरी एवं वस्तुनिष्ठ-अंकों का निरीक्षण।

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

  • ऑब्जेक्ट-अंक FIGURA सरणी में पाया जाता है (FIGURA[[i] में प्रविष्टि 0);
  • ऑब्जेक्ट-नंबरों की संख्या के लिए 1 हीलर में परिवर्तन (GAME.count_objects)
  • डॉक्टर बजरी गेंदों की संख्या बदल सकते हैं (फ़ंक्शन चेंज_बॉल्स() पर क्लिक करें)।

//********************* कनेक्शन शून्य टक्कर() की जांच करें (for(int i=0;i;i++)<>( if(FIGURA[i]>0) ( if(FIGURA[i]==GAME1.xk && FIGURA[i]==GAME1.yk) ( TV.tone(740,200); if(FIGURA[i]==GAME1 ) .tekCursor) चेंज_बॉल्स(GAME1.tekCursor*GAME1.tekCursor), अन्यथा यदि(FIGURA[i]>GAME1.tekCursor && GAME1.level>3) चेंज_बॉल्स(FIGURA[i]*(-1));अन्यथा परिवर्तन_बॉल्स(FIGURA) [i]+GAME1.tekCursor);FIGURA[i]=0;GAME1.count_objects–; ) ) ) )

कब्र में गेंदों की संख्या को बदलने का कार्य (change_balls()) कब्र में गेंदों की संख्या को बढ़ाने (बदलने) के तर्क के रूप में संख्या को पास करता है। यह संख्या वस्तु-अंकों और बजरी संख्याओं के योग के समान है। यदि कोई अंक किसी अंक वस्तु का पुराना अंक है, तो अंकों के योग से पुराना मान संचारित होता है। ऑब्जेक्ट-नंबर के साथ बंद बजरी के चौथे स्तर की फोल्डेबिलिटी बढ़ाने के लिए, न केवल बजरी का उपचार बढ़ाएं, बल्कि इसे बदल दें (क्योंकि बजरी का आंकड़ा ऑब्जेक्ट-नंबर के आंकड़े से कम है) .

बजरी के चिकित्सक.

Change_balls() फ़ंक्शन इनपुट तर्क के मान से कब्र की गेंदों के उपचारकर्ता को बदल देता है। जैसे ही अंक हीलर की संख्या 0 से कम हो जाती है, खेल समाप्त हो जाता है, स्क्रीन साफ़ हो जाती है और खेल शुरू हो जाता है। इसके अलावा, जब उपचारक गाने के स्तर तक पहुंच जाता है, तो गेम एक नए, उच्च स्तर पर स्विच हो जाएगा। नए स्तर का निर्धारित मान new_level() फ़ंक्शन द्वारा निर्धारित किया जाता है।

//********************* संचित अंक बदलें शून्य चेंज_बॉल्स(इंट बॉल) ( GAME1.बॉल्स=GAME1.बॉल्स+बॉल; यदि(GAME1.बॉल्स<0) start_game(); if(GAME1.balls>(GAME1.स्तर+1)*100) new_level(GAME1.स्तर); set_data_tablo(); )

एक नया स्तर पार कर रहा हूं.

नए स्तर पर स्विच करते समय, पीढ़ी की गति और डिजिटल वस्तुओं की गति की गति के लिए नए मान स्थापित किए जाते हैं। शुरू से ही, बजरी के नंबर बदलने की गति, बजरी के हाथ की गति और खेल के परीक्षण के दौरान, जिसके आधार पर कोई आश्वस्त होता है, उसके मूल्यों को बदलना आवश्यक था। नए स्तर के लिए परिवर्तनों के निर्धारित मान फ़ंक्शन new_level() द्वारा निर्धारित किए जाते हैं

//****************** परिवर्तन स्तर gree void new_level(int tek_level) (GAME1.level++; GAME1.vo_10=5000; GAME1.vo_11=2000-(GAME1.level -1)*100;GAME1.vo_12=1000-(GAME1.स्तर-1)*100;

इन आंकड़ों की छवियां स्कोरबोर्ड पर प्रदर्शित की जाती हैं।

डेटा बोर्ड स्क्रीन के नीचे स्थित है। यहां आप संचित अंकों की संख्या और खेले गए गेम की मात्रा देख सकते हैं। स्कोर हीलर को बदलते समय, फ़ंक्शन set_data_tablo() को कॉल किया जाता है, जो परिवर्तनीय गेम संरचनाओं और स्कोरबोर्ड पर एकत्रित अंकों की संख्या और गेम स्तर के मूल्य को बदलता है।

//********************* स्कोरबोर्ड पर डेटा प्रदर्शित करना void set_data_tablo() (TV.print(20,91," ball"); TV.print(70, 91 "," लेवल = "); टीवी.प्रिंट(48.91,गेम1.बॉल्स); टीवी.प्रिंट(98.91,गेम1.लेवल);

ध्वनि समर्थन ग्रि.

ध्वनि डिज़ाइन के लिए, TVOut लाइब्रेरी के टोन (आवृत्ति, अवधि) फ़ंक्शन का उपयोग करें। जब ऑब्जेक्ट-नंबर खेल के मैदान के निचले भाग तक पहुँच जाता है - TV.tone(294,200) (फ़ंक्शन go_object()), जब ऑब्जेक्ट-नंबर की बजरी बंद हो जाती है - TV.tone(740,200) (फ़ंक्शन टकराव())। यदि आप प्रोजेक्ट में कई नोट्स के अनुक्रमिक निर्माण से एक टुकड़ा सम्मिलित करना चाहते हैं, तो टोन (आवृत्ति, अवधि) कमांड के साथ त्वचा नोट प्रदर्शित करने के बाद, आपको कम से कम तीन स्तरों की देरी के साथ देरी() कमांड डालना होगा, निम्न अवधि पैरामीटर, 6 - अंतिम आउटपुट येन्या ई दो एले ज़ेड पॉज़।

टीवी.टोन(294,200); टीवी.देरी(400); टीवी.टोन(740,200);

ग्रिस का मुख्य चक्र.

प्रोग्राम का मुख्य चक्र उन फ़ंक्शंस की कॉल से बनता है जिन्हें हमने निम्नलिखित GAME.vk में इंस्टॉलेशन के एक घंटे के अंतराल के बाद set_iam(), टकराव(), go_object(), set_new_object(), set_new_cursor() पर देखा था। , GAME.vo_10, GAME.vo_11, GAME.vo_12.

int गेम1() ( while(GAME1.balls>0 && GAME1.level<6) { long time2=millis(); if(time2-time11>GAME1.vk) (set_iam(); टकराव(); time11=time2; ) if(time2-time12>GAME1.vo_12) (go_object();time12=time2;) if(time2-time13>GAME1.vo_11) (set_new_object ();time13=time2;) if(time2-time14>GAME1.vo_10) (set_new_cursor();time14=time2;) TV.delay_frame(10); ) यदि(GAME1.गेंदें<0) return 0; else if(GAME1.level>5) वापसी 0; अन्यथा वापसी 1; )

इगोर्स के चयन के लिए एक मेनू जोड़ा जा रहा है।

स्केच में तीन गेम प्रदर्शित करने के लिए एक मेनू जोड़ा गया है जिसे आप स्वयं जोड़ सकते हैं।

शून्य लूप() (स्विच(मेनू(पीमेनू)) (केस 1:स्टार्ट_गेम(); जबकि(गेम1()>0); ब्रेक; डिफॉल्ट: ब्रेक; ) ) //***** मेनू गेम इंट मेनू का चयन करने के लिए (int poz) (TV.clear_screen(); pmenu=max(poz,1); int pmenu1=pmenu; TV.println(60,30,"गेम 1"); TV.println(60,50,"गेम 2 ″); TV.println(60,70,'गेम 3″); TV.draw_rect(50,5+20*pmenu,40,10,WHITE,INVERT); )==LOW) ( if(analogRead(A1) )<100) pmenu=max(pmenu-1,1); else if(analogRead(A1)>900) पमेनू = मिनट (पमेनू + 1.3); अन्य; if(pmenu1!=pmenu) (TV.delay(500); TV.draw_rect(50.5+20*pmenu1,40,10,BLACK,INVERT); TV.draw_rect(50.5+20*pmenu,40, 10, WHITE, INVERT);pmenu1 = pmenu;))) रिटर्न pmenu; )

नमस्ते, गीक टाइम्स!
आज मैं आपको एक बहुत अच्छी कहानी नहीं बताऊंगा कि कैसे मैंने Arduino पर आधारित एक सरल गेम कंसोल बनाया और अपने पसंदीदा गेम इंजन यूनिटी में इसके लिए एक जटिल गेम बनाया।

खेल

अभी हाल ही में मैं लोकप्रिय गेम इंजन यूनिटी (पूर्व में Unity3D) पर गेम विकसित करना शुरू कर रहा हूं। केवल एक घंटे में, मैं मोबाइल उपकरणों के लिए कई छोटी परियोजनाएँ बनाने में कामयाब रहा, साथ ही एक बड़े पैमाने की परियोजना के लिए बड़ी मात्रा में बीमा भी किया।
यह क्षेत्र कम उपयोगी है और इसमें काम करने से बहुत संतुष्टि मिलती है।

उपकरण

हालाँकि, मैं कुछ नया आज़माने के लिए मजबूर महसूस करता हूँ, और एक दिन मैंने Arduino आज़माने का फैसला किया।
मुझे वास्तव में इस बात में दिलचस्पी हो गई कि मैं अपने बिजली उपकरण कैसे बनाऊं और उन्हें कैसे प्रोग्राम करूं। आर्डिनो क्यों? इंटरनेट पर उन लोगों के बारे में बहुत सारी पोस्ट हैं जो Arduino का उपयोग करना चाहते हैं। मैं बस यह कहना चाहता हूं कि मेरे लिए आर्डिनो चुनने में सबसे महत्वपूर्ण कारक पसंद की सादगी है।

मैं इसे कैसे खा सकता हूँ?

एक बार इंटरनेट पर, मुझे एक पोस्ट मिली कि कैसे डेवलपर्स में से एक ने अपना सरल Arduino-आधारित गेम कंसोल एकत्र किया, इसे एक छोटा 84x48 पिक्सेल डिस्प्ले प्रदान किया, और इस पर कुछ सरल गेम लिखे: पोंग और अर्कानॉइड।
यह तकनीक वास्तव में मुझे पसंद नहीं आई और मैंने atmega328 माइक्रोकंट्रोलर पर आधारित गेम कंसोल का अपना संस्करण बनाने का निर्णय लिया।

कंसोल ही

सबसे पहले, मैंने एक पोर्टेबल कंसोल के लिए एक बोर्ड डिज़ाइन और LUT-निर्मित किया। यह अफ़सोस की बात थी - शुरू से ही डिवाइस बोर्ड पर प्रोग्राम का विरोध करना आवश्यक था, उदाहरण के लिए, Arduino uno, क्योंकि मैंने स्लाइडर की क्षमता को स्थानांतरित नहीं किया और प्रोग्राम को मैन्युअल रूप से नियंत्रक पर अपलोड नहीं किया। और मुझे सर्किट पर भी दया आई, तारों को ठीक करना संभव था, लेकिन यह फिर भी बंद रहेगा।
जब मुझे एहसास हुआ कि मुझे दया आ गई है, तो मैंने आर्डिनो यूनो बोर्ड के माध्यम से बटन कनेक्ट किए, और मैंने स्क्रीन को सीधे कनेक्ट कर दिया।
एक्सिस:



और अब इगोर के लिए

गेम बनाने के लिए, मैंने यूनिटी गेम इंजन का उपयोग किया। मैंने Arduino के लिए एक प्रोग्राम में मोनो C# से एक कंपाइलर नहीं लिखा, बल्कि स्क्रिप्ट का एक सेट लिखने का फैसला किया, जिसका उपयोग आसानी से गेम चुनने के लिए किया जा सकता है।
मैंने सभी स्क्रिप्ट्स को 3 समूहों में विभाजित किया है - dii, umovi और कॉम्बिनर्स।
मुझे लगता है कि कार्यों और दिमागों के महत्व को समझाने की कोई आवश्यकता नहीं है, लेकिन मैं उस धुरी को समझाऊंगा जिसके लिए कंबाइन ऑपरेटर की आवश्यकता है। कंबाइन ऑपरेटर अंतिम विचार की जाँच करता है, और फिर विचार को अंतिम रूप देता है।
इन स्क्रिप्ट्स से, या अधिक सटीक रूप से उनकी उपस्थिति और संयोजन से, एल्गोरिदम arduino के लिए एक प्रोग्राम बनाता है।

यह खेल क्या है?

मैं कुछ सरल चीज़ के बारे में सोचने लगा। सबसे सरल गेम कौन सा है, क्या आप जानते हैं? यह सही है - पोंग. लेकिन मैंने सिर्फ पोंग ही नहीं, बल्कि एक रैकेट, एक गेंद और एक दीवार के बजाय दूसरे रैकेट के लिए पोंग खेलने का फैसला किया।
मैंने इसे लिखित कंस्ट्रक्टर से लिया और कंट्रोलर से संकलित किया। प्रत्स्युः!

और अब आइए सब कुछ क्रम में रखें

एक बार जब खेल शुरू हुआ, और मैंने इसे खेला, तो मैंने फैसला किया कि अब बोर्ड पर दोबारा काम करने, इसे खराब रूप देने, एसएमडी घटकों को हटाने और सभी फाइलें प्राप्त करने का समय आ गया है। मैंने सर्किट का पुनर्निर्माण किया और बोर्ड बनाया।
एक्सिस



सप्ताहांत

आउटपुट कोड बहुत सरल है.
यूनिटी का उपयोग क्या करें - संपादक से, डेवलपर यूआई ऑब्जेक्ट्स का एक समूह एकत्र करता है, उनके साथ एक्शन स्क्रिप्ट, दिमाग और कॉम्बिनर जोड़ता है।
आपको कंपाइलर (parser.cs स्क्रिप्ट) चलाने की आवश्यकता है - यह सभी ऑब्जेक्ट्स के माध्यम से जाता है, उनकी स्क्रिप्ट्स को देखता है और build.ino फ़ाइल के टेक्स्ट में कोड स्निपेट जोड़ता है, जो इंगित करता है कि इन स्क्रिप्ट्स के एनालॉग हैं माइक्रोकंट्रोलर द्वारा उत्पन्न।

सप्ताहांत संदेश - Drive.google.com/open?id=0B5INc3_98cSJMEMxZmlWUTh1Ukk
खेल शुरू करते समय संकलन विफल हो जाता है। यह Assets/build/text/build.ino फ़ोल्डर में सहेजा गया है
इस स्केच को कंट्रोलर पर अपलोड करना होगा।

मुरझाई हुई अवस्था में

मैं कहना चाहता हूं कि यह और भी अच्छा है।
मैंने अपनी दो गतिविधियाँ शुरू करने का अवसर खो दिया है - खेलों का विकास और उपकरणों का निर्माण।
मुझे आशा है कि आप आदी हो गए हैं, और अब आप अपना स्वयं का अच्छा उपकरण प्राप्त कर सकते हैं =)

Arduino गेम कंसोल? सच सच। स्क्रीन के पीछे, बटन और गेम। और ये कोई कल्पना नहीं है. ऐसी कई परियोजनाएँ हैं जिन्हें हमने स्वयं विकसित करने और उनमें से एक (गेमबुइनो) को कार्यान्वित करने का प्रयास किया है।

चूंकि परियोजना खुली है, संपूर्ण योजना विकी पर उपलब्ध है, साथ ही पीपी, गेम और अन्य उपयोगी जानकारी भी भेजी गई है।

अपना खुद का गेम कंसोल बनाने के लिए, हमें सस्ते घटकों की आवश्यकता है - एक नोकिया 5110 स्क्रीन, छह बटन और एक स्पीकर। Aliexpress या चीनी स्टोर्स की अन्य साइटों पर (सबसे महत्वपूर्ण समस्या स्क्रीन ढूंढना है) और रूस में सब कुछ ढूंढना आसान है। स्क्रीन को "विशाल" कहा जा सकता है और इसका अच्छी तरह से वर्णन किया गया है, इसलिए इसे कनेक्ट करना भी समस्याग्रस्त नहीं है, क्योंकि यह पर्याप्त नहीं है।

चूंकि गेमबुइनो को बोर्ड पर तत्वों को रखने के लिए मैन्युअल रूप से वायर्ड किया जाता है, जब हम मानक Arduino पिन के माध्यम से तत्वों को जोड़ने का प्रयास करते हैं, तो हमें निम्नलिखित चित्र मिलता है:

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

इसे "खूबसूरती से" बनाना संभव होगा, लेकिन फिर मुझे मौजूदा पुस्तकालयों के कोड को सही करना होगा और एक नई योजना के लिए संपर्कों को "बदलना" होगा। मैं सौंदर्य प्रसाधनों तक ही सीमित रहना चाहूँगा - "मानक" संपर्कों का उपयोग करना या यदि आवश्यक हो तो कोड में मामूली संपादन करना।

इसके अलावा, सर्किट बनाने के बाद, आपको Arduino IDE इंस्टॉल करना होगा और आर्काइव एक्सिस इंस्टॉल करना होगा। आपको इसे दस्तावेज़/Arduino निर्देशिका में अनज़िप करना होगा और फिर Arduino IDE लॉन्च करना होगा। इस संग्रह में, लाइब्रेरी कोड और इस योजना के साथ काम करने वाले बॉक्स से बाहर परिवर्तन पहले ही किए जा चुके हैं।

आपके पास एक गेमबुइनो टूल हो सकता है जो आपको डिस्प्ले, बटन आदि की जांच करने की अनुमति देगा। और फिर पोंग लॉन्च करें। भुगतान करने के लिए, मानक Arduino UNO या लियोनार्डो आज़माएँ (अभी तक दूसरों का परीक्षण नहीं किया है)।

यदि आपके पास सब कुछ क्रम में है, तो यह ढह जाता है और बीप करता है। नियमित पोषण को दोष देना है - खेल कहाँ हैं? गेमबुइनो एसडी कार्ड के साथ काम करने के लिए अपने स्वयं के टूल का उपयोग करता है, इसलिए Arduino को फ्लैश किए बिना इसके लोडर के माध्यम से HEX आयात करना असंभव है। यदि आप ऐसा करते हैं, तो बैटरी से सिग्नल की कमी के कारण, आप कुछ भी शुरू नहीं कर पाएंगे, क्योंकि फर्मवेयर खराब हो जाएगा और दूषित हो जाएगा। बैटरी चार्ज सेंसर की समस्याओं के कारण गेम के साथ पूर्व-संकलित HEX भी नहीं चलेगा।

लेकिन सब कुछ नष्ट नहीं हुआ है - आप आउटपुट कोड डाउनलोड कर सकते हैं, उन्हें Arduino IDE में खोल सकते हैं और उन्हें हमारे कंसोल पर "अपलोड" कर सकते हैं।

मैंने गंध और गंध का हिस्सा जांचा... अभ्यास! आप आउटपुट कोड के साथ अभिलेखागार डाउनलोड कर सकते हैं और उन्हें डाउनलोड कर सकते हैं, उन्हें Arduino IDE में खोल सकते हैं और संकलित कर सकते हैं और उन्हें स्वयं डाउनलोड कर सकते हैं। आप गेमबुइनो विकी से आउटपुट कोड डाउनलोड करके अन्य गेम स्वयं आज़मा सकते हैं।

ओझे - मिसिया विकोनान! हमें एक लघु गेम कंसोल मिला। अब हमारा काम है मोबाइल से पैसे कमाना :) और आइए आने वाले आर्टिकल्स से पैसे कमाने की कोशिश करते हैं।

और इसलिए, मेरे दोस्तों, चूँकि आपके पास पहले से ही एक Arduino UNO R3 डिज़ाइनर किट (स्टार्टर किट) है या आप तकनीकी दृष्टिकोण से ऊब चुके हैं - दयालु बनें। हमारे पास Arduino के लिए "पाठों" की एक पूरी श्रृंखला है। मैं आपको बताना चाहूंगा कि इस सेट में क्या किया जा सकता है, सब कुछ नहीं, लेकिन शायद वह सब कुछ जो उपयोग किया जाएगा या नहीं। गेम कंसोल, ठीक है, पिंग-पोंग वगैरह खेलने के लिए जॉयस्टिक का उपयोग करें। जिसने भी पुराने जॉयस्टिक वाला पुराना कंप्यूटर खो दिया है, अब यह काम नहीं करता है, सारा तर्क यही चलता है अरुडिनो किट(http://arduinokit.ru/)।

प्रोजेक्ट को परेशान क्यों करें?

मैंने एक साधारण गेम कंसोल बनाया जो पिंग-पोंग और अन्य गेम खेल सकता है, जैसे कि एक पुराने अटारी 2600 कंप्यूटर पर जो आसानी से Arduino R3 का उपयोग कर सकता है। Arduino, एक पुराना कंप्यूटर बन गया है, मानक टीवीआउट लाइब्रेरी (Arduino के लिए) के माध्यम से टीवी से जुड़े जॉयस्टिक से डेटा के इनपुट और आउटपुट को पढ़ता है। मैंने यह प्रोजेक्ट केवल यह प्रदर्शित करने के लिए बनाया है कि कोई भी (विशेष कौशल के बिना) अपने स्वयं के लघु कंसोल और गेम बना सकता है। मैं यह भी चाहता हूं कि इस लेख को पढ़ने वाला हर व्यक्ति बिना किसी नुकसान के इस आनंद से लाभ उठा सके।

Arduino गेम कंसोल के लिए क्या आवश्यक है?

5. अब, पिंग पोंग खेलने के लिए, हमें केवल 4-पिन कनेक्टर की आवश्यकता है: फॉरवर्ड (1), बैक (2), बटन (6) और ग्राउंड (8)। और दूसरे जॉयस्टिक के लिए, हमें केवल संपर्क 1, 2 और 8 की आवश्यकता है ("हेड" बटन का उपयोग केवल प्रशासक के नाम के तहत "गेम शुरू करने" के लिए किया जाता है, इसलिए मदर बटन के लिए केवल 1 बटन का उपयोग किया जाता है)।

6. यदि आप किनारे पर संपर्कों को देखते हैं, तो मैंने 4 कनेक्शनों को साधारण तारों से जोड़ा है जो Arduino पर जाते हैं (2 पिन करने के लिए "फ़ॉरवर्ड", 3 पिन करने के लिए "बैक", और 4 पिन करने के लिए "कंट्रोल")। मैंने ग्रेविटी 2 (दूसरे जॉयस्टिक पर) के लिए अन्य 3 संपर्कों के लिए भी यही कोशिश की: 7 से संपर्क करने के लिए "फॉरवर्ड" और 10 से संपर्क करने के लिए "पीछे"। संपर्क 8 जॉयस्टिक को जमीन से कनेक्ट करना न भूलें (स्क्रीन टपक रही है)!

7. अब, पिंग-पोंग समूह चालू करें और जॉयस्टिक इनपुट की जांच करें। Arduino UNO R3 और सभी भागों को आवश्यक सॉकेट में डालें (मैंने पुरानी हार्ड ड्राइव के बाहरी आवरण को हैक कर लिया है)।

चूँकि मैंने पहली बार स्वयं इस परियोजना पर काम करने का प्रयास किया था, इसलिए मैं इस परियोजना पर काम शुरू करने को लेकर और भी अधिक चिंतित था। फ़फ़ यह आसान नहीं था, मैं इस परियोजना को जल्द से जल्द पूरा करना चाहता था। अभी मेरी मुख्य समस्या यह है कि मैं अटारी से Arduino तक पुराने जॉयस्टिक लागू करने का प्रयास कर रहा हूँ। इस कार्रवाई के माध्यम से, इंटरनेट ब्लॉगर्स ने अपने मंचों पर गलत तरीके से लिखा, यह कहते हुए कि इनपुट को पढ़ना या जॉयस्टिक के बीच में इसे सोल्डर करना असंभव था, जबकि वे अपने मानक नियंत्रकों को विकोराइज़ करने में मज़ा ले रहे थे, उनके कॉल पर आने पर, मुझे एक गंध आई शलजम और एक बग ने आपके पते पर एक संदेश सुना, जिसमें कहा गया था, "मेरे हाथ नहीं बढ़ सकते," क्योंकि मैं अपने हाथों में सोल्डरिंग आयरन नहीं संभाल सकता। प्रोटेस्ट मेरा प्रोजेक्ट काम कर रहा है! क्या आप कमजोर हैं?

पुनश्च: मुझे लगता है कि एकमात्र चीज यह है कि मैं अब अलग दिखूंगा - हम्म। खैर, उदाहरण के लिए, सेगा या डेंडी से एक कार्ट्रिज प्राप्त करना और किसी भी प्रकार का कार्ड रीडर बनाना। आपके और टीवी गेम कंसोल की धुरी हाथ से संचालित होती है। गोलोव्न्या, स्केलिंग की मेरी परियोजना में, आप न केवल उड़ने वाले रोबोट के साथ काम कर सकते हैं, बल्कि अपने हाथों से गेम कंसोल के साथ भी काम कर सकते हैं। बोलने से पहले, हमारे दोस्तों के पास Arduino UNO R3 (Arduino Design Kits) के लिए विभिन्न घटक हैं। आप जो चाहें, सब कुछ अपने हाथों से कमा सकते हैं। मैं यह कर रहा हूं!

दिन के उजाले में और फिर नींद में, मेरे मन में एक बिजली-नियंत्रित सेट-टॉप बॉक्स बनाने का विचार आया। व्लास्ना, यहां रेडियो प्रौद्योगिकी की समृद्ध और गहन दुनिया मेरे सामने आती है। चूँकि मैं पहले इलेक्ट्रॉनिक्स की गंभीर खराबी से निपटने में असमर्थ था, इसलिए मेरी पसंद एक सरल विकल्प पर आधारित थी - Arduinoयह सबसे व्यापक मॉडल है - संयुक्त राष्ट्र संघ.

रोबोट योजना

1. पुस्तकालय से संपर्क करें
2. वीडियो आउटपुट बोर्ड को सोल्डर करें
3. कोड लिखें
4. विरिज़ति शरीर

ऐसी परियोजनाओं के संबंध में अंतिम बाहरी गोदाम विशेष रूप से महत्वपूर्ण नहीं है।

पाठ 1. आइए जानें कि क्या हो रहा है

कई दर्जन विस्तृत प्रयोगों के बाद, मैं यह समझ नहीं पाया कि डेंडी जैसा उपसर्ग कैसे बनाया जाए। खैर, इसमें परेशान होने की क्या बात है, अगर ले ही लो तो अंजाम तक पहुंचा दो।

Arduino पर परियोजनाओं के लिए समर्पित साइट पर, सामान्य रूप से रेडियोइलेक्ट्रॉनिक्स (विज्ञापन नहीं) में समान विकास के बारे में एक लेख शामिल है। पुस्तकालय का चयन करने का निर्णय लिया गया टीवी बाहर, टीवी सेट-टॉप बॉक्स के टुकड़े। इस रोबोट को स्थापित करने के लिए मुझे थोड़ी शर्मिंदगी उठानी पड़ी।

आवश्यक पुस्तकालय कार्य

मोड सेटिंग फ़ंक्शन

समारोह शुरू करना()वीडियो सिग्नल का आउटपुट समाप्त होता है (अलग स्क्रीन आकार 128x96)।
वाक्य - विन्यास:
TVOut.begin(मोड);
TVOut.begin(मोड, x, y);

पैरामीटर:
मोड - वीडियो सिग्नल मानक:
_PAL - PAL मोड;
_एनटीएससी - एनटीएससी मोड।
मतलब जो घूमता है:
0 - रिमोट कनेक्शन के लिए, 4 - विफलता के लिए (आउटपुट बफर के लिए अपर्याप्त मेमोरी)।

शटर कार्य

समारोह देरी()इससे प्रदर्शित छवि फ़्रीज़ हो जाएगी.
वाक्य - विन्यास:

TVOut.delay(ms);
पैरामीटर:

एमएस - एमएस सटीकता के साथ ट्रिम: पीएएल के लिए 20 एमएस और एनटीएससी के लिए 16 एमएस।

डिले_फ़्रेम() फ़ंक्शन प्रदर्शित छवि को फ़्रीज़ कर देता है।
वाक्य - विन्यास:

TVOut.delay_frame(frames);
पैरामीटर:

फ़्रेम - धुंधला करने के लिए फ़्रेम की संख्या।
यह फ़ंक्शन नवीनतम स्क्रीन पर क्लिक करके स्क्रीन को छोटा या छोटा करने के लिए उपयोगी है।

मापदंडों के चयन के लिए विकल्प

समारोह घंटे()स्क्रीन के क्षैतिज भाग को घुमाता है।
वाक्य - विन्यास:

TVOut.hrs();
पैरामीटर:

नहीं।
मतलब जो घूमता है:

अहस्ताक्षरित चार - क्षैतिज रूप से अलग किया गया स्क्रीन आकार।

Vres() फ़ंक्शन स्क्रीन के ऊर्ध्वाधर पहलू को घुमाता है।
वाक्य - विन्यास:

TVOut.vres();
पैरामीटर:

नहीं।
मतलब जो घूमता है:

अहस्ताक्षरित चार - स्क्रीन का ऊर्ध्वाधर पृथक्करण।

समारोह char_line()पाठ जानकारी के प्रदर्शन के दौरान एक पंक्ति में वर्णों की अधिकतम संभव संख्या को घुमाता है।
वाक्य - विन्यास:

टीवी बाहर। char_line();
पैरामीटर:

नहीं।
मतलब जो घूमता है:

अहस्ताक्षरित वर्ण - वर्णों की संख्या।

बुनियादी चित्रमय कार्य

समारोह सेट_पिक्सेल()निर्दिष्ट निर्देशांक पर बिंदु पर स्क्रीन का पिक्सेल रंग सेट करता है।
वाक्य - विन्यास:

TVOut.set_पिक्सेल(x,y,रंग);
पैरामीटर:

x, y - पिक्सेल निर्देशांक;
रंग - पिक्सेल रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
समारोह get_पिक्सेल()निर्दिष्ट निर्देशांक पर एक बिंदु से स्क्रीन पिक्सेल रंग लेता है।
वाक्य - विन्यास:

TVOut.get_पिक्सेल(x,y);
पैरामीटर:

x, y - पिक्सेल निर्देशांक।
मतलब जो घूमता है:

रंग - पिक्सेल रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
fill() फ़ंक्शन स्क्रीन को निर्दिष्ट रंग से भरता है।
वाक्य - विन्यास:

TVOut.fill(रंग);
पैरामीटर:

रंग - भरने का रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
समारोह साफ़ स्क्रीन()स्क्रीन को साफ़ करता है, उसे निर्दिष्ट रंग के साथ पुनर्स्थापित करता है।
वाक्य - विन्यास:

TVOut.clear_screen(रंग);
पैरामीटर:

रंग - भरने का रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.

समारोह उलटना()स्क्रीन को उलट देता है.
वाक्य - विन्यास:

TVOut.invert();
पैरामीटर:

नहीं।
Shift_direction() फ़ंक्शन स्क्रीन को नष्ट कर देता है।
वाक्य - विन्यास:

TVOut.shift_direction(दूरी, दिशा);
पैरामीटर:

दूरी - स्क्रीन के बजाय स्क्रीन लेने के लिए खड़े हों।
दिशा - सीधे zsuwu को:
यूपी = 0 - ऊपर की ओर;
नीचे = 1 - नीचे;
बाएँ = 2 - बाएँ;
दाएँ = 3 - दाएँ हाथ से काम करने वाला।

समारोह रेखा खींचें()स्क्रीन पर दो बिंदुओं को जोड़ता है।
वाक्य - विन्यास:

TVOut.draw_line(x0,y0,x1,y1,color);
पैरामीटर:

x0, y0 - पहले बिंदु के निर्देशांक;
X1, y1 - दूसरे बिंदु के निर्देशांक;
रंग - भरने का रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
समारोह ड्रा_रो()पंक्ति के दो बिंदुओं के बीच पंक्ति को निर्दिष्ट रंग से भरता है।
वाक्य - विन्यास:

TVOut.draw_row(row,x0,x1,color);
पैरामीटर:

पंक्ति - पंक्ति का ऊर्ध्वाधर निर्देशांक;
x1,x2 - पंक्ति बिंदुओं के क्षैतिज निर्देशांक;
रंग - भरने का रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
ड्रा_कॉलम() फ़ंक्शन दो कॉलम बिंदुओं के बीच पंक्ति को निर्दिष्ट रंग से भरता है।
वाक्य - विन्यास:

TVOut.draw_column(स्तंभ,y0,y1,रंग);
पैरामीटर:

स्तंभ - स्तंभ का क्षैतिज समन्वय;
y1, y2 - प्रारंभिक बिंदुओं के ऊर्ध्वाधर निर्देशांक;
रंग - भरने का रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
समारोह ड्रा_रेक्ट()स्क्रीन पर एक ऑर्थोक्यूटेनियस पौधे को चित्रित करता है।
वाक्य - विन्यास:

TVOut.draw_rect(x,y,w,h,color);
TVOut.draw_rect(x,y,w,h,color,fillcolor);

पैरामीटर:

x,y - ऊपरी बाएँ बिंदु के निर्देशांक;
डब्ल्यू,एच - पेंट किए जा रहे ऑर्थोक्यूटेनियस पौधे की चौड़ाई और ऊंचाई;
रंग - सीधी कटलफिश के बीच का रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
फिल कलर - घास के आवरण का रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
समारोह ड्रा_सर्कल()स्क्रीन पर पेंट.
वाक्य - विन्यास:

TVOut.draw_circle(x,y,r,color);
TVOut.draw_circle(x,y,r,color,fillcolor);

पैरामीटर:

x,y - हिस्सेदारी के केंद्र से समन्वय करता है;
आर - हिस्सेदारी की त्रिज्या;
रंग - स्तंभों के बीच का रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
भरण रंग - भरने का रंग:
0-काला;
1 - सफ़ेद;
2-उलटा रंग.
समारोह बिटमैप()स्क्रीन पर एक रेखापुंज छवि प्रदर्शित करें।
वाक्य - विन्यास:

TVOut.बिटमैप(x,y,bmp,w,h);
पैरामीटर:

x,y - दृष्टिकोण के ऊपरी बाएँ कोने के निर्देशांक;
बीएमपी - मेमोरी ऐरे का संकेतक जहां चित्र सहेजा गया है;
w,h - प्रदर्शित की जाने वाली छवि की चौड़ाई, ऊंचाई;
नीचे हम रेखापुंज छवियाँ बनाने के लिए कोड बनाने की प्रक्रिया को देखेंगे।

पाठ जानकारी प्रदर्शित करने के लिए कार्य

पाठ जानकारी प्रदर्शित करने के कार्य को सक्षम करने के लिए, आपको शामिल फ़ाइलों या फ़ॉन्ट वाली फ़ाइलों को लाइब्रेरी से कनेक्ट करना होगा। क्लाइंट के फ़ॉन्ट सेट से कनेक्ट करने के लिए, आपको स्केच में हेडर फ़ाइल को शामिल करना होगा:
#शामिल करना
निम्नलिखित फ़ॉन्ट सेट लाइब्रेरी के गोदाम में शामिल हैं:

फ़ॉन्ट4x6;
फ़ॉन्ट6x8;
फ़ॉन्ट8x8;
फ़ॉन्ट8x8ext.
समारोह चयन_फ़ॉन्ट()पाठ जानकारी प्रदर्शित करने के लिए एक फ़ॉन्ट का चयन करता है।
वाक्य - विन्यास:

TVOut.select_font(फ़ॉन्ट);
पैरामीटर:

फ़ॉन्ट - फ़ॉन्ट, स्केच से जुड़ा हुआ।

Print_char() फ़ंक्शन स्क्रीन पर एक वर्ण प्रदर्शित करता है।
वाक्य - विन्यास:

TVOut.print_char(x,y,char);
पैरामीटर:

x,y - प्रतीक की स्क्रीन पर स्थिति;
चार - वर्तमान फ़ॉन्ट से वर्ण।

समारोह सेट_कर्सर()स्क्रीन पर टेक्स्ट जानकारी प्रदर्शित करने के लिए कर्सर की स्थिति निर्धारित करता है।
वाक्य - विन्यास:

TVOut.set_cursor(x,y);
पैरामीटर:

x, y – कर्सर के निर्देशांक.
समारोह प्रिंट()स्क्रीन पर एक पंक्ति, एक ची नंबर प्रतीक प्रदर्शित करें।
वाक्य - विन्यास:

TVOut.print(x,y,string);
TVOut.print(x,y,char,base);
TVOut.print(x,y,int,base).

पैरामीटर:

x, y – कर्सर के निर्देशांक.
आधार - प्रदर्शन प्रारूप:
बाइट = 0;
डीईसी = 10 (डिफ़ॉल्ट);
हेक्स = 16.

समारोह प्रिंटएलएन()स्क्रीन पर एक पंक्ति, एक प्रतीक या एक संख्या प्रदर्शित करें और अंत में एक पंक्ति के स्थानांतरण के लिए एक प्रतीक प्रदर्शित करें:
वाक्य - विन्यास:

TVOut.println(x,y,string);
TVOut.println(x,y,char,base);
TVOut.println(x,y,int,base).

पैरामीटर:

x, y – कर्सर के निर्देशांक.
आधार - प्रदर्शन प्रारूप:
बाइट = 0;
डीईसी = 10 (डिफ़ॉल्ट);
हेक्स = 16.

ऑडियो आउटपुट फ़ंक्शन

ध्वनि आउटपुट फ़ंक्शंस ऑडियो आउटपुट के माध्यम से टीवी पर गाने की आवृत्ति सिग्नल भेजने की अनुमति देते हैं।
समारोह सुर()गाने की आवृत्ति का एक ऑडियो सिग्नल देखता है।
वाक्य - विन्यास:

TVOut.tone (आवृत्ति, अवधि);
TVOut.टोन(आवृत्ति)।

पैरामीटर:

आवृत्ति - ऑडियो सिग्नल आवृत्ति;
अवधि - सिग्नल की अवधि.
समारोह एक नहीं()एक ऑडियो सिग्नल का आउटपुट निर्दिष्ट करता है।
वाक्य - विन्यास:

TVOut.noTone().

क्रोक 2. सोल्डरिंग वीडियो बेस

सबसे पहले, हमें समग्र एवी आउटपुट (आरसीए) के माध्यम से वीडियो सिग्नल आउटपुट करने के लिए इस बोर्ड को सोल्डर करने की आवश्यकता है। आइए चरण आरेख का अनुसरण करें:


हम 470 ओम और 1 कोहम के नाममात्र मूल्य वाले दो प्रतिरोधों को समानांतर में एक दूसरे से जोड़ते हैं, और ट्यूलिप केबल के माध्यम से उन्हें "प्लस" मिलाते हैं। इसके बाद, हम अवरोधक को Arduino पिन के 470वें तार से जोड़ेंगे, क्योंकि यह इंगित करता है कि वीडियो प्रदर्शित किया गया था ( वीडियो), और एक में रोकनेवाला से हमारे पास नौवें पिन में एक तार है, क्योंकि यह सिंक्रनाइज़ेशन को इंगित करता है ( साथ-साथ करना). और Arduino पर ट्यूलिप केबल को जमीन पर माइनस करें। अधिक जानकारी ( अंग्रेज़ी)

क्रोक 3. कोड लिखें (gru)

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

चलो साथ - साथ शुरू करते हैं विटन्नया स्क्रीनन्योगो के बिना कुड़ी। लेकिन यहां भोजन का महत्व अधिक है, इस चमत्कार को आप क्या कहेंगे? मैंने धब्बा बिखेरा और लेकर आया - शिमो. यह बुरा लगता है, यह तकनीकी लगता है, यह चीनी लगता है, यह बुरा लगता है, लेकिन इससे कोई फर्क नहीं पड़ता।

चलो शुरू करो। सहायता के लिए स्क्रीन के मध्य से एक रेखा खींचें TV.draw_line(60,0,60,96,1);. बैग स्क्रीन के बिल्कुल मध्य में दिखाई देता है। आइए फ़ंक्शन योगो रुख लिखें शून्य बॉलमूव (इंट वेल, इंट एंगल). सहायता के लिए इंस्टॉल करें TV.set_पिक्सेल(x,y,1);, मैंने उन्हें वह कहा।

इसके अलावा, बैग में हेरफेर करने से पहले, स्क्रीन को अपडेट करना आवश्यक है, या अधिक सटीक रूप से, ताकि बैग स्क्रीन पर "रहने" न पाए, फिर आक्रामक स्थिति में जाने पर, सामने वाले हिस्से को काले रंग से भरना आवश्यक है। जिसके लिए हमें फैसले से पहले लिखना होगा TV.set_पिक्सेल(x,y,0);. निर्देशांक में सभी परिवर्तनों के बाद, पहले से स्थापित पदों और एक छोटे नोट को पंजीकृत करना आवश्यक है - टीवी.देरी(50);. आप लगभग इस प्रकार प्रवेश कर सकते हैं:

शून्य बॉलमूव(इंट वेल, इंट एंगल) (टीवी.सेट_पिक्सेल(x,y,0); //निर्देशांक का हेरफेर टीवी.सेट_पिक्सेल(x,y,1); )

अब निर्देशांक बदलने के बारे में। सभी दिशाओं में प्रयोग (1-8), परिवर्तन पूर्णांक कोण. और वहां यह पहले से ही सरल है, मोड़ने से पहले सावधानी से, हम किसी भी हिस्से को हटा देते हैं या परिवर्तन में जोड़ देते हैं अंतर वेग. मैंने इसे इस प्रकार किया:

अगर(कोण == 1) ( वाई -= वेल; ) अगर(कोण == 3) ( एक्स += वेल; ) अगर(कोण == 5) ( वाई += वेल; ) अगर(कोण == 7) ( x -= वेल; ) यदि(कोण == 2) ( x += राउंड(वेल/2); y -= राउंड(वेल/2); 2);y += राउंड(वेल/2); ) यदि(कोण == 6) ( x -= गोल(वेल/2); y += गोल(वेल/2); ( x -= गोल(वेल/2); y -= गोल(वेल/2); )

अब रैकेट क्रैश हो रहे हैं. यहां स्पष्ट करना महत्वपूर्ण है - मैं निर्देशांक के बिना एक विकोरिस्ट हूं , तो रैकेट की स्थिति कैसी है? एक्समत बदलो. आइए अगला कार्य निर्धारित करें शून्य रैकेट चाल(). आगे हम रैकेटों को रंगते हैं, उन्हें बदलते हैं int yb1, int yb2, TV.draw_line(10, yb1+8, 10, yb1-8, 1);і TV.draw_line(110, yb2+8, 110, yb2-8, 1);. स्क्रीन को अपडेट करना, ताकि "बिना किसी निशान के", एक बैग से बाहर निकलने के समान हो।

रैकेट को नियंत्रित करने के लिए, बटनों का अनुसरण करें। बटन, पिन कनेक्ट करें 2 і 3 - पहला रैकेट, 4 і 5 - एक और रैकेट। हम बटनों के दबाव की जांच करते हैं और निर्देशांक बदलते हैं।

अक्ष निम्नलिखित कार्य है:

शून्य रैकेट्समूव() ( TV.draw_line(10, yb1+8, 10, yb1-8, 0); TV.draw_line(110, yb2+8, 110, yb2-8, 0); if((yb1 - 8) > 1) ( if(digitalRead(2) == हाई) ( yb1 -= 2;) ) if((yb1 + 8)< 95) { if(digitalRead(3) == HIGH) {yb1 += 2;} } if((yb2 - 8) >1) ( if(digitalRead(4) == हाई) (yb2 -= 2; ) ) if((yb2 + 8)< 95) { if(digitalRead(5) == HIGH) {yb2 += 2;} } TV.draw_line(10, yb1+8, 10, yb1-8, 1); TV.draw_line(110, yb2+8, 110, yb2-8, 1); }

मैं अब पलटूंगा गेंद. आइए अब पहिये के आकार और रैकेट और दीवारों के स्थान को लिखें। समारोह - शून्य बॉलकोल(). जिसके लिए हम बस वस्तुओं का स्थान और फिर स्थान की जांच करते हैं। फिर इस कट को दूसरे कट में बदल दिया जाता है. यह पता लगाना आसान है कि यह कौन है।

यहां उस प्राचीन शहर की छवि है, जहां पतन होता है

आप रैकेट के गायन क्षेत्रों के लिए कई भौतिक तरकीबें बना सकते हैं।

शून्य बॉलकोल() ( यदि(x == 1 || x == 119 || (x == 10 && y< (yb1 + 3) && y > < (yb2 + 3) && y > < (yb1 - 3) && y >(yb1 - 8)) ( a = 2; ) यदि(x == 10 && y > (yb1 + 3) && y< (yb1 + 8)) { a = 4; } if(x == 110 && y < (yb2 - 3) && y >(yb2 - 8)) ( a = 8; ) यदि(x == 110 && y > (yb2 + 3) && y< (yb2 + 8)) { a = 6; } if(y == 95 || y == 1) { if(a==1){a=5;}else if(a==2){a=4;}else if(a==3){a=7;}else if(a==4){a=2;}else if(a==5){a=1;}else if(a==6){a=8;}else if(a==7){a=3;}else if(a==8){a=6;} } }

जितनी जल्दी हो सके, आप सफलतापूर्वक मर सकते हैं।

फिलहाल, हम केवल स्कोर, टाइमर और रीस्टार्ट रखने के लिए सिस्टम नहीं बना सकते हैं।

आइए टाइमर के साथ समाप्त करें। सेकंड बदलें फ्लोट टी.एस(यह बिल्कुल पूरा घंटा बचाता है), मिन्ना int tm(अनाजों की संख्या जिनसे हम निकालते हैं टी). मूल्य ते करना टीएमसंचालन टीएम = टीएस/60;. І मान स्क्रीन पर प्रदर्शित होते हैं, टीवी.प्रिंट(81,1,टीएम); TV.print(97,1,''); TV.print(100,1,int(ts-(tm*60)));.

प्रोडोवझिमो. पुनरारंभ फ़ंक्शन को कहा जाता है शून्य पुनरारंभ(). यहां हम परिवर्तनों के मोटे अर्थों की ओर मुड़ते हैं।

शून्य पुनरारंभ() ( TV.clear_screen(); x = 60; y = 48; yb1 = 48; yb2 = 48; a = 8; ts = 900.0; c1 = 0; c2 = 0; )

समापन, इनाम अंक की प्रणाली, बहुत सरल है। हम Google खोलते हैं और "टेबल टेनिस के नियम" टाइप करते हैं। मुझे आश्चर्य है कि अंक किस लिए दिए गए हैं। हम दंड के बारे में कुछ जानते हैं, और फिर हम सफलतापूर्वक जानते हैं: "यदि प्रतिद्वंद्वी पहली छलांग के बाद गेंद को सही ढंग से हिट करने में असमर्थ है तो एक अंक अर्जित किया जाता है।" भोजन परिपक्व हो रहा है, हम प्रहारों को कैसे पुनर्जीवित कर सकते हैं?.. और प्रहारों को पुनर्जीवित करने की आवश्यकता नहीं है, यहाँ तक कि दोहरे आयामी ग्राफिक्स वाले हमारे पिंग-पोंग को भी।

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

शून्य बॉलकाउंट() ( यदि(x == 1) ( c2++; ) यदि(x == 119) ( c1++; ) यदि(c1 >< c2 && ts == 0) { TV.println(10, 45, "Player 2 won!"); delay(10000); restart(); } else if(c1 == c2 && ts == 0) { TV.println(10, 45, "You are equal"); delay(10000); restart(); }

एक्सिस और बस इतना ही, दोस्तों, हमने कोड ग्रि लिखा। यह काफी हो गया और आप इसे खो सकते हैं।


आलसी लोगों के लिए, मैं बस सारा कोड लिख दूँगा।

नई स्क्रिप्ट

उस्योगो 218 पंक्तियाँ। #शामिल करना #शामिल करना टीवीआउट टीवी; int x, y, a, c1, c2, yb1, yb2, tm, tsh, s; फ्लोट टीएस; बूलियन रोका गया = गलत; शून्य सेटअप() (TV.begin(NTSC, 120, 96); TV.clear_screen(); TV.select_font(font6x8); TV.println(0, 50, "शिमो में आपका स्वागत है"); TV.clear_screen(); x = 60; y = 48; yb1 = 48; yb2 = 48; a = 8; ts = 900.0; s = 2; ) शून्य लूप () ( if(! (60,0,60,96,1); टीवी .select_font(font8x8); रैकेट्समूव(); बॉल्सकाउंट(); TV.print(1,1,c1); ;TV.print(26,1,c2);tm = ts / 60; ts -= 0.04; if( टी< 0) { ts = 0; } TV.draw_rect(81,1,38,10,0,0); TV.print(81,1,tm); TV.print(97,1,"."); TV.print(100,1,int(ts-(tm*60))); ballcol(); /*if(ts < 600) { s = 4; } if(ts < 300) { s = 6; }*/ ballmove(s, a); TV.delay(50); if(digitalRead(6) == HIGH) { paused = true; delay(1000); } } else { TV.println(40,4,"pause"); if(digitalRead(6) == HIGH) { paused = false; delay(1000); TV.clear_screen(); } } } void ballscount() { if(x == 1) { c2++; } if(x == 119) { c1++; } if(c1 >c2 && ts == 0) ( TV.println(10, 45, "खिलाड़ी 1 जीता!"); देरी(10000); पुनरारंभ(); ) अन्यथा यदि(c1< c2 && ts == 0) { TV.println(10, 45, "Player 2 won!"); delay(10000); restart(); } else if(c1 == c2 && ts == 0) { TV.println(10, 45, "You are equal"); delay(10000); restart(); } } void ballcol() { if(x == 1 || x == 119 || (x == 10 && y < (yb1 + 3) && y >(yb1 - 3)) | (x == 110 && y< (yb2 + 3) && y >(yb2 - 3))) ( if(a==1)(a=5;)else if(a==2)(a=8;)else if(a==3)(a=7;)else अगर(ए==4)(ए=6;)और अगर(ए==5)(ए=1;)और अगर(ए==6)(ए=4;)और अगर(ए==7)( a=3;)अन्यथा यदि(a==8)(a=2;) ) यदि(x == 10 && y< (yb1 - 3) && y >(yb1 - 8)) ( a = 2; ) यदि(x == 10 && y > (yb1 + 3) && y< (yb1 + 8)) { a = 4; } if(x == 110 && y < (yb2 - 3) && y >(yb2 - 8)) ( a = 8; ) यदि(x == 110 && y > (yb2 + 3) && y< (yb2 + 8)) { a = 6; } if(y == 95 || y == 1) { if(a==1){a=5;}else if(a==2){a=4;}else if(a==3){a=7;}else if(a==4){a=2;}else if(a==5){a=1;}else if(a==6){a=8;}else if(a==7){a=3;}else if(a==8){a=6;} } } void racketsmove() { TV.draw_line(10, yb1+8, 10, yb1-8, 0); TV.draw_line(110, yb2+8, 110, yb2-8, 0); if((yb1 - 8) >1) ( if(digitalRead(2) == हाई) ( yb1 -= 2; ) ) if((yb1 + 8)< 95) { if(digitalRead(3) == HIGH) { yb1 += 2; } } if((yb2 - 8) >1) ( if(digitalRead(4) == हाई) ( yb2 -= 2; ) ) if((yb2 + 8)< 95) { if(digitalRead(5) == HIGH) { yb2 += 2; } } TV.draw_line(10, yb1+8, 10, yb1-8, 1); TV.draw_line(110, yb2+8, 110, yb2-8, 1); } void ballmove(int vel, int angle) { TV.set_pixel(x,y,0); if(angle == 1) { y -= vel; } if(angle == 3) { x += vel; } if(angle == 5) { y += vel; } if(angle == 7) { x -= vel; } if(angle == 2) { x += round(vel/2); y -= round(vel/2); } if(angle == 4) { x += round(vel/2); y += round(vel/2); } if(angle == 6) { x -= round(vel/2); y += round(vel/2); } if(angle == 8) { x -= round(vel/2); y -= round(vel/2); } TV.set_pixel(x,y,1); } void restart() { TV.clear_screen(); x = 60; y = 48; yb1 = 48; yb2 = 48; a = 8; ts = 900.0; c1 = 0; c2 = 0; }

क्रोक 4. वीर्यवान शरीर

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


गेमपैड के लिए, मैंने छोटे बोर्ड बनाए और बटनों के लिए छेद किए। यह बुरा निकला, लेकिन, दुर्भाग्य से, मैंने तस्वीर बर्बाद कर दी।

विस्नोवोक

इस प्रक्रिया में, दो गेमपैड के साथ एक मानक पिंग पोंग गेम के साथ Arduino पर एक टीवी गेम कंसोल पर एक सरल गेम बनाया गया था, जिसमें हम खेल सकते हैं और फंस सकते हैं।