0917-062-0010

مشاوره رایگان

9 صبح تا 9 شب

شنبه تا پنجشنبه

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

فهرست مطالب این نوشته
پیش درآمد برنامه نویسی بازی اندروید

برنامه نویسی اندروید یا برنامه نویسی بازی اندروید کدامیک بهتر است؟

برنامه نویسی بازی اندروید

برنامه نویسی اندروید

برنامه نویسی بازی اندروید را از کجا شروع کنیم؟

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

تعیین مشخصات اصلی بازی دومین گام در برنامه نویسی بازی اندروید

انتخاب ابزار مناسب برای توسعه سومین گام در مسیر یادگیری برنامه نویسی بازی اندروید

اندروید استودیو

موتور بازی سازی یونیتی و Unreal

یونیتی یا Unreal کدامیک برای ساخت بازی بهتر است؟

استفاده از بازی سازها

شروع ساخت پروژه گام چهارم در برنامه نویسی بازی اندروید

آموزش برنامه نویسی بازی اندروید در اندروید استودیو

ساخت پروژه اولین گام در آموزش برنامه نویسی بازی اندروید

آماده سازی تصاویر و صداها دومین گام در آموزش برنامه نویسی بازی اندروید

تنظیم تمام صفحه بازی گام سوم در آموزش برنامه نویسی بازی اندروید

ادامه آموزش برنامه نویسی بازی اندروید با نمایش شخصیت های بازی

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

استفاده از شخصیت‌های متعدد ششمین گام در آموزش برنامه نویسی بازی اندروید

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

افزودن جلوه های صوتی به بازی آخرین گام در آموزش برنامه نویسی بازی اندروید

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

بهترین زبان برنامه نویسی بازی اندروید چیست؟

روش های کسب درآمد از بازی سازی چیست؟

آیا امکان ساخت بازی اندروید بدون کدنویسی وجود دارد؟

آیا برنامه نویسی بازی اندروید حوزه پردرآمدی است؟

آیا در برنامه نویسی بازی اندروید به محاسبات ریاضی نیاز است؟

جمع‌بندی

faradars mobile

پیش درآمد برنامه نویسی بازی اندروید

بازی‌های اندرویدی در سال‌های اخیر رشد بسیار چشم‌گیری داشته‌اند و به یکی از محبوب‌ترین راه‌ها برای گذراندن اوقات فراغت تبدیل شده‌اند. شرکت‌های ارائه‌دهنده گوشی‌های موبایل نیز با تمرکز بر روی ارتقا سخت‌افزاری دستگاه‌های خود و ارائه دستگاه‌های قدرتمندتر، تجربه بهتری را برای کاربران رقم زده‌اند. در نتیجه، امروزه گیمر‌ها به عناوین مختلف از ژانرهای متنوع دسترسی دارند.

آموزش برنامه نویسی اندروید Android – مقدماتی
فیلم آموزش برنامه نویسی اندروید Android – مقدماتی در تم آف

کلیک کنید

با توجه به بازار گسترده بازی‌های موبایلی و وجود فرصت‌های مختلف درآمدزایی در این حوزه، بسیاری از افراد یادگیری برنامه نویسی بازی اندروید را به عنوان هدف خود تعیین کرده‌اند. در این بین حتی برنامه‌نویسان اندرویدی که در زمینه توسعه اپلیکیشن موبایل فعالیت می‌کردند، نیز در صدد تغییر گرایش خود به ست برنامه نویسی بازی اندروید هستند. در حال حاضر توسعه‌دهندگان بازی‌های اندرویدی به دنبال ایجاد تجربه‌های نوآورانه‌ای هستند که موجب گسترش مرز‌های موجود در این صنعت شده است.

پیش درآمد برنامه نویسی بازی اندروید

امروزه با توجه به وجود منابع مختلف برای آموزش برنامه نویسی بازی اندروید ، ساخت بازی نسبت به گذشته بسیار آسان‌تر شده است. به عنوان مثال، اگر فردی قصد توسعه بازی ساده‌ و محبوبی همچون Super Mario را داشته باشد، اکنون در مقایسه با ۲۰ سال قبل کار واقعاً راحت‌تری خواهد داشت. در زمینه کسب درآمد از بازی‌های موبایلی نیز با توجه به وجود بستر‌های مختلف برای درآمدزایی، کار بسیار آسان‌تر از گذشته است. تنها چالشی که امروزه در زمینه بازی سازی وجود دارد، بحث جذب مخاطب و رقابت با سایر عناوین در این حوزه است، زیرا با وجود عناوین با کیفیت و جذاب و همچنین حضور شرکت‌های معتبر در این حوزه، رقابت بسیار سختی برای جذب مخاطبین شکل گرفته است.

برنامه نویسی اندروید یا برنامه نویسی بازی اندروید کدامیک بهتر است؟

انتخاب بین برنامه نویسی اندروید و برنامه نویسی بازی اندروید ارتباط مستقیمی با مهارت و علاقه فرد دارد. در ادامه، بررسی مختصری در خصوص این دو حوزه ارائه شده است.

آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری در تم آف

کلیک کنید

برنامه نویسی بازی اندروید

سیستم عامل اندروید پلتفرمی فوق‌العاده برای شروع ساخت بازی است و چالش‌های منحصر به فردی نیز در این حوزه در انتظار برنامه‌نویسان است. یکی از چالش‌های موجود در برنامه نویسی بازی اندروید بحث مقیاس‌بندی «رابط کاربری» (User Interface | UI) بازی‌ها است و باید بسته به اندازه و وضوح دستگاه اندرویدی، راه‌حل هوشمندانه‌ای برای این موضوع پیدا کرد. با این حال، چالش‌های زیاد دیگری نیز در حین توسعه بازی اندروید در انتظار برنامه‌نویسان است.

آموزش پروژه محور اندروید استودیو – ساخت بازی Snake
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی Snake در تم آف

کلیک کنید

به طور کلی، اگر از دیدگاه شغلی به برنامه نویسی بازی اندروید نگاه شود، باید گفت نسبت به برنامه نویسی اندروید حرفه چالشی‌تری است و می‌توان از تخیل و مهارت‌ بیشتری نیز در آن استفاده کرد. اساساً در بحث توسعه بازی اندرویدی نیاز به ایجاد سیستمی با «تجربه کاربری» (User Experience | UX) و رابط گرافیکی بهتری وجود دارد و در بحث «پایگاه داده» (Database) نیز باید امکان ارتباط پایدار با سرور وجود داشته باشد. علاوه بر این، از نکات قابل توجه در بحث برنامه نویسی بازی اندروید این است که باید همزمان از چندین زبان برنامه نویسی استفاده کرد. در ادامه، تعدادی از انواع زبان‌های برنامه نویسی مورد استفاده در توسعه بازی اندروید ارائه شده‌اند.

آموزش پروژه محور اندروید استودیو – ساخت بازی حدس کلمه
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حدس کلمه

کلیک کنید

  • زبان اسمبلی
  • زبان‌های C، جاوا و ++C
  • سی شارپ
  • ویژوال بیسیک
  • Lua
  • پایتون و جاوا اسکریپت
  • پاسکال
  • Smalltalk
  • Perl
  • Lisp

علی‌رغم وجود چالش‌های بسیار در زمینه برنامه نویسی بازی اندروید و نیاز به داشتن مهارت‌های مختلف، باید به این نکته نیز اشاره کرد که میانگین پرداختی برای توسعه‌دهنده بازی اندرویدی تقریباً دو برابر برنامه‌نویس اندروید است.

برنامه نویسی بازی اندروید

برنامه نویسی اندروید

در زمینه برنامه نویسی اندروید در مقایسه با توسعه بازی اندرویدی، چالش‌های کمتری در انتظار برنامه نویس است. شاید توسعه اپلیکیشن اندروید به اندازه ساخت بازی اندرویدی جذاب و سرگرم کننده نباشد، اما فرصت‌های شغلی زیادی در این حوزه وجود دارد و با داشتن چند نمونه کار قابل قبول می‌توان در شرکت‌های مرتبط استخدام شد.

آموزش برنامه نویسی اندروید Android – تکمیلی
فیلم آموزش برنامه نویسی اندروید Android – تکمیلی در تم آف

کلیک کنید

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

برنامه نویسی اندروید

برنامه نویسی بازی اندروید را از کجا شروع کنیم؟

همان طور که پیش‌تر نیز بیان شد، توسعه بازی اندروید به عنوان حرفه‌ای تمام وقت شناخته می‌شود. با این وجود، با توجه به فرصت‌های گوناگون موجود در این حوزه بسیاری از افراد تصمیم به ساخت و برنامه نویسی بازی اندروید می‌گیرند. در حال حاضر، فروشگاه‌های اندرویدی نظیر «گوگل پِلی» (Google Play)، مملو از بازی‌های گوناگون هستند. بر اساس آمار سال ۲۰۲۲ میلادی (۱۴۰۱ شمسی)، تقریباً ۴۷۸ هزار بازی اندرویدی در فروشگاه گوگل پلی در دسترس کاربران بوده است. بنابراین، با در نظر گرفتن این آمار می‌توان متوجه سختی کار جذب مخاطب در این حوزه شد.

آموزش پروژه محور اندروید استودیو – ساخت بازی Snake
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی Snake در تم آف

کلیک کنید

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

بهترین بازی های اندرویدی

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

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

آموزش برنامه نویسی اندروید Android – پیشرفته
فیلم آموزش برنامه نویسی اندروید Android – پیشرفته در تم آف

کلیک کنید

در ابتدای فرایند ساخت بازی اندرویدی مهم‌ترین مورد، داشتن چشم‌اندازی روشن در خصوص چیزی است که قصد ایجاد آن را دارید. داشتن چشم‌انداز روشن در خصوص ساخت بازی از این جهت اهمیت دارد که انتخاب ابزارها و گردش کار مناسب ارتباط مستقیمی با نوع بازی دارد. در این خصوص، تفاوتی بین ساخت بازی پازل ساده، بازی دو بعدی و حتی یک بازی با استفاده از «واقعیت مجازی» (Virtual Reality) وجود ندارد و برای هر کدام از این موارد باید چشم‌انداز و برنامه ساخت بازی مشخص و روشن باشد.

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

در شروع کار برنامه نویسی بازی اندروید برای افزایش شانس موفقیت، بهترین گزینه انتخاب عنوانی ساده برای ساخت بازی است. اکثر توسعه‌دهندگان بازی که به صورت مستقل فعالیت می‌کنند، با انتخاب عنوانی ساده برای بازی سعی در کاهش هزینه‌های ساخت دارند. به عنوان مثال، بازی‌ پازل یا بازی‌هایی که کاربر را وارد یک حلقه بی‌نهایت بازی می‌کنند، این مفهوم را بهتر نشان می‌دهند. در ابتدا می‌توان با یک بازی ساده به عنوان راهی برای یادگیری برنامه نویسی بازی اندروید شروع کرد و سپس، بعد از کسب تجربه، به فکر تشکیل تیم برنامه نویسی و ایجاد بازی‌ها و پروژه‌های پیچیده‌تر بود.

تعیین مشخصات اصلی بازی دومین گام در برنامه نویسی بازی اندروید

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

آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری

کلیک کنید

  • ژانر و دسته‌بندی بازی چیست؟
  • مخاطب هدف بازی در چه رده سنی قرار دارد؟
  • سبک گرافیکی بازی به چه شکلی خواهد بود؟
  • تصاویر و جلوه‌های صوتی بازی به چه صورتی انتخاب شوند؟
  • از چه ابزاری برای ساخت جلوه‌های گرافیکی بازی استفاده خواهد شد؟
  • از چه روشی برای درآمدزایی بازی استفاده شود؟
  • نقاط عطف و چالش‌های بازی به چه صورتی طراحی شوند؟

یکی از بهترین روش‌ها برای بدست آوردن دیدی روشن در خصوص بازی و نکات پیرامون آن، بررسی سایر بازی‌های موجود در فروشگاه‌های اندرویدی است. در هر بازه زمانی بازی‌‌هایی با ایده‌های خلاقانه توانسته‌اند توجه کاربران زیادی را به سمت خود جلب کنند. در نتیجه، می‌توان با گشت و گذار در فروشگاه‌های اندرویدی از این سبک بازی‌ها و ایده‌هایشان برای ساخت بازی الهام گرفت.

انتخاب ابزار مناسب برای توسعه سومین گام در مسیر یادگیری برنامه نویسی بازی اندروید

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

آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری در تم آف

کلیک کنید

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

انتخاب ابزار مناسب برای توسعه سومین گام در برنامه نویسی بازی اندروید

اندروید استودیو

انتخاب «اندروید استودیو» (Android Studio) برای برنامه نویسی بازی اندروید در واقع گام برداشتن در مسیر سنتی ساخت بازی اندروید است.

آموزش پروژه محور اندروید استودیو – ساخت بازی Snake
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی Snake در تم آف

کلیک کنید

IDE یا همان محیط توسعه اندروید استودیو، توسط گوگل به عنوان محیط رسمی برنامه نویسی اندروید معرفی شده است. برای برنامه نویسی بازی اندروید به کمک محیط توسعه اندروید استودیو، باید یکی از دو زبان رسمی اندروید یعنی «جاوا» (Java) یا «کاتلین» (Kotlin) را فرا گرفت. علاوه بر این، برای راه‌اندازی اندروید استودیو باید ابزار‌هایی همچون «کیت توسعه جاوا» (Java Development Kit | JDK) و «بسته توسعه نرم‌افزاری اندروید» (Android SDK) را دانلود کرد و کمی نیز با زبان XML آشنایی داشت.

برنامه نویسی بازی اندروید با اندروید استودیو

در واقع SDK شامل مجموعه‌ای از کتابخانه‌ها و ابزارهای گوگل می‌شود که به جاوا اجازه برقراری ارتباط با سیستم عامل اندروید را می‌دهد. علاوه بر این، به اندروید استودیو کمک می‌کند تا کد نوشته شده را به فایل APK تبدیل کند. در مجموع می‌توان گفت اندروید استودیو تمام موارد لازم برای توسعه بازی اندروید را در اختیار توسعه‌دهنده قرار می‌دهد و برای همین از آن به عنوان «محیط یکپارچه توسعه» (Integrated Development Environment | IDE) یاد می‌شود.

اندروید استودیو برای ساخت بازی‌های ساده دو بعدی نظیر بازی پازل ساده گزینه مناسبی است. به لحاظ نظری، امکان ساخت بازی‌های سه بعدی با اندروید استودیو وجود دارد و برای این مورد باید از کتابخانه‌های گرافیکی OpenGL و Vulkan API استفاده کرد. برای ساخت بازی‌های پیچیده، استفاده از اندروید استودیو توصیه نمی‌شود و گزینه‌های بسیار بهتری برای این مورد وجود دارد.

مطلب پیشنهادی:

اندروید استودیو چیست ؟ – از صفر تا صد Android Studio

شروع مطالعه

 

موتور بازی سازی یونیتی و Unreal

توسعه‌دهندگان حرفه‌ای در زمینه برنامه نویسی بازی اندروید به دلایلی که در بالا اشاره شد، یکی از دو موتور بازی‌سازی «یونیتی» (Unity) یا «آنریل انجین» (Unreal Engine) را برای توسعه بازی انتخاب می‌کنند.

آموزش پروژه محور یونیتی – ساخت بازی نابودگر فضایی در Unity‎
فیلم آموزش پروژه محور یونیتی – ساخت بازی نابودگر فضایی در Unity‎ در تم آف

کلیک کنید

این ابزارها محیط یکپارچه توسعه را با موتور بازی‌سازی ترکیب می‌کنند. به عبارت دیگر، این موتور‌های بازی‌سازی رابطی را برای مدیریت کدها فراهم می‌کنند و همچنین، بسیاری از جنبه‌های فیزیکی و رفتار‌های آماده قابل استفاده در بازی را ارائه می‌دهند. به عنوان مثال، در محیط‌های یونیتی و Unreal Engine، مثلاً برای مشخص کردن چگونگی سقوط چیزی از هوا نیازی به کدنویسی نیست و تنها با علامت زدن کادری با عنوان «گرانش» (Gravity) می‌توان این مورد را مدیریت کرد.

موتور بازی سازی یونیتی و انریل

یونیتی یا Unreal کدامیک برای ساخت بازی بهتر است؟

برای اکثر پروژه‌های بازی‌سازی می‌توان از یونیتی استفاده کرد. علاوه بر این، افزودن ویژگی‌های گرافیکی به این ابزارها تنها با «کشیدن و رها کردن» (Drag & Drop) آن‌ها در محیط برنامه امکان‌پذیر است. این ابزارها کار را برای ساخت بازی بسیار آسان می‌کنند. به عنوان مثال، می‌توان یک بازی اندرویدی ساده را در زمانی بسیار کوتاه (حتی ۷ دقیقه) ساخت.

آموزش ساخت بازی سه بعدی تیراندازی اول شخص در Unreal Engine
فیلم آموزش ساخت بازی سه بعدی تیراندازی اول شخص در Unreal Engine در تم آف

کلیک کنید

البته در هر حال برای کار کردن با هر کدام از این دو محیط بازی‌سازی، نیاز به کدنویسی مختصری وجود دارد. یونیتی از زبان برنامه نویسی سی شارپ استفاده می‌کند که بسیار شبیه جاوا است. از سوی دیگر، Unreal نیز از زبان ++C برای بخش اسکریپت خود استفاده می‌کند. برای کار با این ابزارها، همچنان نیاز به استفاده از Android SDK وجود دارد. در ادامه، بارزترین ویژگی‌های این دو ابزار برنامه نویسی بازی اندروید ارائه شده است.

  • هر دو ابزار کاملاً رایگان هستند.
  • محدودیتی در ساخت بازی با آن‌ها وجود ندارد.
  • توسط توسعه‌دهندگان حرفه‌ای استفاده می‌شوند.
  • «چند پلتفرمی» (Cross-Platform) هستند و می‌توان خروجی را به سایر پلتفرم‌ها انتقال داد.

البته این دو موتور بازی‌سازی قدرتمند در برخی زمینه‌ها با یکدیگر تفاوت‌هایی نیز دارند. در مجموع، استفاده از یونیتی کمی ساده‌تر است و برای ساخت بازی‌های موبایلی و دو بعدی گزینه مناسب‌تری به حساب می‌آید. از Unreal نیز با توجه به برتری آن در بحث گرافیک سه بعدی می‌توان برای توسعه بازی‌های بزرگ‌تر و پیچیده‌تر استفاده کرد.

ساخت بازی با انریل

استفاده از بازی سازها

یکی از آسان‌ترین روش‌ها برای ساخت بازی اندرویدی استفاده از نرم‌افزار‌های «بازی‌ساز» (Game Builder) است. استفاده از این ابزارها در واقع مفهوم برنامه نویسی بازی اندروید را کم رنگ می‌کند، زیرا دیگر نیازی به کد نویسی زیاد برای ساخت بازی نیست. بیشتر این نرم‌افزارهای بازی‌سازی از قابلیت «کشیدن و رها کردن» (Drag & Drop) استفاده و فرایند ساخت بازی را بسیار آسان می‌کنند.

آموزش ساخت بازی سه بعدی تیراندازی اول شخص در Unreal Engine
فیلم آموزش ساخت بازی سه بعدی تیراندازی اول شخص در Unreal Engine در تم آف

کلیک کنید

نرم‌افزار GameMaker Studio یکی از ابزارهای بازی‌سازی محسوب می‌شود که توسط شرکت Yoyo Games معرفی شده است. کار با این ابزار بسیار ساده‌تر از یونیتی و انریل است و حتی در صورت آشنایی با اصول برنامه نویسی نیز می‌توان با زبان مخصوص آن، تحت عنوان GML اسکریپت‌های اولیه را نوشت. زبان برنامه نویسی GML در واقع ترکیبی از زبان‌های C++‎، جاوا و C است و قابلیت برنامه نویسی شی‌گرا را نیز دارد. در حالی که برخی از بازی‌های موفق به کمک GameMaker توسعه داده شده‌اند، اما این ابزار در برخی از عملکردها برنامه‌نویس را با محدودیت‌هایی روبرو می‌کند. تمرکز نرم‌افزار GameMaker بر استفاده از الگوها و گرافیک‌های از پیش‌تعریف شده است.

استفاده از بازی سازها در برنامه نویسی بازی اندروید

شروع ساخت پروژه گام چهارم در برنامه نویسی بازی اندروید

بعد از آشنایی کامل با مجموعه ابزار‌های مورد استفاده برای برنامه نویسی بازی اندروید باید پروژه جدید را آغاز کرد. در این مرحله نگاه کردن به صفحه خالی ممکن است کمی دلهره‌آور باشد، اما با ساده در نظر گرفتن هر بخش و شروع فرایند ساخت بازی می‌توان پیشرفت گام به گام پروژه را مشاهده کرد.

آموزش پروژه محور یونیتی – طراحی و ساخت بازی دوز پیشرفته
فیلم آموزش پروژه محور یونیتی – طراحی و ساخت بازی دوز پیشرفته در تم آف

کلیک کنید

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

این مرحله در عین جذاب بودن می‌تواند بسیار زمان‌بر و چالش‌برانگیز هم باشد. برای افزایش سرعت توسعه می‌توان در این بخش از افرادی استفاده کرد که در حوزه‌های طراحی و گرافیک فعالیت می‌کنند. در نهایت ایجاد رابط کاربری برای بازی که شامل مواردی همچون عنوان، منوی اصلی و بخش ذخیره بازی است، به عنوان آخرین مرحله در برنامه نویسی بازی اندروید شناخته می‌شود.

آموزش برنامه نویسی بازی اندروید در اندروید استودیو

در این بخش از نوشته به آموزش برنامه نویسی بازی اندروید در اندروید استودیو به صورت پروژه محور و در قالب ساخت بازی دو بعدی ساده پرداخته می‌شود.

آموزش برنامه نویسی کاتلین – توسعه اندروید با Kotlin – مقدماتی
فیلم آموزش برنامه نویسی کاتلین – توسعه اندروید با Kotlin – مقدماتی در تم آف

کلیک کنید

هدف از ارائه این بخش، آشنایی با چند تکنیک ساده در برنامه نویسی بازی اندروید است. در ادامه، تکنیک‌های ارائه شده در این بخش معرفی شده‌اند.

آموزش برنامه نویسی بازی اندروید با اندروید استودیو

  • کاربرد SurfacView در ساخت بازی
  • طراحی بر روی Canvas
  • ایجاد جلوه حرکتی برای شخصیت‌های بازی
  • استفاده از جلوه‌های صوتی در بازی
  • تعامل بازیکنان با بازی
  • طراحی مراحل مختلف بازی

در این بخش به صورت گام به گام بخش‌های مختلف بازی از ابتدا تا انتها پیاده‌سازی می‌شوند.

ساخت پروژه اولین گام در آموزش برنامه نویسی بازی اندروید

برای شروع نیاز است تا پروژه جدیدی در اندروید استودیو ایجاد شود. برای این منظور همانند تصویر زیر، قالب پروژه جدید را از نوع No Activity

 انتخاب کنید.

ساخت پروژه جدید در اندروید استودیو

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

وارد نمودن مشخصات پروژه

در نهایت پروژه جدید ایجاد می‌شود. سپس، باید Activity جدیدی را در محیط اندروید استودیو ایجاد کرد. برای این منظور از مسیر File > New > Activity > Empty Activity

 باید گزینه Empty Activity

 را انتخاب کنیم.

ساخت اکتیویتی جدید

سپس، در پنجره مربوط به تنظیمات اکتیویتی باید نامی دلخواه را برای اکتیویتی مربوطه انتخاب کرد.

تنظیمات اکتیویتی جدید

نکته‌ای که باید به آن توجه داشت این است که دیگر نیازی به فایل activity_main.xml

 برای این پروژه وجود ندارد و رابط کاربری بازی از طریق کدنویسی در محیط اندروید استودیو ایجاد خواهد شد.

آماده سازی تصاویر و صداها دومین گام در آموزش برنامه نویسی بازی اندروید

فایل‌های صوتی و تصویری یکی از موارد تاثیرگذار و جدا نشدنی از هر بازی اندرویدی هستند. در گام بعدی باید تصاویر و صداهای مورد نیاز برای بازی را در پروژه قرار دهیم.

آموزش برنامه نویسی کاتلین – توسعه اندروید Android با Kotlin – تکمیلی
فیلم آموزش برنامه نویسی کاتلین – توسعه اندروید Android با Kotlin – تکمیلی در تم آف

کلیک کنید

برای این منظور تصاویر و فایل‌های صوتی مورد استفاده در بازی ارائه شده است.

  • تصاویر بازی (+)
  • فایل صوتی انفجار (+)
  • فایل صوتی پس‌زمینه (+)

در ادامه، با کلیک راست بر روی پوشه res

 و انتخاب مسیر New > Folder > Raw Resource Folder

 پوشه جدیدی برای قرار دادن فایل‌های صوتی و تصویری بازی ایجاد کنید.

ایجاد پوشه res

در نتیجه، در زیر مجموعه پوشه res

 ، پوشه جدیدی با نام raw

 ایجاد می‌شود.

ساخت پوشه raw

در انتها نیز تصاویر قرار داده شده در بالا را در پوشه drawable

 قرار دهید و فایل‌های صوتی انفجار و پس‌زمینه را هم در پوشه raw

 کپی کنید.

قرار دادن فایل های صوتی و تصویری

تنظیم تمام صفحه بازی گام سوم در آموزش برنامه نویسی بازی اندروید

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

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

کلیک کنید

نکته‌ای که باید به آن توجه داشت این است که کلاس MainActivity

 از کلاس Activity

 ارث‌بری کند.

package org.o7planning.android2dgame;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Set fullscreen
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // Set No Title
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

    }

}

سپس، در فایل AndroidManifest.xml

 باید تنظیمات مربوط به تمام صفحه شدن اکتیویتی مورد نظر انجام شود. برای این منظور باید مشخصه screenOrientation

 را برابر با مقدار landscape

 قرار داد.




    

       ...

    

برای مشاهده تغییرات مورد نظر باید برنامه را اجرا کرد.

تنظیم تمام صفحه بازی

ادامه آموزش برنامه نویسی بازی اندروید با نمایش شخصیت های بازی

در بخش بعدی از آموزش برنامه نویسی بازی اندروید باید شخصیت‌های بازی را در صفحه نمایش قرار داد و با نوشتن کدهای مناسب امکان جابجایی آن‌ها را فراهم کرد.

آموزش سمت سرور اندروید با Parse Platform به زبان کاتلین Kotlin
فیلم آموزش سمت سرور اندروید با Parse Platform به زبان کاتلین Kotlin در تم آف

کلیک کنید

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

تصویر شخصیت بازی در حالات مختلف

با توجه به در اختیار داشتن تنها یک تصویر کلی از شخصیت اصلی بازی در حالت‌های مختلف، می‌توان از مختصات x

 و y

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

جداسازی بخش های مختلف تصویر شخصیت اصلی

در تصویر زیر نحوه مقیاس‌بندی فایل اصلی مربوط به شخصیت اصلی بازی نمایش داده شده است.

مقیاس‌بندی تصویر شخصیت اصلی بازی

علاوه بر این، در بحث متحرک‌سازی شخصیت‌های بازی باید به جهت حرکت و سرعت آن‌ها نیز توجه شود. در ادامه، برای برنامه نویسی این بخش از بازی باید کلاسی با عنوان Gameobject

 ایجاد کرد که شخصیت‌ها و موجودیت‌های بازی از این کلاس ارث‌بری می‌کنند. در نمونه کد زیر کلاس Gameobject

 ایجاد شده است.

package org.o7planning.android2dgame;

import android.graphics.Bitmap;

public abstract class GameObject {

    protected Bitmap image;

    protected final int rowCount;
    protected final int colCount;

    protected final int WIDTH;
    protected final int HEIGHT;

    protected final int width;


    protected final int height;
    protected int x;
    protected int y;

    public GameObject(Bitmap image, int rowCount, int colCount, int x, int y)  {

        this.image = image;
        this.rowCount= rowCount;
        this.colCount= colCount;

        this.x= x;
        this.y= y;

        this.WIDTH = image.getWidth();
        this.HEIGHT = image.getHeight();

        this.width = this.WIDTH/ colCount;
        this.height= this.HEIGHT/ rowCount;
    }

    protected Bitmap createSubImageAt(int row, int col)  {
        // createBitmap(bitmap, x, y, width, height).
        Bitmap subImage = Bitmap.createBitmap(image, col* width, row* height ,width,height);
        return subImage;
    }

    public int getX()  {
        return this.x;
    }

    public int getY()  {
        return this.y;
    }


    public int getHeight() {
        return height;
    }

    public int getWidth() {
        return width;
    }

}

در ادامه، برای شخصیت اصلی بازی کلاسی جداگانه با نام ChibiCharacter

 ایجاد کنید که این کلاس از کلاس GameObject

 ارث‌بری کند.

package org.o7planning.android2dgame;

import android.graphics.Bitmap;
import android.graphics.Canvas;

public class ChibiCharacter extends GameObject {

    private static final int ROW_TOP_TO_BOTTOM = 0;
    private static final int ROW_RIGHT_TO_LEFT = 1;
    private static final int ROW_LEFT_TO_RIGHT = 2;
    private static final int ROW_BOTTOM_TO_TOP = 3;

    // Row index of Image are being used.
    private int rowUsing = ROW_LEFT_TO_RIGHT;

    private int colUsing;

    private Bitmap[] leftToRights;
    private Bitmap[] rightToLefts;
    private Bitmap[] topToBottoms;
    private Bitmap[] bottomToTops;

    // Velocity of game character (pixel/millisecond)
    public static final float VELOCITY = 0.1f;

    private int movingVectorX = 10;
    private int movingVectorY = 5;

    private long lastDrawNanoTime =-1;

    private GameSurface gameSurface;

    public ChibiCharacter(GameSurface gameSurface, Bitmap image, int x, int y) {
        super(image, 4, 3, x, y);

        this.gameSurface= gameSurface;

        this.topToBottoms = new Bitmap[colCount]; // 3
        this.rightToLefts = new Bitmap[colCount]; // 3
        this.leftToRights = new Bitmap[colCount]; // 3
        this.bottomToTops = new Bitmap[colCount]; // 3

        for(int col = 0; col= this.colCount)  {
            this.colUsing =0;
        }
        // Current time in nanoseconds
        long now = System.nanoTime();

        // Never once did draw.
        if(lastDrawNanoTime==-1) {
            lastDrawNanoTime= now;
        }
        // Change nanoseconds to milliseconds (1 nanosecond = 1000000 milliseconds).
        int deltaTime = (int) ((now - lastDrawNanoTime)/ 1000000 );

        // Distance moves
        float distance = VELOCITY * deltaTime;

        double movingVectorLength = Math.sqrt(movingVectorX* movingVectorX + movingVectorY*movingVectorY);

        // Calculate the new position of the game character.
        this.x = x +  (int)(distance* movingVectorX / movingVectorLength);
        this.y = y +  (int)(distance* movingVectorY / movingVectorLength);

        // When the game's character touches the edge of the screen, then change direction

        if(this.x  this.gameSurface.getWidth() -width)  {
            this.x= this.gameSurface.getWidth()-width;
            this.movingVectorX = - this.movingVectorX;
        }

        if(this.y  this.gameSurface.getHeight()- height)  {
            this.y= this.gameSurface.getHeight()- height;
            this.movingVectorY = - this.movingVectorY ;
        }

        // rowUsing
        if( movingVectorX > 0 )  {
            if(movingVectorY > 0 && Math.abs(movingVectorX)  0 && Math.abs(movingVectorX) 

برای بروزرسانی پیوسته رابط کاربری باید از قابلیت «نخ‌بندی» (Threading) در اندروید استفاده کرد. برای این منظور کلاسی با نام GameThread

 بسازید که از کلاس Thread اصلی در اندروید ارث‌بری کند. نمونه کد مورد نظر برای کلاس GameThread

 در ادامه ارائه شده است.

package org.o7planning.android2dgame;

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class GameThread extends Thread {

    private boolean running;
    private GameSurface gameSurface;
    private SurfaceHolder surfaceHolder;

    public GameThread(GameSurface gameSurface, SurfaceHolder surfaceHolder)  {
        this.gameSurface= gameSurface;
        this.surfaceHolder= surfaceHolder;
    }

    @Override
    public void run()  {
        long startTime = System.nanoTime();

        while(running)  {
            Canvas canvas= null;
            try {
                // Get Canvas from Holder and lock it.
                canvas = this.surfaceHolder.lockCanvas();

                // Synchronized
                synchronized (canvas)  {
                    this.gameSurface.update();
                    this.gameSurface.draw(canvas);
                }
            }catch(Exception e)  {
                // Do nothing.
            } finally {
                if(canvas!= null)  {
                    // Unlock Canvas.
                    this.surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
            long now = System.nanoTime() ;
            // Interval to redraw game
            // (Change nanoseconds to milliseconds)
            long waitTime = (now - startTime)/1000000;
            if(waitTime 

در ادامه آموزش برنامه نویسی بازی اندروید باید کلاسی برای شبیه‌سازی کل سطح بازی نیز در نظر گرفته شود. برای این منظور کلاس GameSurface

 را ایجاد کنید که این کلاس از SurfaceView

 ارث‌بری می‌کند و شامل یک شی از نوع Canvas

 است که تمام اشیاd بازی بر روی آن ترسیم ‌می‌شوند. در ادامه، نمونه کد مربوط به این کلاس ارائه شده است.

package org.o7planning.android2dgame;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {

    private GameThread gameThread;
    private ChibiCharacter chibi1;

    public GameSurface(Context context)  {
        super(context);

        // Make Game Surface focusable so it can handle events. .
        this.setFocusable(true);

        // Sét callback.
        this.getHolder().addCallback(this);
    }

    public void update()  {
        this.chibi1.update();
    }

    @Override
    public void draw(Canvas canvas)  {
        super.draw(canvas);

        this.chibi1.draw(canvas);
    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Bitmap chibiBitmap1 = BitmapFactory.decodeResource(this.getResources(),R.drawable.chibi1);
        this.chibi1 = new ChibiCharacter(this,chibiBitmap1,100,50);

        this.gameThread = new GameThread(this,holder);
        this.gameThread.setRunning(true);
        this.gameThread.start();
    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry= true;
        while(retry) {
            try {
                this.gameThread.setRunning(false);

                // Parent thread must wait until the end of GameThread.
                this.gameThread.join();
            }catch(InterruptedException e)  {
                e.printStackTrace();
            }
            retry= true;
        }
    }

}

در انتها نیز تغییرات زیر را باید در کلاس اصلی بازی یعنی MainActivity

 ایجاد کرد.

package org.o7planning.android2dgame;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Set fullscreen
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // Set No Title
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        this.setContentView(new GameSurface(this));
    }

}

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

نسخه اولیه بازی

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

تعامل کاربر با بازی یکی از مواردی است که در برنامه نویسی بازی اندروید باید لحاظ شود. به طور معمول نیز میزان تعامل کاربران با یک بازی اندرویدی در مقایسه با سایر اپلیکیشن‌ها بسیار بالاتر است.

آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری در تم آف

کلیک کنید

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

 پیاده‌سازی شوند. در نمونه کد زیر، رویداد مورد نظر در زمان لمس کاربر برای جابجایی شخصیت اصلی بازی پیاده‌سازی شده است.

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        int x=  (int)event.getX();
        int y = (int)event.getY();

        int movingVectorX =x-  this.chibi1.getX() ;
        int movingVectorY =y-  this.chibi1.getY() ;

        this.chibi1.setMovingVector(movingVectorX,movingVectorY);
        return true;
    }
    return false;
}

در ادامه، کد کامل مربوط به این بخش از بازی ارائه شده است.

package org.o7planning.android2dgame;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {

    private GameThread gameThread;

    private ChibiCharacter chibi1;

    public GameSurface(Context context)  {
        super(context);

        // Make Game Surface focusable so it can handle events.
        this.setFocusable(true);

        // Set callback.
        this.getHolder().addCallback(this);
    }

    public void update()  {
        this.chibi1.update();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            int x=  (int)event.getX();
            int y = (int)event.getY();

            int movingVectorX =x-  this.chibi1.getX() ;
            int movingVectorY =y-  this.chibi1.getY() ;

            this.chibi1.setMovingVector(movingVectorX,movingVectorY);
            return true;
        }
        return false;
    }

    @Override
    public void draw(Canvas canvas)  {
        super.draw(canvas);

        this.chibi1.draw(canvas);
    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Bitmap chibiBitmap1 = BitmapFactory.decodeResource(this.getResources(),R.drawable.chibi1);
        this.chibi1 = new ChibiCharacter(this,chibiBitmap1,100,50);

        this.gameThread = new GameThread(this,holder);
        this.gameThread.setRunning(true);
        this.gameThread.start();
    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry= true;
        while(retry) {
            try {
                this.gameThread.setRunning(false);

                // Parent thread must wait until the end of GameThread.
                this.gameThread.join();
            }catch(InterruptedException e)  {
                e.printStackTrace();
            }
            retry= true;
        }
    }

}

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

تعامل کاربر با بازی

استفاده از شخصیت‌های متعدد ششمین گام در آموزش برنامه نویسی بازی اندروید

امکان افزودن شخصیت‌های جدید به بازی وجود دارد. در این بخش از آموزش برنامه نویسی بازی اندروید یک شخصیت دیگر به بازی اضافه خواهیم کرد.

آموزش پروژه محور اندروید استودیو – ساخت بازی Snake
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی Snake در تم آف

کلیک کنید

برای این منظور باید کدهای مربوط به کلاس GameSurface

 را ویرایش کرد.

package org.o7planning.android2dgame;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.ArrayList;
import java.util.List;

public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {

    private GameThread gameThread;

    private final List chibiList = new ArrayList();

    public GameSurface(Context context)  {
        super(context);

        // Make Game Surface focusable so it can handle events.
        this.setFocusable(true);

        // Set callback.
        this.getHolder().addCallback(this);
    }

    public void update()  {
        for(ChibiCharacter chibi: chibiList) {
            chibi.update();
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            int x=  (int)event.getX();
            int y = (int)event.getY();

            for(ChibiCharacter chibi: chibiList) {
                int movingVectorX =x-  chibi.getX() ;
                int movingVectorY =y-  chibi.getY() ;
                chibi.setMovingVector(movingVectorX, movingVectorY);
            }
            return true;
        }
        return false;
    }

    @Override
    public void draw(Canvas canvas)  {
        super.draw(canvas);

        for(ChibiCharacter chibi: chibiList)  {
            chibi.draw(canvas);
        }

    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Bitmap chibiBitmap1 = BitmapFactory.decodeResource(this.getResources(),R.drawable.chibi1);
        ChibiCharacter chibi1 = new ChibiCharacter(this,chibiBitmap1,100,50);

        Bitmap chibiBitmap2 = BitmapFactory.decodeResource(this.getResources(),R.drawable.chibi2);
        ChibiCharacter chibi2 = new ChibiCharacter(this,chibiBitmap2,300,150);

        this.chibiList.add(chibi1);
        this.chibiList.add(chibi2);

        this.gameThread = new GameThread(this,holder);
        this.gameThread.setRunning(true);
        this.gameThread.start();
    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry= true;
        while(retry) {
            try {
                this.gameThread.setRunning(false);

                // Parent thread must wait until the end of GameThread.
                this.gameThread.join();
            }catch(InterruptedException e)  {
                e.printStackTrace();
            }
            retry= true;
        }
    }

}

در نهایت، خروجی بازی در این مرحله با افزودن شخصیت جدید به صورت زیر خواهد بود.

استفاده از شخصیت‌های متعدد در برنامه نویسی بازی اندروید

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

استفاده از جلوه‌ها در برنامه نویسی بازی اندروید حس بهتری را به کاربر القا می‌کند و تاثیرگذاری و جذابیت بازی را نیز افزایش می‌دهد. به عنوان مثال، بازی را در نظر بگیرید که در حال هدایت یک هواپیما هستید، زمانی که این هواپیما به زمین برخورد می‌کند، باید منفجر شود و در نتیجه، این انفجار جلوه‌ای در بازی به حساب می‌آید. برای جذاب‌تر کردن این بازی می‌توان از صدای انفجار برای شبیه‌سازی بهتر استفاده کرد.

آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری در تم آف

کلیک کنید

در این بخش از بازی با کلیک بر روی شخصیت اصلی بازی باید انفجار صورت گیرد. در نتیجه، این شخصیت از بازی حذف شده و در همان موقعیت، تصویر انفجار باید نشان داده شود. برای این منظور کلاس Explosion

 باید ایجاد شود که از کلاس GameObject

 ارث‌بری می‌کند.

package org.o7planning.android2dgame;  

import android.graphics.Bitmap;
import android.graphics.Canvas;

public class Explosion extends GameObject {

    private int rowIndex = 0 ;
    private int colIndex = -1 ;

    private boolean finish= false;
    private GameSurface gameSurface;

    public Explosion(GameSurface GameSurface, Bitmap image, int x, int y) {
        super(image, 5, 5, x, y);

        this.gameSurface= GameSurface;
    }

    public void update()  {
        this.colIndex++;

        if(this.colIndex >= this.colCount)  {
            this.colIndex =0;
            this.rowIndex++;

            if(this.rowIndex>= this.rowCount)  {
                this.finish= true;
            }
        }
    }

    public void draw(Canvas canvas)  {
        if(!finish)  {
            Bitmap bitmap= this.createSubImageAt(rowIndex,colIndex);
            canvas.drawBitmap(bitmap, this.x, this.y,null);
        }
    }

    public boolean isFinish() {
        return finish;
    }

}

علاوه بر این، باید کدهای مربوط به کلاس GameSurface

 را به صورت زیر تغییر داد.

package org.o7planning.android2dgame;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {

    private GameThread gameThread;

    private final List chibiList = new ArrayList();
    private final List explosionList = new ArrayList();

    public GameSurface(Context context)  {
        super(context);

        // Make Game Surface focusable so it can handle events.
        this.setFocusable(true);

        // Sét callback.
        this.getHolder().addCallback(this);
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {

            int x=  (int)event.getX();
            int y = (int)event.getY();

            Iterator iterator= this.chibiList.iterator();

            while(iterator.hasNext()) {
                ChibiCharacter chibi = iterator.next();
                if( chibi.getX()  iterator= this.explosionList.iterator();
        while(iterator.hasNext())  {
            Explosion explosion = iterator.next();

            if(explosion.isFinish()) {
                // If explosion finish, Remove the current element from the iterator & list.
                iterator.remove();
                continue;
            }
        }
    }

    @Override
    public void draw(Canvas canvas)  {
        super.draw(canvas);

        for(ChibiCharacter chibi: chibiList)  {
            chibi.draw(canvas);
        }

        for(Explosion explosion: this.explosionList)  {
            explosion.draw(canvas);
        }

    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Bitmap chibiBitmap1 = BitmapFactory.decodeResource(this.getResources(),R.drawable.chibi1);
        ChibiCharacter chibi1 = new ChibiCharacter(this,chibiBitmap1,100,50);

        Bitmap chibiBitmap2 = BitmapFactory.decodeResource(this.getResources(),R.drawable.chibi2);
        ChibiCharacter chibi2 = new ChibiCharacter(this,chibiBitmap2,300,150);

        this.chibiList.add(chibi1);
        this.chibiList.add(chibi2);

        this.gameThread = new GameThread(this,holder);
        this.gameThread.setRunning(true);
        this.gameThread.start();
    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry= true;
        while(retry) {
            try {
                this.gameThread.setRunning(false);

                // Parent thread must wait until the end of GameThread.
                this.gameThread.join();
            }catch(InterruptedException e)  {
                e.printStackTrace();
            }
            retry= true;
        }
    }

}

در نهایت، خروجی حاصل از بازی در این مرحله بعد از افزودن جلوه انفجار به صورت زیر خواهد بود.

افزودن جلوه انفجار به بازی

افزودن جلوه های صوتی به بازی آخرین گام در آموزش برنامه نویسی بازی اندروید

جلوه‌های صوتی یکی دیگر از مواردی هستند که باعث افزایش تاثیرگذاری و جذابیت بازی می‌شوند. به عنوان مثال، صداهای پس‌زمینه بازی یا صدای انفجار در زمان از بین رفتن شخصیت بازی از این نمونه‌ها هستند.

آموزش پروژه محور اندروید استودیو – ساخت بازی حدس کلمه
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حدس کلمه در تم آف

کلیک کنید

برای افزودن صدا به بازی باید تغییراتی را به صورت زیر در کلاس Explosion

 ایجاد کرد.

package org.o7planning.android2dgame;

import android.graphics.Bitmap;
import android.graphics.Canvas;

public class Explosion extends GameObject {

    private int rowIndex = 0 ;
    private int colIndex = -1 ;

    private boolean finish= false;
    private GameSurface gameSurface;

    public Explosion(GameSurface GameSurface, Bitmap image, int x, int y) {
        super(image, 5, 5, x, y);

        this.gameSurface= GameSurface;
    }

    public void update()  {
        this.colIndex++;

        // Play sound explosion.wav.
        if(this.colIndex==0 && this.rowIndex==0) {
            this.gameSurface.playSoundExplosion();
        }

        if(this.colIndex >= this.colCount)  {
            this.colIndex =0;
            this.rowIndex++;

            if(this.rowIndex>= this.rowCount)  {
                this.finish= true;
            }
        }
    }

    public void draw(Canvas canvas)  {
        if(!finish)  {
            Bitmap bitmap= this.createSubImageAt(rowIndex,colIndex);
            canvas.drawBitmap(bitmap, this.x, this.y,null);
        }
    }

    public boolean isFinish() {
        return finish;
    }

}

در ادامه تغییرات دیگری نیز در کلاس GameSurface

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

package org.o7planning.android2dgame;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {

    private GameThread gameThread;

    private final List chibiList = new ArrayList();
    private final List explosionList = new ArrayList();

    private static final int MAX_STREAMS=100;
    private int soundIdExplosion;
    private int soundIdBackground;

    private boolean soundPoolLoaded;
    private SoundPool soundPool;



    public GameSurface(Context context)  {
        super(context);

        // Make Game Surface focusable so it can handle events.
        this.setFocusable(true);

        // Sét callback.
        this.getHolder().addCallback(this);

        this.initSoundPool();
    }

    private void initSoundPool()  {
        // With Android API >= 21.
        if (Build.VERSION.SDK_INT >= 21 ) {

            AudioAttributes audioAttrib = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_GAME)
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .build();

            SoundPool.Builder builder= new SoundPool.Builder();
            builder.setAudioAttributes(audioAttrib).setMaxStreams(MAX_STREAMS);

            this.soundPool = builder.build();
        }
        // With Android API  iterator= this.chibiList.iterator();


            while(iterator.hasNext()) {
                ChibiCharacter chibi = iterator.next();
                if( chibi.getX()  iterator= this.explosionList.iterator();
        while(iterator.hasNext())  {
            Explosion explosion = iterator.next();

            if(explosion.isFinish()) {
                // If explosion finish, Remove the current element from the iterator & list.
                iterator.remove();
                continue;
            }
        }
    }

    @Override
    public void draw(Canvas canvas)  {
        super.draw(canvas);

        for(ChibiCharacter chibi: chibiList)  {
            chibi.draw(canvas);
        }

        for(Explosion explosion: this.explosionList)  {
            explosion.draw(canvas);
        }

    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Bitmap chibiBitmap1 = BitmapFactory.decodeResource(this.getResources(),R.drawable.chibi1);
        ChibiCharacter chibi1 = new ChibiCharacter(this,chibiBitmap1,100,50);

        Bitmap chibiBitmap2 = BitmapFactory.decodeResource(this.getResources(),R.drawable.chibi2);
        ChibiCharacter chibi2 = new ChibiCharacter(this,chibiBitmap2,300,150);

        this.chibiList.add(chibi1);
        this.chibiList.add(chibi2);

        this.gameThread = new GameThread(this,holder);
        this.gameThread.setRunning(true);
        this.gameThread.start();
    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry= true;
        while(retry) {
            try {
                this.gameThread.setRunning(false);

                // Parent thread must wait until the end of GameThread.
                this.gameThread.join();
            }catch(InterruptedException e)  {
                e.printStackTrace();
            }
            retry= true;
        }
    }

}

بعد از انجام تغییرات بالا، بازی برای اجرا آماده است و می‌توان جلوه‌های صوتی استفاده شده در بازی را شنید.

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

تا این قسمت از نوشته با معرفی نقشه راه و مسیر یادگیری برنامه نویسی اندروید دید روشنی در خصوص این حوزه جذاب ایجاد شد. علاوه بر این، ابزار مناسب برای توسعه بازی اندروید از Android Studio گرفته تا موتور‌های مختلف بازی سازی مورد بررسی قرار گرفتند. در ادامه نیز به آموزش برنامه نویسی بازی اندروید در قالب ساخت بازی ساده دو بُعدی در اندروید استودیو پرداخته شد.

آموزش پروژه محور اندروید استودیو – ساخت بازی Snake
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی Snake در تم آف

کلیک کنید

در این بخش از نوشته سعی شده است تا به برخی از رایج‌ترین سوالات پیرامون برنامه نویسی بازی اندروید پاسخ داده شود.

بهترین زبان برنامه نویسی بازی اندروید چیست؟

زبان برنامه نویسی ++C به دلیل همه منظوره بودن و پشتیبانی از شی‌گرایی گزینه بسیار مناسبی برای شروع ساخت بازی به حساب می‌آید. ++C انعطاف‌پذیری بسیار بالایی دارد که در سایر زبان‌های برنامه نویسی بازی‌سازی کمتر دیده شده است.

آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری در تم آف

کلیک کنید

علاوه بر ++C زبان‌های دیگری نیز برای بازی‌سازی وجود دارند که در ادامه فهرست شده‌اند.

  • سی‌شارپ (#C)
  • جاوا
  • جاوا اسکریپت
  • Lua
  • پایتون
مطلب پیشنهادی:

برای ساخت بازی کدام زبان برنامه‌نویسی مناسب‌تر است؟

شروع مطالعه

 

روش های کسب درآمد از بازی سازی چیست؟

امروزه راه‌های مختلفی برای کسب درآمد از بازی‌سازی در اختیار توسعه‌دهندگان قرار دارد. یکی از ساده‌ترین و در عین حال موثرترین روش‌ها استفاده از تبلیغات درون برنامه‌ای است. در این روش با توجه به تعداد کلیک و میزان مشاهده تبلیغات توسط کاربرانِ بازی، درآمدی برای توسعه‌دهنده منظور می‌شود.

آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حافظه تصویری در تم آف

کلیک کنید

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

مطلب پیشنهادی:

روش های کسب درآمد از تبلیغات که باید بدانید — راهنمای کاربردی

شروع مطالعه

 

آیا امکان ساخت بازی اندروید بدون کدنویسی وجود دارد؟

استودیو‌های بازی همچون Flowlab، گیم میکر (GameMaker)، Google Game Builder و Quick App Ninja تنها چند نمونه از ابتدایی‌ترین موتور‌های بازی‌سازی هستند.

آموزش پروژه محور اندروید استودیو – ساخت بازی حدس کلمه
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی حدس کلمه در تم آف

کلیک کنید

این ابزارها به توسعه‌دهندگان تازه‌کار کمک می‌کنند تا تنها با «کشیدن و رها کردن» (Drag & Drop) و بدون نیاز به کدنویسی بازی مورد نظر خود را طراحی کنند.

مطلب پیشنهادی:

نرم‌افزارهای بازی‌سازی — معرفی 5 نرم‌افزار برتر برای ساخت Game در اندروید، iOS و کامپیوتر

شروع مطالعه

آیا برنامه نویسی بازی اندروید حوزه پردرآمدی است؟

بازار بازی‌های موبایلی با سرعت فوق‌العاده‌ای در حال پیشرفت است. هر ساله شاهد عناوین قدرتمندی هستیم که در کنار جذب کاربران بسیار زیاد، سود بسیار خوبی را نیز برای سازندگان به همراه دارند.

آموزش پروژه محور اندروید استودیو – ساخت بازی Snake
فیلم آموزش پروژه محور اندروید استودیو – ساخت بازی Snake در تم آف

کلیک کنید

از سوی دیگر نیز بسیاری از بازی‌ها در جذب کاربر ناکام می‌مانند. در نتیجه، برای ساخت یک بازی سودآور و موفق کار بسیار سختی پیش‌روی توسعه‌دهندگان بازی است.

کسب درآمد از برنامه نویسی بازی اندروید

آیا در برنامه نویسی بازی اندروید به محاسبات ریاضی نیاز است؟

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

آموزش پروژه محور اندروید استودیو – ساخت اپلیکیشن ارسال پیامک انبوه
فیلم آموزش پروژه محور اندروید استودیو – ساخت اپلیکیشن ارسال پیامک انبوه در تم آف

کلیک کنید

جمع‌بندی

بازی‌های موبایلی در سال‌های اخیر با استقبال بسیار زیاد کاربران مواجه شده‌اند. علاوه بر این، بازی‌های موبایلی در چند سال گذشته از نظر تعداد بازیکنان و درآمد، رشد تصاعدی داشته‌اند. از همین رو، بسیاری از افراد به حوزه برنامه نویسی بازی اندروید روی آورده‌اند که مخاطبین زیادی نیز دارد.

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

ارسال پاسخ

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.