رشد بسیار زیاد بازیهای موبایلی و در نتیجه، افزایش کاربران و درآمدهای حاصل از این بازیها توجه بسیاری از افراد را به این حوزه جلب کرده است. در این بین، سیستم عامل اندروید به دلیل دارا بودن سهم بیشتر از بازار موبایلی، بیشتر مورد توجه قرار گرفته است. از این رو، در این نوشتار سعی شده است آموزش برنامه نویسی بازی اندروید در اندروید استودیو به صورت پروژه محور و در قالب ساخت بازی دو بعدی ساده ارائه شود. مطالعه این مطلب برای آشنایی با اصول اولیه ساخت بازی در اندروید مناسب است. علاوه بر این، در نوشته برنامه نویسی بازی اندروید به مباحث مهمی همچون نقشه راه برنامه نویسی بازی اندروید، مراحل ساخت بازی اندرویدی، مقایسه برنامه نویسی اندروید و برنامه نویسی بازی اندروید و سایر موارد پرداخته شده است.
پیش درآمد برنامه نویسی بازی اندروید
بازیهای اندرویدی در سالهای اخیر رشد بسیار چشمگیری داشتهاند و به یکی از محبوبترین راهها برای گذراندن اوقات فراغت تبدیل شدهاند. شرکتهای ارائهدهنده گوشیهای موبایل نیز با تمرکز بر روی ارتقا سختافزاری دستگاههای خود و ارائه دستگاههای قدرتمندتر، تجربه بهتری را برای کاربران رقم زدهاند. در نتیجه، امروزه گیمرها به عناوین مختلف از ژانرهای متنوع دسترسی دارند.
با توجه به بازار گسترده بازیهای موبایلی و وجود فرصتهای مختلف درآمدزایی در این حوزه، بسیاری از افراد یادگیری برنامه نویسی بازی اندروید را به عنوان هدف خود تعیین کردهاند. در این بین حتی برنامهنویسان اندرویدی که در زمینه توسعه اپلیکیشن موبایل فعالیت میکردند، نیز در صدد تغییر گرایش خود به ست برنامه نویسی بازی اندروید هستند. در حال حاضر توسعهدهندگان بازیهای اندرویدی به دنبال ایجاد تجربههای نوآورانهای هستند که موجب گسترش مرزهای موجود در این صنعت شده است.
امروزه با توجه به وجود منابع مختلف برای آموزش برنامه نویسی بازی اندروید ، ساخت بازی نسبت به گذشته بسیار آسانتر شده است. به عنوان مثال، اگر فردی قصد توسعه بازی ساده و محبوبی همچون Super Mario را داشته باشد، اکنون در مقایسه با ۲۰ سال قبل کار واقعاً راحتتری خواهد داشت. در زمینه کسب درآمد از بازیهای موبایلی نیز با توجه به وجود بسترهای مختلف برای درآمدزایی، کار بسیار آسانتر از گذشته است. تنها چالشی که امروزه در زمینه بازی سازی وجود دارد، بحث جذب مخاطب و رقابت با سایر عناوین در این حوزه است، زیرا با وجود عناوین با کیفیت و جذاب و همچنین حضور شرکتهای معتبر در این حوزه، رقابت بسیار سختی برای جذب مخاطبین شکل گرفته است.
برنامه نویسی اندروید یا برنامه نویسی بازی اندروید کدامیک بهتر است؟
انتخاب بین برنامه نویسی اندروید و برنامه نویسی بازی اندروید ارتباط مستقیمی با مهارت و علاقه فرد دارد. در ادامه، بررسی مختصری در خصوص این دو حوزه ارائه شده است.
برنامه نویسی بازی اندروید
سیستم عامل اندروید پلتفرمی فوقالعاده برای شروع ساخت بازی است و چالشهای منحصر به فردی نیز در این حوزه در انتظار برنامهنویسان است. یکی از چالشهای موجود در برنامه نویسی بازی اندروید بحث مقیاسبندی «رابط کاربری» (User Interface | UI) بازیها است و باید بسته به اندازه و وضوح دستگاه اندرویدی، راهحل هوشمندانهای برای این موضوع پیدا کرد. با این حال، چالشهای زیاد دیگری نیز در حین توسعه بازی اندروید در انتظار برنامهنویسان است.
به طور کلی، اگر از دیدگاه شغلی به برنامه نویسی بازی اندروید نگاه شود، باید گفت نسبت به برنامه نویسی اندروید حرفه چالشیتری است و میتوان از تخیل و مهارت بیشتری نیز در آن استفاده کرد. اساساً در بحث توسعه بازی اندرویدی نیاز به ایجاد سیستمی با «تجربه کاربری» (User Experience | UX) و رابط گرافیکی بهتری وجود دارد و در بحث «پایگاه داده» (Database) نیز باید امکان ارتباط پایدار با سرور وجود داشته باشد. علاوه بر این، از نکات قابل توجه در بحث برنامه نویسی بازی اندروید این است که باید همزمان از چندین زبان برنامه نویسی استفاده کرد. در ادامه، تعدادی از انواع زبانهای برنامه نویسی مورد استفاده در توسعه بازی اندروید ارائه شدهاند.
- زبان اسمبلی
- زبانهای C، جاوا و ++C
- سی شارپ
- ویژوال بیسیک
- Lua
- پایتون و جاوا اسکریپت
- پاسکال
- Smalltalk
- Perl
- Lisp
علیرغم وجود چالشهای بسیار در زمینه برنامه نویسی بازی اندروید و نیاز به داشتن مهارتهای مختلف، باید به این نکته نیز اشاره کرد که میانگین پرداختی برای توسعهدهنده بازی اندرویدی تقریباً دو برابر برنامهنویس اندروید است.
برنامه نویسی اندروید
در زمینه برنامه نویسی اندروید در مقایسه با توسعه بازی اندرویدی، چالشهای کمتری در انتظار برنامه نویس است. شاید توسعه اپلیکیشن اندروید به اندازه ساخت بازی اندرویدی جذاب و سرگرم کننده نباشد، اما فرصتهای شغلی زیادی در این حوزه وجود دارد و با داشتن چند نمونه کار قابل قبول میتوان در شرکتهای مرتبط استخدام شد.
به طور کلی هر دو حوزه برنامه نویسی اندروید و برنامه نویسی بازی اندروید گزینههای بسیار خوبی برای انتخاب به عنوان حرفه اصلی هستند و بیشتر باید به علاقه و استعداد خود برای انتخاب یکی از این دو حوزه توجه کرد.
برنامه نویسی بازی اندروید را از کجا شروع کنیم؟
همان طور که پیشتر نیز بیان شد، توسعه بازی اندروید به عنوان حرفهای تمام وقت شناخته میشود. با این وجود، با توجه به فرصتهای گوناگون موجود در این حوزه بسیاری از افراد تصمیم به ساخت و برنامه نویسی بازی اندروید میگیرند. در حال حاضر، فروشگاههای اندرویدی نظیر «گوگل پِلی» (Google Play)، مملو از بازیهای گوناگون هستند. بر اساس آمار سال ۲۰۲۲ میلادی (۱۴۰۱ شمسی)، تقریباً ۴۷۸ هزار بازی اندرویدی در فروشگاه گوگل پلی در دسترس کاربران بوده است. بنابراین، با در نظر گرفتن این آمار میتوان متوجه سختی کار جذب مخاطب در این حوزه شد.
برای افرادی که تا کنون تجربه ساخت بازی اندروید را نداشتهاند، یافتن نقطه شروع آموزش برنامه نویسی بازی اندروید کمی دشوار است. علاوه بر این، سوالات دیگری نظیر ابزار مورد نیاز برای بازی سازی اندروید چیست و زبان مورد استفاده برای برنامه نویسی بازی اندروید چیست برای مخاطب ایجاد میشوند. در ادامه سعی شده است تا به این پرسشها و همچنین سوالات دیگری پیرامون برنامه نویسی بازی اندروید پاسخ داده شود.
داشتن ایده اولین گام در برنامه نویسی بازی اندروید
داشتن ایده تازه و خلاقانه در برنامه نویسی بازی اندروید اولین گام برای شروع کار و در نهایت ساخت یک بازی موفق است. این روزها فروشگاههای اندروید مملو از بازیهای تکراری و فاقد ایده خلاقانه هستند و در نتیجه، برای موفق شدن در این حوزه باید از عنصر خلاقیت استفاده کرد. حتی اگر برنامهنویس چیز زیادی در خصوص ابزارهای توسعه یا زبانهای برنامه نویسی مورد استفاده در آن نمیداند، در این مرحله این موضوع اهمیتی ندارد.
در ابتدای فرایند ساخت بازی اندرویدی مهمترین مورد، داشتن چشماندازی روشن در خصوص چیزی است که قصد ایجاد آن را دارید. داشتن چشمانداز روشن در خصوص ساخت بازی از این جهت اهمیت دارد که انتخاب ابزارها و گردش کار مناسب ارتباط مستقیمی با نوع بازی دارد. در این خصوص، تفاوتی بین ساخت بازی پازل ساده، بازی دو بعدی و حتی یک بازی با استفاده از «واقعیت مجازی» (Virtual Reality) وجود ندارد و برای هر کدام از این موارد باید چشمانداز و برنامه ساخت بازی مشخص و روشن باشد.
در شروع کار برنامه نویسی بازی اندروید برای افزایش شانس موفقیت، بهترین گزینه انتخاب عنوانی ساده برای ساخت بازی است. اکثر توسعهدهندگان بازی که به صورت مستقل فعالیت میکنند، با انتخاب عنوانی ساده برای بازی سعی در کاهش هزینههای ساخت دارند. به عنوان مثال، بازی پازل یا بازیهایی که کاربر را وارد یک حلقه بینهایت بازی میکنند، این مفهوم را بهتر نشان میدهند. در ابتدا میتوان با یک بازی ساده به عنوان راهی برای یادگیری برنامه نویسی بازی اندروید شروع کرد و سپس، بعد از کسب تجربه، به فکر تشکیل تیم برنامه نویسی و ایجاد بازیها و پروژههای پیچیدهتر بود.
تعیین مشخصات اصلی بازی دومین گام در برنامه نویسی بازی اندروید
بعد از تعیین ایده اصلی برای ساخت بازی و داشتن درک صحیحی در خصوص چشمانداز آن، باید مشخصات اصلی بازی اندرویدی را تعیین کرد. یکی از بهترین راهها برای تعیین مشخصات اصلی بازی، طرح سوالات مختلف پیرامون عنوان بازی مورد نظر و ارائه پاسخ مناسب به هر کدام است. در نهایت، با جمعآوری پاسخهای مورد نظر، میتوان به جمعبندی خوبی در خصوص بازی رسید. در ادامه، چند ایده برای طراحی سوالهای پیرامون مشخصات اصلی بازی ارائه شده است.
- ژانر و دستهبندی بازی چیست؟
- مخاطب هدف بازی در چه رده سنی قرار دارد؟
- سبک گرافیکی بازی به چه شکلی خواهد بود؟
- تصاویر و جلوههای صوتی بازی به چه صورتی انتخاب شوند؟
- از چه ابزاری برای ساخت جلوههای گرافیکی بازی استفاده خواهد شد؟
- از چه روشی برای درآمدزایی بازی استفاده شود؟
- نقاط عطف و چالشهای بازی به چه صورتی طراحی شوند؟
یکی از بهترین روشها برای بدست آوردن دیدی روشن در خصوص بازی و نکات پیرامون آن، بررسی سایر بازیهای موجود در فروشگاههای اندرویدی است. در هر بازه زمانی بازیهایی با ایدههای خلاقانه توانستهاند توجه کاربران زیادی را به سمت خود جلب کنند. در نتیجه، میتوان با گشت و گذار در فروشگاههای اندرویدی از این سبک بازیها و ایدههایشان برای ساخت بازی الهام گرفت.
انتخاب ابزار مناسب برای توسعه سومین گام در مسیر یادگیری برنامه نویسی بازی اندروید
بعد از مشخص شدن ایده بازی و مشخصات اصلی آن باید به سراغ انتخاب ابزار مناسب برای توسعه رفت. به بیان ساده، زمانی که فرد اطلاعات کافی در خصوص ساخت چیزی را دارد، باید تصمیم بگیرد که چگونه آن را بسازد.
با توجه به سطح مهارت و ماهیت پروژه، میتوان از چندین گزینه برای توسعه بازی اندروید استفاده کرد. در ادامه، ابزارهای مختلف برای توسعه بازی اندروید ارائه شده است.
اندروید استودیو
انتخاب «اندروید استودیو» (Android Studio) برای برنامه نویسی بازی اندروید در واقع گام برداشتن در مسیر سنتی ساخت بازی اندروید است.
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) را برای توسعه بازی انتخاب میکنند.
این ابزارها محیط یکپارچه توسعه را با موتور بازیسازی ترکیب میکنند. به عبارت دیگر، این موتورهای بازیسازی رابطی را برای مدیریت کدها فراهم میکنند و همچنین، بسیاری از جنبههای فیزیکی و رفتارهای آماده قابل استفاده در بازی را ارائه میدهند. به عنوان مثال، در محیطهای یونیتی و Unreal Engine، مثلاً برای مشخص کردن چگونگی سقوط چیزی از هوا نیازی به کدنویسی نیست و تنها با علامت زدن کادری با عنوان «گرانش» (Gravity) میتوان این مورد را مدیریت کرد.
یونیتی یا Unreal کدامیک برای ساخت بازی بهتر است؟
برای اکثر پروژههای بازیسازی میتوان از یونیتی استفاده کرد. علاوه بر این، افزودن ویژگیهای گرافیکی به این ابزارها تنها با «کشیدن و رها کردن» (Drag & Drop) آنها در محیط برنامه امکانپذیر است. این ابزارها کار را برای ساخت بازی بسیار آسان میکنند. به عنوان مثال، میتوان یک بازی اندرویدی ساده را در زمانی بسیار کوتاه (حتی ۷ دقیقه) ساخت.
البته در هر حال برای کار کردن با هر کدام از این دو محیط بازیسازی، نیاز به کدنویسی مختصری وجود دارد. یونیتی از زبان برنامه نویسی سی شارپ استفاده میکند که بسیار شبیه جاوا است. از سوی دیگر، Unreal نیز از زبان ++C برای بخش اسکریپت خود استفاده میکند. برای کار با این ابزارها، همچنان نیاز به استفاده از Android SDK وجود دارد. در ادامه، بارزترین ویژگیهای این دو ابزار برنامه نویسی بازی اندروید ارائه شده است.
- هر دو ابزار کاملاً رایگان هستند.
- محدودیتی در ساخت بازی با آنها وجود ندارد.
- توسط توسعهدهندگان حرفهای استفاده میشوند.
- «چند پلتفرمی» (Cross-Platform) هستند و میتوان خروجی را به سایر پلتفرمها انتقال داد.
البته این دو موتور بازیسازی قدرتمند در برخی زمینهها با یکدیگر تفاوتهایی نیز دارند. در مجموع، استفاده از یونیتی کمی سادهتر است و برای ساخت بازیهای موبایلی و دو بعدی گزینه مناسبتری به حساب میآید. از Unreal نیز با توجه به برتری آن در بحث گرافیک سه بعدی میتوان برای توسعه بازیهای بزرگتر و پیچیدهتر استفاده کرد.
استفاده از بازی سازها
یکی از آسانترین روشها برای ساخت بازی اندرویدی استفاده از نرمافزارهای «بازیساز» (Game Builder) است. استفاده از این ابزارها در واقع مفهوم برنامه نویسی بازی اندروید را کم رنگ میکند، زیرا دیگر نیازی به کد نویسی زیاد برای ساخت بازی نیست. بیشتر این نرمافزارهای بازیسازی از قابلیت «کشیدن و رها کردن» (Drag & Drop) استفاده و فرایند ساخت بازی را بسیار آسان میکنند.
نرمافزار GameMaker Studio یکی از ابزارهای بازیسازی محسوب میشود که توسط شرکت Yoyo Games معرفی شده است. کار با این ابزار بسیار سادهتر از یونیتی و انریل است و حتی در صورت آشنایی با اصول برنامه نویسی نیز میتوان با زبان مخصوص آن، تحت عنوان GML اسکریپتهای اولیه را نوشت. زبان برنامه نویسی GML در واقع ترکیبی از زبانهای C++، جاوا و C است و قابلیت برنامه نویسی شیگرا را نیز دارد. در حالی که برخی از بازیهای موفق به کمک GameMaker توسعه داده شدهاند، اما این ابزار در برخی از عملکردها برنامهنویس را با محدودیتهایی روبرو میکند. تمرکز نرمافزار GameMaker بر استفاده از الگوها و گرافیکهای از پیشتعریف شده است.
شروع ساخت پروژه گام چهارم در برنامه نویسی بازی اندروید
بعد از آشنایی کامل با مجموعه ابزارهای مورد استفاده برای برنامه نویسی بازی اندروید باید پروژه جدید را آغاز کرد. در این مرحله نگاه کردن به صفحه خالی ممکن است کمی دلهرهآور باشد، اما با ساده در نظر گرفتن هر بخش و شروع فرایند ساخت بازی میتوان پیشرفت گام به گام پروژه را مشاهده کرد.
تمام بازیها به مجموعهای از اصول و قوانین اولیه نیاز دارند. بنابراین، در این مرحله میتوان با طراحی حس بازی کار را شروع کرد. به عنوان مثال، شخصیت اصلی بازی چه ویژگیهایی باید داشته باشد و مهارتهای او چیست. مرحله طراحی در ساخت بازی بسیار سرگرمکننده است و میتوان ویژگیهای مختلفی را امتحان کرد. استفاده از گرافیک و صدا در بازی گام بعدی در ساخت بازی است.
این مرحله در عین جذاب بودن میتواند بسیار زمانبر و چالشبرانگیز هم باشد. برای افزایش سرعت توسعه میتوان در این بخش از افرادی استفاده کرد که در حوزههای طراحی و گرافیک فعالیت میکنند. در نهایت ایجاد رابط کاربری برای بازی که شامل مواردی همچون عنوان، منوی اصلی و بخش ذخیره بازی است، به عنوان آخرین مرحله در برنامه نویسی بازی اندروید شناخته میشود.
آموزش برنامه نویسی بازی اندروید در اندروید استودیو
در این بخش از نوشته به آموزش برنامه نویسی بازی اندروید در اندروید استودیو به صورت پروژه محور و در قالب ساخت بازی دو بعدی ساده پرداخته میشود.
هدف از ارائه این بخش، آشنایی با چند تکنیک ساده در برنامه نویسی بازی اندروید است. در ادامه، تکنیکهای ارائه شده در این بخش معرفی شدهاند.
- کاربرد SurfacView در ساخت بازی
- طراحی بر روی Canvas
- ایجاد جلوه حرکتی برای شخصیتهای بازی
- استفاده از جلوههای صوتی در بازی
- تعامل بازیکنان با بازی
- طراحی مراحل مختلف بازی
در این بخش به صورت گام به گام بخشهای مختلف بازی از ابتدا تا انتها پیادهسازی میشوند.
ساخت پروژه اولین گام در آموزش برنامه نویسی بازی اندروید
برای شروع نیاز است تا پروژه جدیدی در اندروید استودیو ایجاد شود. برای این منظور همانند تصویر زیر، قالب پروژه جدید را از نوع No Activity
انتخاب کنید.
در گام بعدی، در صفحه مربوط به مشخصات پروژه، اطلاعات مورد نیاز از قبیل نام پروژه، نام بسته و زبان مورد استفاده را وارد کنید.
در نهایت پروژه جدید ایجاد میشود. سپس، باید Activity جدیدی را در محیط اندروید استودیو ایجاد کرد. برای این منظور از مسیر File > New > Activity > Empty Activity
باید گزینه Empty Activity
را انتخاب کنیم.
سپس، در پنجره مربوط به تنظیمات اکتیویتی باید نامی دلخواه را برای اکتیویتی مربوطه انتخاب کرد.
نکتهای که باید به آن توجه داشت این است که دیگر نیازی به فایل activity_main.xml
برای این پروژه وجود ندارد و رابط کاربری بازی از طریق کدنویسی در محیط اندروید استودیو ایجاد خواهد شد.
آماده سازی تصاویر و صداها دومین گام در آموزش برنامه نویسی بازی اندروید
فایلهای صوتی و تصویری یکی از موارد تاثیرگذار و جدا نشدنی از هر بازی اندرویدی هستند. در گام بعدی باید تصاویر و صداهای مورد نیاز برای بازی را در پروژه قرار دهیم.
برای این منظور تصاویر و فایلهای صوتی مورد استفاده در بازی ارائه شده است.
- تصاویر بازی (+)
- فایل صوتی انفجار (+)
- فایل صوتی پسزمینه (+)
در ادامه، با کلیک راست بر روی پوشه res
و انتخاب مسیر New > Folder > Raw Resource Folder
پوشه جدیدی برای قرار دادن فایلهای صوتی و تصویری بازی ایجاد کنید.
در نتیجه، در زیر مجموعه پوشه res
، پوشه جدیدی با نام 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
قرار داد.
...
برای مشاهده تغییرات مورد نظر باید برنامه را اجرا کرد.
ادامه آموزش برنامه نویسی بازی اندروید با نمایش شخصیت های بازی
در بخش بعدی از آموزش برنامه نویسی بازی اندروید باید شخصیتهای بازی را در صفحه نمایش قرار داد و با نوشتن کدهای مناسب امکان جابجایی آنها را فراهم کرد.
نکتهای که در خصوص تصویر مورد نظر برای شخصیت بازی باید به آن توجه داشت این است که تنها یک تصویر برای شخصیت بازی در اختیار دارید. در نتیجه، با توجه به این که وضعیت شخصیت بازی در حالتهای مختلف تغییر میکند، این فایل تصویری به چند بخش تقسیم میشود. در تصویر زیر این مورد به وضوح مشخص شده است.
با توجه به در اختیار داشتن تنها یک تصویر کلی از شخصیت اصلی بازی در حالتهای مختلف، میتوان از مختصات 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;
}
}
}
با لمس بخشهای مختلف صفحه نمایش توسط کاربر، شخصیت اصلی بازی به سمت بخش مورد نظر حرکت میکند. خروجی این بخش در تصویر زیر قابل مشاهده است.
استفاده از شخصیتهای متعدد ششمین گام در آموزش برنامه نویسی بازی اندروید
امکان افزودن شخصیتهای جدید به بازی وجود دارد. در این بخش از آموزش برنامه نویسی بازی اندروید یک شخصیت دیگر به بازی اضافه خواهیم کرد.
برای این منظور باید کدهای مربوط به کلاس 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 گرفته تا موتورهای مختلف بازی سازی مورد بررسی قرار گرفتند. در ادامه نیز به آموزش برنامه نویسی بازی اندروید در قالب ساخت بازی ساده دو بُعدی در اندروید استودیو پرداخته شد.
در این بخش از نوشته سعی شده است تا به برخی از رایجترین سوالات پیرامون برنامه نویسی بازی اندروید پاسخ داده شود.
بهترین زبان برنامه نویسی بازی اندروید چیست؟
زبان برنامه نویسی ++C به دلیل همه منظوره بودن و پشتیبانی از شیگرایی گزینه بسیار مناسبی برای شروع ساخت بازی به حساب میآید. ++C انعطافپذیری بسیار بالایی دارد که در سایر زبانهای برنامه نویسی بازیسازی کمتر دیده شده است.
علاوه بر ++C زبانهای دیگری نیز برای بازیسازی وجود دارند که در ادامه فهرست شدهاند.
- سیشارپ (#C)
- جاوا
- جاوا اسکریپت
- Lua
- پایتون
برای ساخت بازی کدام زبان برنامهنویسی مناسبتر است؟
روش های کسب درآمد از بازی سازی چیست؟
امروزه راههای مختلفی برای کسب درآمد از بازیسازی در اختیار توسعهدهندگان قرار دارد. یکی از سادهترین و در عین حال موثرترین روشها استفاده از تبلیغات درون برنامهای است. در این روش با توجه به تعداد کلیک و میزان مشاهده تبلیغات توسط کاربرانِ بازی، درآمدی برای توسعهدهنده منظور میشود.
استفاده از این روش بیشتر برای بازیهایی با نصب بالا توصیه میشود. از سایر روشهای کسب درآمد از بازیسازی میتوان به پرداخت درون برنامهای، فروش بازی، حق اشتراک و فروش محصولات مرتبط با بازی اشاره کرد.
روش های کسب درآمد از تبلیغات که باید بدانید — راهنمای کاربردی
آیا امکان ساخت بازی اندروید بدون کدنویسی وجود دارد؟
استودیوهای بازی همچون Flowlab، گیم میکر (GameMaker)، Google Game Builder و Quick App Ninja تنها چند نمونه از ابتداییترین موتورهای بازیسازی هستند.
این ابزارها به توسعهدهندگان تازهکار کمک میکنند تا تنها با «کشیدن و رها کردن» (Drag & Drop) و بدون نیاز به کدنویسی بازی مورد نظر خود را طراحی کنند.
نرمافزارهای بازیسازی — معرفی 5 نرمافزار برتر برای ساخت Game در اندروید، iOS و کامپیوتر
آیا برنامه نویسی بازی اندروید حوزه پردرآمدی است؟
بازار بازیهای موبایلی با سرعت فوقالعادهای در حال پیشرفت است. هر ساله شاهد عناوین قدرتمندی هستیم که در کنار جذب کاربران بسیار زیاد، سود بسیار خوبی را نیز برای سازندگان به همراه دارند.
از سوی دیگر نیز بسیاری از بازیها در جذب کاربر ناکام میمانند. در نتیجه، برای ساخت یک بازی سودآور و موفق کار بسیار سختی پیشروی توسعهدهندگان بازی است.
آیا در برنامه نویسی بازی اندروید به محاسبات ریاضی نیاز است؟
بازیها سیستمهای پیچیدهای دارند که نیازمند محاسبات ریاضی زیادی هستند. توسعهدهندگان بازی باید مهارت خوبی در زمینه ریاضیات داشته و با جبر خطی، حساب دیفرانسیل، انتگرال، هندسه، مثلثات و آمار آشنا باشند. البته آشنایی با این موارد در سطوح پیشرفته بازیسازی نیاز است.
جمعبندی
بازیهای موبایلی در سالهای اخیر با استقبال بسیار زیاد کاربران مواجه شدهاند. علاوه بر این، بازیهای موبایلی در چند سال گذشته از نظر تعداد بازیکنان و درآمد، رشد تصاعدی داشتهاند. از همین رو، بسیاری از افراد به حوزه برنامه نویسی بازی اندروید روی آوردهاند که مخاطبین زیادی نیز دارد.
در این نوشته به آموزش برنامه نویسی بازی اندروید در اندروید استودیو به صورت پروژه محور و در قالب ساخت بازی دو بعدی ساده پرداخته شد. علاوه بر این، مباحث مهمی همچون مقایسه برنامه نویسی اندروید و برنامه نویسی بازی اندروید، نقشه راه برنامه نویسی بازی اندروید و روشهای کسب درآمد از بازیسازی نیز مورد بررسی قرار گرفت. همچنین، سعی شد تا به اکثر سوالات رایج پیرامون این حوزه پاسخ داده شود.