توسعه بازی برای کنسول مبتنی بر آردوینو با استفاده از Unity. آردوینو UNO R3 (بازی پینگ پنگ را خودمان می سازیم) ست تاپ باکس تلویزیون روی آمپر آردوینو

کنسول بازی در آردوینو؟ صحیح صحیح. با صفحه نمایش، دکمه ها و بازی ها. و این فانتزی نیست. چندین پروژه وجود داشت (و هنوز هم هستند) که سعی در انجام این کار داشتند و ما سعی خواهیم کرد یکی از آنها (Gamebuino) را خودمان پیاده سازی کنیم.

از آنجایی که پروژه باز است، تمام شماتیک‌ها و همچنین پیوندهایی به نرم‌افزار، بازی‌ها و سایر اطلاعات مفید در ویکی موجود است.

برای ایجاد کنسول بازی خودمان به اجزای ارزان قیمت نیاز داریم - صفحه نمایش نوکیا 5110، شش دکمه و یک بلندگوی پیزو. همه اینها را می توان به راحتی در Aliexpress یا سایر وب سایت های فروشگاه های چینی (عمدتاً مشکل پیدا کردن صفحه نمایش) و حتی در روسیه پیدا کرد. صفحه نمایش را می توان "عظیم" نامید و به خوبی توصیف شده است، بنابراین اتصال آن به آسانی بیرون آوردن آن است.

از آنجایی که Gamebuino از یک چیدمان مناسب برای قرار دادن عناصر روی برد استفاده می کند، وقتی سعی می کنیم عناصر را از طریق پین های استاندارد آردوینو به هم وصل کنیم، این تصویر را دریافت می کنیم:

در واقع، برخی از عناصر قبلاً «از دست رفته‌اند»، زیرا Gamebuino از مخاطبین ریزپردازنده استفاده می‌کند که در آردوینو مسیریابی نمی‌شوند یا به سادگی مورد نیاز نیستند. سنسور شارژ باتری، دکمه C و کارت SD (آنها به هم متصل هستند) و سنسور نور محیط حذف شدند. همچنین تصمیم گرفته شد که مقاومت ها را حذف کنیم - ما از صفحه نمایش 24/7 استفاده نمی کنیم و می توانیم بدون این محافظت انجام دهیم.

می‌توان این کار را «به زیبایی» انجام داد، اما پس از آن باید کد همه کتابخانه‌ها و مخاطبین «نقشه» را مطابق با آن اصلاح کنیم. طرح جدید. تصمیم گرفتم خودم را فقط به لوازم آرایشی محدود کنم - یعنی از مخاطبین "استاندارد" استفاده کنم و فقط در صورت لزوم تغییرات جزئی در کد ایجاد کنم.

بنابراین - پس از مونتاژ مدار، باید Arduino IDE را نصب کرده و این آرشیو را دانلود کنید. باید آن را در پوشه Documents/Arduino باز کنید و سپس Arduino IDE را راه اندازی کنید. قبلاً تغییراتی در کد کتابخانه در این آرشیو ایجاد شده است و با این طرح "خارج از جعبه" کار خواهد کرد.

اکنون باید نمونه های Gamebuino داشته باشید که به شما امکان می دهد نمایشگر، دکمه ها و غیره را آزمایش کنید. و حتی پونگ را شروع کنید. برای برد، از یک Arduino UNO یا Leonardo استاندارد استفاده کنید (هنوز آن را روی دیگران آزمایش نکرده‌ام).

وقتی همه چیز برای شما کار می کند، حرکت می کند، بوق می دهد و غیره. یک سوال طبیعی مطرح می شود - بازی ها کجا هستند؟ Gamebuino از بوت لودر خود برای کار با کارت های SD استفاده می کند، بنابراین بارگذاری HEX از طریق لودر آنها بدون فلش کردن خود آردوینو کار نخواهد کرد. اما حتی اگر این کار را انجام دهید، به دلیل عدم دریافت سیگنال از باتری، نمی توانید چیزی را شروع کنید، زیرا سیستم عامل فحش می دهد و خاموش می شود. HEX از پیش کامپایل شده با بازی نیز به دلیل مشکلات حسگر شارژ باتری نمی تواند راه اندازی شود.

اما همه چیز گم نشده است - می توانید دانلود کنید کدهای منبع، آنها را در Arduino IDE باز کنید و آنها را در کنسول ما آپلود کنید.

من برخی از بازی ها را بررسی کردم و آنها ... کار می کنند! می توانید آرشیو با سورس کد بازی ها را از اینجا دانلود کنید، آنها را در Arduino IDE باز کنید و خودتان آنها را کامپایل و دانلود کنید. می‌توانید بقیه بازی‌ها را خودتان با دانلود کدهای منبع از Gamebuino Wiki امتحان کنید.

بنابراین - ماموریت انجام شد! یک کنسول بازی مینیاتوری دریافت کردیم. حالا وظیفه ما موبایل ساختن آن است :) و در مقالات بعدی سعی می کنیم این کار را انجام دهیم.

سلام گیک تایمز!
امروز یکی را به شما می گویم که چندان خوب نیست داستان جالبدر مورد اینکه چگونه با استفاده از یک کنسول بازی ساده ایجاد کردم پایه آردوینوو یک بازی ساده برای آن در موتور بازی مورد علاقه من - یونیتی ساختم.

بازی ها

تقریباً چهار سال است که با استفاده از موتور بازی محبوب Unity (که قبلا Unity3D نامیده می شد) بازی ها را توسعه می دهم. در این مدت موفق شدم چندین بازی کوچک برای آن بسازم دستگاه های تلفن همراهو همچنین یک پروژه بزرگ چند کاربره.
این حوزه برای من بسیار جالب است و کار کردن در آن لذت زیادی به من می دهد.

دستگاه ها

اما گاهی اوقات می خواهید چیز جدیدی را امتحان کنید و یکی از آن روزها تصمیم گرفتم آردوینو را امتحان کنم.
من بسیار علاقه مند شدم که چگونه دستگاه های خود را بسازم و چگونه آنها را برنامه ریزی کنم. چرا آردوینو؟ پست های زیادی در اینترنت و حتی در همان هاب و Geek Times در مورد اینکه چرا باید آردوینو بخرید وجود دارد. اما توجه می کنم که برای من عامل تعیین کننده در انتخاب آردوینو سهولت استفاده است.

چگونه این را ترکیب کنیم؟

یک روز در اینترنت به پستی برخورد کردم که چگونه یکی از کاربران کنسول بازی ساده خود را بر اساس آردوینو مونتاژ کرد و آن را به یک صفحه نمایش LCD کوچک 84x48 پیکسل مجهز کرد و چند بازی ساده روی آن نوشت: Pong و Arkanoid. .
این توسعه برای من بسیار جالب بود و تصمیم گرفتم نسخه خود را از یک کنسول بازی بر اساس میکروکنترلر atmega328 ایجاد کنم.

خود کنسول

اول از همه LUT را طراحی و ساختم تخته مدار چاپیبرای یک کنسول قابل حمل این یک اشتباه بود - ابتدا باید برنامه را روی یک برد اشکال زدایی آزمایش می کردم، به عنوان مثال arduino uno، زیرا توانایی آپلود سریع و راحت برنامه ها را در کنترلر فراهم نکردم. در خود مدار هم اشتباه کردم با سیم می شد اصلاح کرد ولی باز هم حیف بود.
بعد از اینکه متوجه شدم اشتباه می کنم دکمه ها را از طریق برد به arduino uno وصل کردم و صفحه را مستقیما وصل کردم.
این چیزی است که اتفاق افتاد:



و حالا به بازی ها

برای ساخت بازی تصمیم گرفتم از موتور بازی Unity استفاده کنم. من یک کامپایلر از Mono C# در برنامه ای برای آردوینو ننوشتم، اما تصمیم گرفتم مجموعه ای از اسکریپت ها را بنویسم که بتوانید با آن به راحتی بازی بسازید.
من تمام فیلمنامه ها را به 3 گروه تقسیم کردم - اکشن ها، شرایط و ترکیب کننده ها.
من فکر می کنم که هدف از اعمال و شرایط نیاز به توضیح ندارد، اما توضیح خواهم داد که چرا به ترکیب کننده نیاز است. ترکیب کننده بررسی می کند که آیا شرط برقرار است یا خیر و سپس عمل را انجام می دهد.
الگوریتم از اسکریپت ها یا بهتر بگوییم حضور و ترکیب آنها، برنامه ای برای آردوینو ایجاد می کند.

چه نوع بازی؟

تصمیم گرفتم با یک چیز ساده شروع کنم. ساده ترین بازی ای که می شناسید چیست؟ درست است - پنگ. اما من تصمیم گرفتم که نه واقعا پنگ، بلکه پنگ برای یکی درست کنم - به جای راکت دوم، یک راکت، یک توپ و یک دیوار وجود دارد.
من آن را از سازنده نوشته شده اسمبل کردم، کامپایل کردم و در کنترلر آپلود کردم. آثار!

حالا بیایید همه چیز را مرتب کنیم

وقتی بازی شروع شد و من به اندازه کافی آن را بازی کردم، به این نتیجه رسیدم که ارزش دارد تخته را دوباره کار کنم و آن را بدهم نمای زیبا، از اجزای smd استفاده کنید و همه چیزهای غیر ضروری را حذف کنید. مدار را دوباره درست کردم و یک تابلو درست کردم.
این چیزی است که اتفاق افتاد



منابع

کد منبع بسیار ساده است.
کاری که یونیتی انجام می دهد این است که کاربر در ویرایشگر یک بازی را از اشیاء رابط کاربری مونتاژ می کند، اسکریپت هایی از اقدامات، شرایط و ترکیب کننده ها را به آنها متصل می کند.
کاری که کامپایلر انجام می دهد (اسکریپت parser.cs) این است که از طریق تمام آبجکت ها اجرا می شود، به اسکریپت های آنها نگاه می کند و تکه هایی از کد را به متن فایل build.ino اضافه می کند که مسئول اجرای آنالوگ های این اسکریپت ها در میکروکنترلر هستند.

پیوند به منابع - drive.google.com/open?id=0B5INc3_98cSJMEMxZmlWUTh1Ukk
کامپایل زمانی اتفاق می افتد که بازی شروع می شود. و در پوشه Assets/build/text/built.ino ذخیره شد
این طرح باید در کنترلر آپلود شود.

در بازداشت

میخوام بگم خیلی جالب بود
من این فرصت را به دست آوردم که 2 مورد از فعالیت های خود را ترکیب کنم - توسعه بازی و ساخت دستگاه.
امیدوارم شما هم به این موضوع علاقه داشته باشید و حالا دستگاه جالب خود را نیز بسازید =)

بیایید شروع به ایجاد یک بازی با نام رمز "Arithmetic Collector" کنیم. پخش کننده توسط یک جوی استیک با قابلیت حرکت در یک میدان 128x90 کنترل می شود. با انحراف جوی استیک صفر، بازیکن در مرکز قرار دارد. حداکثر انحراف جوی استیک با حداکثر حرکت بازیکن مطابقت دارد. در یک بازه زمانی معین، اشیاء عددی تولید می شوند که از بالا به پایین حرکت می کنند. با رسیدن به موقعیت پایین صفحه، جسم شکل ناپدید می شود و امتیاز بازیکن را با مقدار این رقم کاهش می دهد. اگر بازیکن یک شی عددی را روی صفحه نمایش رهگیری کند، این باعث می شود که شی عددی ناپدید شود و شمارنده امتیاز بازیکن افزایش یابد. با یک دوره تناوب مشخص، نماد بازیکن مقدار خود را از عدد 0 به 9 تغییر می دهد. هنگام قطع یک شی رقمی، شمارنده امتیاز بازیکن به میزانی برابر با مجموع شی رقم و رقم بازیکن افزایش می یابد؛ اگر رقم بازیکن برابر باشد. برابر با رقم شی رقمی است، سپس شمارنده امتیاز بازیکن با حاصل ضرب اعداد افزایش می یابد. پس از رسیدن به آستانه های نقطه ای خاص، انتقال به نقطه های بیشتر وجود دارد سطح بالابازی هایی که منجر به افزایش سرعت حرکت و سرعت تولید اشیاء عددی می شود. علاوه بر این، از سطح 4 بازی، برخورد بازیکن با یک شی رقمی نه تنها منجر به افزایش شمارنده بازیکن می شود، بلکه به کاهش نیز منجر می شود (اگر رقم بازیکن کمتر از رقم شی رقم باشد). اگر امتیاز بازیکن به زیر صفر برسد، بازی دوباره شروع می شود.

در اینجا یک ویدیو از آنچه اتفاق افتاده است

می توانید آرشیو را با فایل های اسکچ و کتابخانه 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 – مقدار مکان نما فعلی؛
  • blinkCursor - وضعیت فعلی چشمک زدن مکان نما.
  • vblink – سرعت چشمک زدن در vk;
  • vk - سرعت حرکت بازیکن - بررسی ورودی های A0، A1.
  • vo_10 - نرخ تغییر رقم بازیکن؛
  • vo_11 - سرعت ظاهر اشیاء عددی.
  • vo_12 – سرعت حرکت اجسام دیجیتال.
  • count_objects - تعداد اشیاء شماره در فیلد.
  • سطح - سطح بازی؛
  • توپ - تعداد امتیاز.

int MAX_X=31; int MAX_Y=14; // ساختار داده های بازی ساختار GAME // ساختار برای داده های بازی (int xk; // x(/4) مختصات بازیکن int yk؛ // y(/6) مختصات بازیکن int tekCursor؛ // مقدار مکان نما فعلی int blinkCursor؛ // وضعیت فعلی چشمک زدن مکان نما int vblink؛ // سرعت چشمک زدن در vk طولانی vk؛ // سرعت حرکت بازیکن - بررسی ورودی های A0، A1 طولانی vo_10؛ // سرعت تغییر ارقام پخش کننده طولانی vo_11؛ // سرعت ظاهر شدن ارقام طولانی vo_12؛ // سرعت حرکت اعداد int count_objects؛ //تعداد اشیاء در زمین سطح int؛ // سطح بازی int balls؛ // تعداد امتیازها). int MAX_OBJ=30; int FIGURA=((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) );

کنترل موقعیت بازیکن با استفاده از جوی استیک.

موقعیت بازیکن روی صفحه با حرکت جوی استیک تعیین می شود. پین های جوی استیک به پورت های آنالوگ A0، A1 برد آردوینو متصل می شوند. پورت‌ها پس از مدتی که توسط پارامتر GAME.vk تعیین می‌شود نظرسنجی می‌شوند؛ این داده‌ها توسط تابع map() پردازش می‌شوند که به طور متناسب مقدار را از محدوده فعلی 0-124 به یک محدوده جدید (مقادیر عرض و ارتفاع صفحه) منتقل می‌کند. سپس این مقدار به مختصات آشنایی تبدیل می شود. لازم است تصویر نماد بازیکن را با قرار دادن علامت فاصله در موقعیت قبلی بازیکن به این مکان آشنا منتقل کنید. برای نمایش پخش کننده، از نماد چشمک زن استفاده می شود - یک عدد و یک فاصله.

//******************** تنظیم موقعیت بازیکن جدید void set_iam() (TV.set_cursor(min(123,GAME1.xk*4),min(84,GAME1 . yk*6)؛ TV.print(" ")؛ GAME1.xk=map(analogRead(A0), 0, 1024, 0, 128); GAME1.yk=map(analogRead(A1), 0, 1024, 0 , 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(” “); }

نماد پخش کننده پس از مدتی که توسط پارامتر GAME.vo_10 تعیین می شود با فراخوانی تابع set_new_cursor() تغییر می کند، تغییر به طور تصادفی با استفاده از تابع ()random رخ می دهد.

//******************** تنظیم نوع جدیدی از نماد پخش کننده 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)<>(برای(int i=0;i;i++)<>( if(FIGURA[i]==0) (null_index=i;break;) ) FIGURA=random(1,9); FIGURA=تصادفی(0,MAX_X); FIGURA=0; // خروجی به برد TV.set_cursor(FIGURA*4,0); TV.print(FIGURA); GAME1.count_objects++; ))

تابع برای جابجایی اشیاء دیجیتال (go_object()) پس از زمان مشخص شده توسط پارامتر GAME.vo12 فراخوانی می شود. تجسم حرکت اجسام رقمی با پاک کردن یک نماد از موقعیت قبلی شی (نوشتن یک کاراکتر فاصله) و نوشتن نماد شی در یک موقعیت جدید (مختصات عمودی آشنایی شی رقمی یک عدد افزایش می‌یابد) انجام می‌شود. . با رسیدن به پایین صفحه، شی عدد حذف می شود (نوشتن 0 در عنصر آرایه FIGURA[i])، و همچنین تعداد امتیازهای بازیکن کاهش می یابد.

//******************** حرکت یک شی رقمی void 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]); ) other (TV.tone(294200)؛ change_balls(FIGURA [i]*(-1))؛ FIGURA[i]=0؛ GAME1.count_objects–; ) ) ))

بررسی برخورد بین بازیکن و اشیاء عددی.

هنگام حرکت نماد پخش کننده در سراسر صفحه، لازم است برخورد بین پخش کننده و اشیاء عددی را بررسی کنید. برای این کار از تابع collision() استفاده می کنیم. پس از تنظیم نماد مربوط به پخش کننده، عناصر آرایه FIGURA را بررسی می کنیم تا ببینیم آیا مختصات اشیاء رقمی با مختصات نماد بازیکن مطابقت دارد یا خیر. اگر مختصات مطابقت دارند، اقدامات زیر را انجام دهید:

  • شی رقمی از آرایه FIGURA از بین می رود (ورودی 0 در FIGURA[[i]).
  • 1 شمارنده برای تعداد اشیاء عددی کاهش می یابد (GAME.count_objects)
  • شمارنده امتیاز بازیکن تغییر می کند (با فراخوانی تابع change_balls()).

//******************** بررسی برخورد void collision() ( for(int i=0;i;i++)<>( if(FIGURA[i]>0) ( if(FIGURA[i]==GAME1.xk && FIGURA[i]==GAME1.yk) (TV.tone(740200); if(FIGURA[i]==GAME1 .tekCursor) change_balls(GAME1.tekCursor*GAME1.tekCursor)؛ در غیر این صورت if(FIGURA[i]>GAME1.tekCursor && GAME1.level>3) change_balls(FIGURA[i]*(-1))؛ در غیر اینصورت change_balls(FIGURA[ i]+GAME1.tekCursor؛ FIGURA[i]=0؛ GAME1.count_objects–؛ ))))

تابعی که شمارشگر امتیاز بازیکن را تغییر می دهد (change_balls()) به عنوان آرگومان عددی را که باید شمارشگر امتیاز بازیکن را افزایش دهد (کاهش) می دهد. این عدد برابر است با مجموع جسم رقمی و رقم بازیکن. اگر رقم بازیکن برابر با رقم شی رقم باشد، مقداری برابر با حاصلضرب ارقام ارسال می شود. برای افزایش سختی بازی از سطح 4، برخورد بازیکن با یک شی رقمی نه تنها باعث افزایش شمارنده بازیکن می شود، بلکه باعث کاهش نیز می شود (اگر رقم بازیکن کمتر از رقم شی رقم باشد).

شمارنده امتیاز بازیکن

تابع change_balls() شمارنده امتیاز بازیکن را با مقدار آرگومان ورودی تغییر می دهد. اگر شمارنده امتیاز به زیر صفر برسد، بازی به پایان می رسد، صفحه نمایش پاک می شود و بازی به ابتدا باز می گردد. علاوه بر این، هنگامی که شمارنده به مقادیر خاصی می رسد، بازی به سطح جدید و بالاتری منتقل می شود. تابع new_level() مقادیر را برای سطح جدید تنظیم می کند.

//******************** تغییر امتیازهای کسب شده void change_balls(int ball) (GAME1.balls=GAME1.balls+ball; if(GAME1.balls<0) start_game(); if(GAME1.balls>(GAME1.level+1)*100) new_level(GAME1.level); set_data_tablo(); )

بردن آن به سطح بعدی.

هنگام انتقال به سطح جدیدی از بازی، مقادیر جدیدی برای سرعت تولید و سرعت حرکت اشیاء عددی تنظیم می شود. در ابتدا قرار بود مقدار نرخ تغییر رقم بازیکن و سرعت حرکت بازیکن تغییر کند، اما در طول تست بازی تصمیم گرفتم این کار را رها کنم. اقدامات تنظیم مقادیر متغیر برای یک سطح بازی جدید در تابع new_level() انجام می شود

//******************** تغییر سطح بازی void new_level(int tek_level) (GAME1.level++; GAME1.vo_10=5000; GAME1.vo_11=2000-(GAME1. سطح -1)*100؛ GAME1.vo_12=1000-(GAME1.level-1)*100؛ )

نمایش داده های بازی در جدول امتیازات

برد اطلاعات پخش کننده در پایین صفحه قرار دارد. در اینجا نمایش داده شده است مقادیر فعلیتعداد امتیازات و سطح بازی. هنگامی که شمارنده امتیاز بازیکن تغییر می کند، تابع ()set_data_tablo فراخوانی می شود که مقدار تعداد امتیازهای کسب شده و سطح بازی را در متغیرهای ساختار GAME و روی تابلوی امتیاز تغییر می دهد.

//******************** خروجی داده به تابلوی امتیاز void set_data_tablo() ( TV.print(20,91," balls= "); TV.print(70, 91 ,” level= “); TV.print(48,91,GAME1.balls); TV.print(98,91,GAME1.level)؛ )

موسیقی متن بازی.

برای طراحی صدای بازی از عملکرد تن (فرکانس، مدت زمان) کتابخانه TVOut استفاده خواهیم کرد. هنگامی که یک جسم عددی به انتهای زمین بازی می رسد - TV.tone(294200) (تابع go_object())، هنگامی که یک پخش کننده و یک جسم عددی با هم برخورد می کنند - TV.tone(740200) (تابع برخورد()). اگر می خواهید قطعه ای از پخش متوالی چندین نت را در پروژه وارد کنید، پس از خروجی هر نت با دستور tone(frequency, duration) باید یک تاخیر با دستور delay() با مدت زمان کمتر از مدت زمان وارد کنید. پارامتر، 6 - پخش متوالی دو اما با مکث.

TV.tone(294,200); TV.delay(400); TV.tone(740200);

حلقه اصلی بازی

چرخه اصلی برنامه شامل فراخوانی توابعی است که ما در نظر گرفتیم set_iam()، collision()، go_object()، set_new_object()، set_new_cursor() پس از یک دوره زمانی تنظیم شده در متغیرهای GAME.vk، GAME.vo_10، GAME. .vo_11، GAME.vo_12.

int game1() ( while(GAME1.balls>0 && GAME1.level<6) { long time2=millis(); if(time2-time11>GAME1.vk) (set_iam(); collision(); 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); ) if(GAME1.balls<0) return 0; else if(GAME1.level>5) بازگشت 0; else بازگشت 1; )

افزودن منوی انتخاب بازی ها

بیایید یک منو به طرح اضافه کنیم تا سه بازی را که می توانید خودتان اضافه کنید، نمایش دهید.

void loop() ( switch(menu(pmenu)) ( case 1:start_game(); while(game1()>0); break; default: break; ) ) //**** منو برای انتخاب یک بازی int منو (int poz) (TV.clear_screen(); pmenu=max(poz,1); int pmenu1=pmenu; TV.println(60,30,”Game 1″); TV.println(60,50,”Game 2 اینچ؛ TV.println (60،70، «بازی 3»)، TV.draw_rect (50.5+20*pmenu، 40،10، WHITE، INVERT); TV.delay (500)؛ while (digitalRead (12) ==پایین) (if(analogRead(A1)<100) pmenu=max(pmenu-1,1); else if(analogRead(A1)>900) pmenu=min(pmenu+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؛ ) ) return pmenu; )

سخنی از مترجم:روزی روزگاری، زمانی که کشور و درختان بزرگ بودند، و تخیل من به سادگی بی حد و حصر بود، من رویایی داشتم - توانایی نمایش تصاویر از ریزماشین حساب قابل برنامه ریزی Electronics MK-61 (خوب، انواع نمودارها، منحنی ها وجود دارد. ، تصاویر) روی صفحه تلویزیون. آن زمان وحشی، اواخر شوروی بود، و نه تنها کنسول بازی و میکروکامپیوتر بسیار شخصی ("Pravets 8D" یا "Specialist" یا "Siknkler")، بلکه VCR ها نیز تازگی داشتند. به طور کلی، مردم خواستار تماشا بودند و کسانی که مجموعه نشریات آموزشی و سرگرمی را برای ماشین حساب های قابل برنامه ریزی تحت عنوان کلی "مسیر زمین" (مجله "تکنولوژی - جوانان") به خاطر دارند، مرا درک خواهند کرد.

به طور خلاصه، در قالب یک رمان علمی تخیلی با طرحی خوب، سفر دو آشنای معمولی احمق - یک فضانورد حرفه ای و یک متخصص سایبرنتیک بزرگ از ماه تا زمین - شرح داده شد. چیزی که به کل طرح یک مزیت خاص می بخشید این واقعیت بود که آنها در به اصطلاح سفر می کردند. "Lunolet"، یعنی یک فضاپیمای کوچک با موتور شیمیایی که برای حرکت در شرایط دید مستقیم بر فراز قمرها و سایر اجرام آسمانی طراحی شده است. شبیه توپ بیلیاردبا یک تسکین ساده هر شماره از چرخه حاوی یک توصیف ساده، واقعی، اما کاملاً مبتنی بر ریاضی از هر مانور بود، هم در شرایط گرانش قوی (نسبتا) یک جرم آسمانی در نزدیکی، و هم زمانی که پرتابه آسمانی تحت تأثیر قهرمانان جاذبه زمین قرار گرفت. زمین و ماه و همچنین برنامه ای برای محاسبه مرحله بعدی پرواز. به طور کلی، نگاه کردن به اعداد روی صفحه ماشین حساب کافی نبود، اما من منحنی های زیبا روی صفحه می خواستم (مانند MCC).

از سوی دیگر، فراموش نکنیم که حتی میکروکنترلرهای اولیه خانواده آردوینو از نظر عملکرد نه تنها از ریزپردازنده های پرچمداران آن زمان - MK-52 و MK-61، بلکه از نظر قابلیت های محاسباتی برخی از آنها نیز برتری دارند. کنسول های بازی 8 بیتی زمان های بعد (Atary 2600 و دیگر Rambos Yes Sir).

به طور کلی، مقدمه کمی طولانی بود، بنابراین بیایید به موضوع درس امروز برویم - خروجی یک تصویر ویدیویی از آردوینو به صفحه تلویزیون.

متأسفانه، ویژگی های طراحی آردوینو به شما اجازه می دهد که فقط تصاویر تک رنگ (سیاه و سفید) را تولید کنید، اگرچه این می تواند در برخی از پروژه ها مفید باشد و CSV قطعاً نوب ها را خوشحال می کند.

گام یک. قطعات و نرم افزار

شما نیاز خواهید داشت:

قطعات و واحدها:

  1. میکروکنترلر آردوینو
  2. تلویزیون (بدون آن نمی توانید جایی بروید)
  3. برد توسعه یا شیلد برای آردوینو
  4. 2 مقاومت با مقدار اسمی 470 اهم و 1 کوم
  5. 2 آداپتور نصب نر به نر دو پین
  6. سپر شده کابل تلویزیونبا یک گل لاله در انتها

نرم افزار:

  1. محیط توسعه / سیستم عامل آردوینو. لینک رسمی

مرحله دو. مونتاژ

از طرف نویسنده بابت کیفیت پایین زننده تصویر آداپتور تلویزیون تمام شده پوزش می طلبم. این با این واقعیت توضیح داده می شود که هنگام نوشتن دستورالعمل ها ابتدا باید آنها را بنویسید و سپس با ضبط دقیق عکاسی از تمام مراحل شروع به مونتاژ کنید. در مورد ما، همه چیز دقیقا برعکس شد، بنابراین درک چیزی از تصویر ابری آداپتور تمام شده به سادگی غیرممکن است.

توضیح می دهد که خیلی بهتر است چه چیزی را کجا و چگونه لحیم کاری کنیم مدارعلاوه بر این، تنها از چند بخش تشکیل شده است.


پینوت:

همگام سازی - پین دیجیتال 9 میکروکنترلر

تصویر - خروجی دیجیتال 8 میکروکنترلر

GND - پین GND میکروکنترلر

مرحله سوم. برنامه نويسي

سرگرم کننده ترین قسمت برنامه نویسی است.

اساسا، آن را در حال حاضر خارج است یک نسخه جدیدکتابخانه های تلویزیون، با این حال، حتی از R5.91 که نویسنده از آن استفاده می کند، باگ تر و ناپایدارتر است، بنابراین بهتر است کتابخانه را از لینک بالا دانلود کنید.

برنامه Tex برای افراد تنبلی که برای تایپ مجدد کد از روی صفحه نمایش خیلی تنبل هستند:

#عبارتند از TVout TV; char بدون علامت x, y; تنظیم void () ( TV.start_render(_NTSC); ) void loop () (TV.clear_screen (); TV.print_str (10, 10, "TVout FTW!!!"); TV.delay (60); )

فرض بر این است که شما اصول اولیه عملکرد و برنامه نویسی آردوینو - میکروکنترلرهای مشابه را می دانید، بنابراین نویسنده تصمیم گرفت که از درخت سرگردان نشود و توصیه می کند که با دستورات کتابخانه زیر آشنا شوید:

  • start (حالت) شروع به نمایش اطلاعات روی صفحه می کند. وضوح استاندارد - 128x96
  • start (حالت، x، y) شروع به نمایش اطلاعات روی صفحه می کند. وضوح توسط کاربر با استفاده از آرگومان های x,y تعیین می شود
  • end() بافر ویدئو را پاک کنید
  • force_vscale(sfactor) تعداد دفعات نمایش هر خط را مجبور کنید.
  • force_outstart(time) زمان را برای شروع خروجی در یک خط فعال مجبور کنید.
  • force_linestart(line) خط را مجبور به شروع خروجی کنید.
  • set_vbi_hook(func) تابع را تنظیم کنید تا یک بار در هر دوره خالی عمودی فراخوانی شود.
  • set_hbi_hook(func) تابع را تنظیم کنید تا یک بار در هر دوره خالی افقی فراخوانی شود.
  • hres() دستور مقدار وضوح افقی را برمی گرداند،
  • vres() دستور مقدار وضوح عمودی را برمی گرداند،
  • char_line() دستور تعداد کاراکترهایی را که در یک خط قرار می گیرند برمی گرداند.
  • set_pixel(x,y,color) رنگ پیکسل را در مختصات مشخص شده تنظیم کنید
  • get_pixel(x,y) پیکسل را با مختصات داده شده به عنوان نقطه مرجع تنظیم می کند.
  • fill(color) صفحه را با رنگ مشخص شده پر می کند.
  • () clear_screen صفحه را پاک می کند.
  • invert() تصویر روی صفحه را معکوس می کند.
  • shift (فاصله، جهت) صفحه را با فاصله مشخص در هر یک از 6 جهت پیمایش می کند.
  • draw_line(x0,y0,x1,y1,color) یک خط از مختصات (x0,y0) تا مختصات (x1,y1) ایجاد کنید.
  • draw_row(row,x0,x1,color) سطر را با مختصات x0 تا x1 با رنگ داده شده پر می کند.
  • draw_column(column,y0,y1,color) ستون را با مختصات y0 تا y1 با رنگ مشخص شده پر می کند.
  • draw_rect(x,y,w,h,color,fillcolor) یک مستطیل با مبدا در مختصات (x,y) با ابعاد (h,w) رسم می کند و با رنگ مشخص شده پر می کند.
  • draw_rect(x,y,w,h,color) یک مستطیل با مبدا در مختصات (x,y) و ابعاد (h,w) رسم می کند.
  • draw_circle(x,y,radius,color,fillcolor) دایره ای را در مرکز مختصات (x,y) با شعاع (RADIUS) رسم می کند و آن را با یک رنگ مشخص پر می کند.
  • draw_circle(x,y,radius,color) دایره ای را در مرکز مختصات (x,y) با شعاع (RADIUS) رسم می کند.
  • bitmap(x,y,bmp,i,width,height) تصویر مشخص شده را در مختصات نمایش می دهد.
  • print_char(x,y,c) یک کاراکتر را در مختصات (x,y) چاپ می کند.
  • set_cursor(x,y) موقعیت نمایش کاراکتر بعدی را تعیین می کند.
  • select_font(font) فونت را برای خروجی متن تنظیم می کند.
  • print() متن را چاپ کنید.
  • println() یک خط را چاپ می کند.
  • printPGM() یک خط متن را از حافظه برنامه چاپ می کند.
  • تن (فرکانس) آهنگی با فرکانس مشخص.
  • تن (فرکانس، مدت زمان) سیگنال تن فرکانس و مدت زمان مشخص شده.
  • noTone() خروجی تون را متوقف می کند.

مرحله چهارم تکمیل

نحوه استفاده برد آردوینوبرای نمایش هر گونه اطلاعات در تلویزیون؟ به نظر می رسد چنین کتابخانه TVOut (مقاله در وب سایت) وجود دارد که به شما امکان می دهد اطلاعات را از طریق یک کابل فرکانس پایین (لاله) نمایش دهید. درست است، تصویر سیاه و سفید خواهد بود، اما این برای اکثر پروژه ها کافی خواهد بود.

اینجا کنسول بازیجایی که از این کتابخانه استفاده می شود

وب سایت پروژه http://nootropicdesign.com/hackvision/index.html
قیمت تخته 43.95 دلار است.

بیایید ستاپ باکس تلویزیون خودمان را بسازیم که از یک برد آردوینو و یک جوی استیک x-y تشکیل شده است و یک بازی ساده بنویسیم.
در اینجا نمایی از کنسول ما است

بیایید با قابلیت های کتابخانه آشنا شویم و بازی بنویسیم.
صفحه کتابخانه - http://code.google.com/p/arduino-tvout
در اینجا می توانید کتابخانه را دانلود کنید و شرح عملکردها را مشاهده کنید.
این کتابخانه از پین های آردوینو زیر استفاده می کند

سینک برد صوتی تصویری Decimilia, Uno, Nano 9 7 11 Mega 11 A7(D29) 10

بیایید به عملکردهای اصلی کتابخانه نگاه کنیم.

توابع تنظیم حالت

تابع begin() خروجی ویدیو را مقداردهی اولیه می کند (رزولوشن پیش فرض صفحه نمایش 128x96)
نحو:

  • TVOut.begin(حالت);
  • TVOut.begin(حالت، x، y);

گزینه ها:

  • حالت - استاندارد سیگنال ویدیویی:
  • _PAL – حالت PAL.
  • _NTSC – حالت NTSC.

ارزش برگشتی:

  • 0 – در صورت اتصال موفق، 4 – در صورت خرابی (حافظه کافی برای بافر خروجی نیست).

توابع تاخیر

تابع delay() تصویر خروجی را به تاخیر می اندازد.
نحو:

  • TVOut.delay(ms);

گزینه ها:

  • ms – تاخیر بر حسب میلی ثانیه با دقت: 20 میلی ثانیه برای PAL و 16 میلی ثانیه برای NTSC.

تابع ()delay_frame تصویر نمایش داده شده را به تاخیر می اندازد.
نحو:

  • TVOut.delay_frame(frame);

گزینه ها:

  • فریم - تعداد فریم برای تاخیر..

این ویژگی برای به حداقل رساندن یا از بین بردن سوسو زدن صفحه ناشی از تازه سازی صفحه مفید است.

توابع برای گرفتن پارامترها

تابع hres () وضوح صفحه نمایش افقی را برمی گرداند.
نحو:

  • TVOut.hrs();

گزینه ها:

ارزش برگشتی:

  • کاراکتر بدون علامت – وضوح صفحه نمایش افقی.

تابع vres () وضوح عمودی صفحه را برمی‌گرداند.
نحو:

  • TVOut.vres();

گزینه ها:

ارزش برگشتی:

  • کاراکتر بدون علامت – وضوح صفحه نمایش عمودی.

تابع char_line () حداکثر تعداد ممکن از کاراکترها را در یک خط هنگام خروجی برمی گرداند اطلاعات متنی.
نحو:

  • خروجی تلویزیون. char_line();

گزینه ها:

ارزش برگشتی:

  • کاراکتر بدون علامت - تعداد کاراکترها.

توابع اصلی گرافیکی

تابع set_pixel() رنگ یک پیکسل صفحه نمایش را در نقطه ای با مختصات داده شده تنظیم می کند.
نحو:

  • TVOut.set_pixel (x,y,color);

گزینه ها:

  • x,y – مختصات پیکسل.
  • رنگ – رنگ پیکسل:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس

تابع get_pixel() رنگ پیکسل صفحه را از نقطه ای با مختصات داده شده دریافت می کند.
نحو:

  • TVOut.get_pixel(x,y);

گزینه ها:

  • x,y – مختصات پیکسل.

ارزش برگشتی:

  • رنگ – رنگ پیکسل:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس

تابع fill() صفحه را با رنگ مشخص شده پر می کند.
نحو:

  • TVOut.fill(color);

گزینه ها:

  • رنگ - رنگ پر:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس

تابع ()clear_screen صفحه را با پر کردن آن با رنگ مشخص شده پاک می کند.
نحو:

  • TVOut.clear_screen(color);

گزینه ها:

  • رنگ - رنگ پر:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس

تابع invert() محتویات صفحه را معکوس می کند.
نحو:

  • TVOut.invert();

گزینه ها:

تابع ()shift_direction محتویات صفحه را جابجا می کند.
نحو:

  • TVOut.shift_direction(فاصله، جهت);

گزینه ها:

  • فاصله – فاصله برای جابجایی محتوای صفحه.
  • جهت – تغییر جهت:
  • UP=0 – بالا؛
  • DOWN=1 – پایین;
  • LEFT=2 – چپ;
  • RIGHT=3 – به سمت راست.

تابع draw_line() دو نقطه روی صفحه را با یک خط به هم متصل می کند.
نحو:

  • TVOut.draw_line(x0,y0,x1,y1,color);

گزینه ها:

  • x0,y0 - مختصات نقطه اول.
  • x1,y1 - مختصات نقطه دوم.
  • رنگ - رنگ پر:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس

تابع draw_row() یک ردیف را با رنگ مشخص شده بین دو نقطه روی سطر پر می کند.
نحو:

  • TVOut.draw_row (ردیف، x0، x1، رنگ)؛

گزینه ها:

  • ردیف - مختصات عمودی ردیف؛
  • x1،x2 - مختصات افقی نقاط خط.
  • رنگ - رنگ پر:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس

تابع draw_column() یک ردیف را با رنگ مشخص شده بین دو نقطه در یک ستون پر می کند.
نحو:

  • TVOut.draw_column(column,y0,y1,color);

گزینه ها:

  • ستون - مختصات افقی ستون؛
  • y1,y2 - مختصات عمودی نقاط ستون.
  • رنگ - رنگ پر:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس

تابع draw_rect() یک مستطیل روی صفحه می کشد.
نحو:

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

گزینه ها:

  • x,y - مختصات نقطه بالا سمت چپ.
  • w,h – عرض و ارتفاع مستطیل ترسیم شده.
  • رنگ - رنگ حاشیه های مستطیل:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس
  • fillcolor – رنگ پر مستطیلی:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس

تابع draw_circle() دایره ای را روی صفحه می کشد.
نحو:

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

گزینه ها:

  • x,y - مختصات مرکز دایره؛
  • r - شعاع دایره؛
  • رنگ - رنگ حاشیه دایره:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس
  • fillcolor – رنگ پر کردن دایره:
  • 0 - سیاه؛
  • 1 - سفید؛
  • 2- رنگ معکوس

تابع bitmap() یک تصویر bitmap را روی صفحه نمایش می دهد.
نحو:

  • TVOut.bitmap (x,y,bmp,w,h);

گزینه ها:

  • x,y - مختصات گوشه سمت چپ بالای نقطه خروجی.
  • bmp - اشاره گر به آرایه حافظه که در آن تصویر ذخیره می شود.
  • w,h – عرض، ارتفاع تصویر نمایش داده شده؛

در زیر به روند ایجاد کد برای تصاویر شطرنجی خروجی خواهیم پرداخت.

توابع خروجی اطلاعات متنی

برای استفاده از توابع خروجی اطلاعات متنی، باید فایل‌هایی را با فونت‌های موجود در کتابخانه یا سفارشی متصل کنید. برای اتصال یک مجموعه سفارشی از فونت ها، باید فایل هدر را در طرح قرار دهید:
#عبارتند از
این کتابخانه شامل مجموعه فونت های زیر است:

  • font4x6;
  • font6x8;
  • font8x8;
  • font8x8ext.

تابع select_font() فونتی را برای نمایش اطلاعات متنی انتخاب می کند.
نحو:

  • TVOut.select_font(font);

گزینه ها:

  • فونت - فونت موجود در طرح.

تابع print_char() یک کاراکتر را روی صفحه چاپ می کند.
نحو:

  • TVOut.print_char(x,y,char);

گزینه ها:

  • x,y – موقعیت روی صفحه برای نمایش نماد.
  • char - یک کاراکتر از فونت فعلی.

تابع set_cursor() موقعیت مکان نما را برای نمایش اطلاعات متنی روی صفحه تنظیم می کند.
نحو:

  • TVOut.set_cursor(x,y);

گزینه ها:

  • x,y - مختصات مکان نما.

تابع print() یک رشته، کاراکتر یا عدد را روی صفحه چاپ می کند.
نحو:

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

گزینه ها:

  • x,y – مختصات مکان نما.
  • پایه – فرمت خروجی:
  • BYTE = 0;
  • DEC = 10 (پیش فرض)؛
  • HEX = 16.

تابع println() یک رشته، کاراکتر یا عدد و به دنبال آن یک خط جدید چاپ می کند:
نحو:

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

گزینه ها:

  • x,y – مختصات مکان نما.
  • پایه – فرمت خروجی:
  • BYTE = 0;
  • DEC = 10 (پیش فرض)؛
  • HEX = 16.

ویژگی های خروجی صدا

عملکردهای خروجی صدا به شما این امکان را می دهد که سیگنال فرکانس خاصی را از طریق خروجی صدا به تلویزیون خود ارسال کنید.
تابع tone() یک سیگنال صوتی با فرکانس خاص تولید می کند.
نحو:

  • TVOut.tone (فرکانس، مدت زمان)؛
  • TVOut.tone (فرکانس).

گزینه ها:

  • فرکانس - فرکانس سیگنال صوتی؛
  • مدت زمان - مدت زمان سیگنال.

تابع noTone() تولید صدا را متوقف می کند.
نحو:

  • TVOut.noTone().

ایجاد فونت های خود

بیایید به روند ایجاد فونت های سفارشی برای کتابخانه TVOut نگاه کنیم.

کتابخانه به شما امکان می دهد فونت های خود را ایجاد کنید.
دو نوع فونت وجود دارد - عرض ثابت و متغیر. برای فونت های با عرض ثابت، سه بایت اول آرایه شامل عرض کاراکتر (4)، ارتفاع کاراکتر (6) و اولین کاراکتر قابل چاپ (32) است. سپس داده های هر کاراکتر بعدی می آید.

#include "myfont1.h" PROGMEM دارای کاراکتر بدون علامت myfont1 = ( 4,6,32, // 0b00000000, 0b00000000, 0b00000000, 0b000000000, 0b000000000, 0b00000000, 0b00000000, 0b000/00000 00، 0b 01000000، 0b01000000، 0b00000000، 0b01000000، 0b00000000، … …)؛

برای فونت های با عرض متغیر، اولین بایت در توضیحات هر کاراکتر، عرض آن کاراکتر را مشخص می کند.

#include "myfont1.h" PROGMEM دارای کاراکتر بدون علامت myfont1 = ( 4,6,32, // 2, 0b00000000, 0b00000000, 0b00000000, 0b000000000, 0b000000000, 0b000000000, 0b000000000, 0b000000000, 0b000000000, 0b00000000 010000 00، 0b01000000، 0b01000000، 0b00000000، 0b01000000 , 0b00000000, …… );

بیایید یک فونت سفارشی myfont1 ایجاد کنیم. برای فونت سفارشی myfont1، 2 فایل در پوشه TVOutfonts ایجاد کنید: myfont1.h و myfont1.cpp.
در اینجا محتویات فایل myfont1.h آمده است

#ifndef MYFONT1_h #define MYFONT1_h #include extern const unsigned char myfont1; #endif

اکنون برای اینکه کتابخانه TVOut از فونت سفارشی ما myfont1 در طرح استفاده کند، باید فایل را اضافه کنید.

#include "myfont1.h"

ایجاد گرافیک های اولیه

کتابخانه TVOut به شما امکان می دهد تصاویر بیت مپ را روی صفحه بارگذاری کنید. بیایید ایجاد کد دانلود را در نظر بگیریم بیت مپتابع bitmap () کتابخانه TVOut.

ابتدا باید یک تصویر 1 بیتی (دو رنگ) ایجاد کنید، به عنوان مثال در ویرایشگر گرافیکی Paint. .

سپس به برنامه Image2Code نیاز داریم که کد را از تصویر ما تبدیل می کند. برنامه را می توان در دانلود کرد. این نسخه اتاق عمل است سیستم های ویندوز. دانلود و راه اندازی کنید.

روی دکمه Convert کلیک کنید و یک آرایه دریافت کنید.

# شامل # ifndef MYBITMAP1_H # define MYBITMAP1_H extern const unsigned char MyBitmap1; #endif

در مرحله بعد، فایل MyBitmap1.cpp را ایجاد کنید، داده های تبدیل را در آن کپی کنید (در قسمت داده آرایه char بدون علامت MyBitmap1)، نمادهای "(" و ") را حذف کنید، و عرض و ارتفاع تصویر را بر حسب پیکسل درج کنید. در آغاز.

#include "MyBitmap1.h" PROGMEM دارای کاراکتر بدون علامت MyBitmap1 = ( 16,16, 0x73,0x8E, 0x8C,0x71, 0x00,0x00, 0x00,0x00, 0x00,0x9,5x5,0x0, 0x00,0x9,5,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,6,0,0,4,0,0,0,0,0x0 ,0x5 5 , 0xD4,0x67, 0x94,0x45, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0xAA,0xAA, 0x55,0x55, 0x00,0x00 )؛

ما فایل های MyBitmap1.h و myBitmap.cpp را در دایرکتوری طرح خود ذخیره می کنیم. برای نمایش تصویر خود بر روی صفحه تلویزیون، تابع TVOut.bitmap() را فراخوانی کنید:

#include "MyBitmap1.h" TVOut.bitmap(x,y,MyBitmap)؛

ما با کتابخانه آشنا شده ایم، کنسول بازی مونتاژ شده است - اکنون می توانیم شروع به نوشتن بازی کنیم.