![در ابتدا ... - 1 وجود داشت]()
دوره آزمایشی اولین شغل من 3 سال پیش به پایان رسید، اما فقط الان فرصتی برای نوشتن مقاله پیدا کردم. من یک سال را در بخش های مختلف دانشگاه گذراندم: در ترم اول، مدیریت خواندم و در ترم دوم، به مهندسی نرم افزار رفتم. امیدوارم برنامه نویسی را به من یاد بدهند، اما اشتباه کردم. بنابراین، مواد را جمع آوری کردم و تصمیم گرفتم همه چیز را به تنهایی یاد بگیرم. تنها دلیلی که من از معلمم سپاسگزارم این است که او توصیه کرد که با کتاب الکترونیکی استیون پرت "زبان برنامه نویسی C" شروع کنم. واقعا کتاب خوبی با تمرین های عملی زیاد است. من حدود 2 ماه را صرف کتاب کردم، پس از آن با این دوره آنلاین جاوا در گروه های یکی از دوستان مواجه شدم و به همین ترتیب شروع شد.
در ابتدا برنامهریزی کردم که یک توسعهدهنده اندروید شوم ، اما با پیشرفت در یادگیری، بکاند برایم جالبتر به نظر میرسید. ضمناً 3 ماه طول کشید تا به سطح 20 رسیدم و بعد از آن تصمیم گرفتم برای یافتن شغل تلاش کنم. اولین کار این بود
که به شهر دیگری نقل مکان کنیماز آنجایی که مال من هیچ فرصتی برای یک توسعه دهنده جوان جاوا نداشت. یک شرکت پیدا کردم، درخواست دادم و یک تست آزمایشی دریافت کردم که یک هفته به من فرصت داده شد تا آن را تکمیل کنم. من مجبور شدم یک برنامه وب ساده با استفاده از Hibernate، Servlet/JSP و MySQL بنویسم. با دیدن همه این اصطلاحات، فقط می دانستم که MySQL یک پایگاه داده است. اولش خیلی ناامید شدم. من حتی تصمیم گرفتم به دنبال فرصت های شغلی در برخی از KFC باشم، اما پس از آن تصمیم گرفتم که در تست آزمایشی کار کنم. از این گذشته، من همیشه می توانستم در KFC کار پیدا کنم. تمام هفته را بدون وقفه کار کردم و توانستم امتحان را تمام کنم. من راه حلم را ارسال کردم، اما "زیبا نبود"، بنابراین 4 بار دیگر آن را اصلاح کردم. آخرین راه حل من درست بود، اما موقعیت ها قبلا پر شده بود و درخواست های اضافی به مدت 3 ماه پذیرفته نمی شد. می خواهی چکار کنی، درست است؟ برای 3 ماه آینده، HTML، CSS، JS، SQL و PHP را یاد گرفتم. چرا PHP؟ من به یک زبان سرور نیاز داشتم که به درخواست ها و مواردی از این دست پاسخ دهد. در آن زمان، servlets و jsp بیش از حد پیچیده به نظر می رسید. در پایان، من یک برنامه وب کامل با رابط کاربری وحشتناک تولید کردم. من کد را در GitHub برای نمونه کار خود منتشر کردم. در این زمان 3 ماه گذشته بود و همان شرکت مجدداً با من تماس گرفت و من را به مصاحبه دعوت کرد و یک کار ساده دیگر برای آزمایش دانش من در مورد SQL داد که در عرض چند ساعت موفق به انجام آن شدم. شخصی که در مورد استخدام با او صحبت می کردم اشاره کرد که در مورد الگوریتم ها و ساختارهای داده سوال خواهند کرد - موضوعاتی که من هنوز وقت نداشتم به آنها تسلط پیدا کنم. گفته می شود، 15 روز قبل از مصاحبه وجود داشت. گرفتم! کتاب رابرت لافور "ساختارهای داده و الگوریتم ها در جاوا" به من کمک کرد. در عرض دو هفته وقت نکردم همه آن را بخوانم و بفهمم، اما هنوز چیزهای زیادی یاد گرفتم. و سپس روز مصاحبه فرا رسید. سر ساعت مقرر رسیدم. دو مرد با من احوالپرسی کردند و مصاحبه شروع شد. اینکه بگویم نگران بودم، یک دست کم گرفتن وحشیانه است. صدایم لرزید. آنها در مورد همه چیز به جز الگوریتم ها و ساختارهای داده سوال کردند. آنها درباره Spring، DI، IoC، Hibernate، نحوه کار JVM، نحوه کار جمعآوری زباله پرسیدند - من نتوانستم به یکی از این سؤالات پاسخ دهم. من فقط به سوالات مربوط به Java Core (مجموعه ها، استثناها، OOP و غیره) با موفقیت پاسخ دادم. در حالی که هنوز در مصاحبه بودم، می دانستم که در آن شکست خوردم، اما باز هم از اینکه هیچ بازخوردی دریافت نکردم، ناامید بودم. در عوض، شکاف هایی را در دانش خود شناسایی کردم و با جدیت شروع به کار کردم تا آنها را برطرف کنم.
من یک ماه بعد از مصاحبه ناموفقم کار پیدا کردم. به هر حال، من فرصت شغلی را در بحث های مربوط به CodeGym پیدا کردم (
CodeGym نسخه روسی زبان CodeGym است — یادداشت ویرایشگر). اول، یک مصاحبه اسکایپ با یک استخدام کننده وجود داشت (حدود 2 ساعت طول کشید). آنها در مورد Java Core، جمعآوری زباله (اکنون میدانم چگونه کار میکند)، پایگاههای داده و ساختارهای داده پرسیدند. مصاحبه کننده از من خواست تا صفحه نمایشم را به اشتراک بگذارم و یک ماشین حساب بنویسم. تقریباً از خوشحالی گریه می کردم، زیرا فقط یک هفته قبل یک ماشین حساب نوشته بودم. با اطمینان به خودم، کار را شروع کردم. اما چه به خاطر هیجان و چه به دلایل دیگر، بخشی از الگوریتم را فراموش کردم. صفحه نمایش من به اشتراک گذاشته شد. از مشورت با گوگل می ترسیدم. خوشبختانه تلفن همراهم را داشتم که باعث نجات جانم شد. روز بعد برای مصاحبه حضوری تماس گرفتند و چند روز بعد
پیشنهاد دریافت کردم . این یک موضع رسمی نبود. نقش من شاگردی یک مالک انفرادی بود. ما یک سرویس برای برنامه ریزی رویداد، فروش بلیط و ... نوشتیم، اولین روز کاری ام را به یاد دارم. رئیس من 15 دقیقه وقت گذاشت تا توضیح دهد که چه کاری باید انجام شود. "آیا همه چیز روشن است؟" او درخواست کرد. "هوم، نه واقعا. می توانی یک بار دیگر به آن بپردازی؟" با نگرانی زیاد پرسیدم. رئیس دوباره همه چیز را توضیح داد. "الان معلوم است؟" "بله، در حال حاضر است." راستش من هیچی نفهمیدم اما ترسیدم توضیح دیگری بخواهم. من فکر می کنم هر کسی که کار می کند می تواند این را درک کند. کار به انتقال از Thymeleaf به AngularJS خلاصه شد. خوشبختانه، تکهای از کد تمامشده را پیدا کردم و از آن به عنوان نمونهای برای انجام کار استفاده کردم. من نفهمیدم چگونه کار کرد، اما کار را تمام کردم. متعاقباً وظایفی به من محول شد که مستقیماً به باطن مرتبط بود. تنها پس از یک تجربه عملی با بهار، شروع کردم به درک آنچه در "بهار برای حرفه ای ها" خواندم. 8 ماه آنجا کار کردم و سپس به شهر دیگری نقل مکان کردم، در آنجا به سرعت یک شغل رسمی پیدا کردم، 2 سال کار کردم و در طول راه عنوان خود را از "جونیور" به "سطح متوسط" تغییر دادم. بعد با این واقعیت روبرو شدم که کارم روتین شده و ذره ای لذت به من نمی دهد. پس استراحت کردم. برای جلوگیری از آتروفی شدن انگشتانم در زمان استراحت، تصمیم گرفتم دستم را در زمینه دیگری امتحان کنم: توسعه بازی. به طور خاص، توسعه بازی های موبایل، انتخاب اندروید، از آنجایی که من قبلاً جاوا را می دانستم. و این همان چیزی است که من اکنون در مورد آن با جزئیات صحبت خواهم کرد.
تیم من. به طور خلاصه، من یک تیم کوچک متشکل از 4 نفر (از جمله من) جمع آوری کرده بودم: 2 توسعه دهنده، 1 طراح بازی و 1 مهندس صدا. از آنجایی که هیچ کس در تیم هیچ تجربه ای در ساخت بازی نداشت و چون زمان تعطیلات من محدود بود، تصمیم گرفتیم پروژه ساده ای را اجرا کنیم که قطعاً می توانیم آن را به پایان برسانیم. و همینطور هم کردیم! در ابتدا، آخرین مهلت 15 نوامبر بود، اما همانطور که می دانید، اتمام یک پروژه در زمان بندی اشتباه است. بنابراین، ما آن را با دو هفته تاخیر تمام کردیم. پشته فناوری ما شامل جاوا 8 و libGDX بود.
توسعه
توسعه در 17 اکتبر آغاز شد. در مجموع، ما 45 روز را سپری کردیم که در طی آن:
- ما یاد گرفتیم که چگونه از libGDX استفاده کنیم.
- کد نوشتیم
- ما گرافیک ایجاد کردیم.
- ما موسیقی ساختیم.
هر کسی که بازی را دیده باشد ممکن است بپرسد "چرا اینقدر طول کشید؟ بازی خیلی ساده است." بله، درست است و به طور دقیق، قسمت توسعه (نوشتن کد) حدود یک هفته و نیم طول کشید. بقیه زمان بین موارد زیر تقسیم شد:
- تسلط بر نحوه استفاده از موتور بازی.
- طراحی و طراحی مجدد آثار هنری.
- نوشتن موسیقی.
- جستجوی صداها در https://freesound.org
.
- خواندن انبوهی از مقالات در مورد نحوه تبلیغ بازی ها.
ما همچنین به دلایل مختلف لحظاتی از "قطع" داشتیم: یکی امتحان داشت، دیگری تست آرایش داشت و غیره. مطمئناً می توانیم یک هفته و نیم یا بیشتر را به زمان استراحت نسبت دهیم. مدتی نیز صرف «مناظرهها» شد: ایدههای جدیدی درباره چیزهایی که باید به بازی اضافه شود تقریباً هر روز ظاهر میشد، بنابراین ما بحث میکردیم: «زائد است»، «مناسب نیست» و غیره. ایدههای زیادی را بیرون انداختیم. به عنوان مثال، اضافه کردن سوسکهای در حال اجرا که میتوان آنها را خرد کرد تا امتیاز بیشتری به دست آورد: به نظر من، یکی از سختترین چیزها این بود که از قبل تصمیم بگیریم در بازی چه چیزی وجود دارد و به برنامه پایبند باشیم بدون اینکه سعی کنیم «فقط یک مورد دیگر» اضافه کنیم. " ویژگی. این 45 روز اینگونه جمع شد. نمونه اولیه بازی بعد از یک هفته و نیم آماده شد. در این مدت، ما واقعاً هیچ گرافیکی نداشتیم، بنابراین برخی چیزها را از دامنه عمومی برداشتیم (مثلاً پس زمینه کاغذ را از Doodle Jump قرض گرفتیم) و برخی چیزها را خودمان در Paint به کار بردیم.
![در ابتدا ... - 2 وجود داشت]()
بازی از نظر فنی بسیار ساده است. ما حتی نیازی به استفاده از box2d (موتور فیزیک) نداشتیم. ما می توانیم برخوردها را مدیریت کنیم و هیپوتنوس را به تنهایی محاسبه کنیم. جالب ترین نکاتی که به آنها اشاره می کنم عبارتند از:
-
در ابتدا، تمام عناصر بازی به صورت تصادفی تولید شدند. به عبارت دیگر، ما ارائهدهندگان (سیاهچالهها، قیچیها، ستارههای نینجا، سرب مدادی، قلبها) را در یک آرایه قرار دادیم، یک ارائهدهنده تصادفی گرفتیم، یک عنصر با مختصات تصادفی گرفتیم. خیلی سریع مشخص شد که این رویکرد "واقعاً خوب نیست". دوستان شرکت کننده در تست همین موضوع را به ما گفتند و استفاده از قالب ها را توصیه کردند. برای کسانی که درگیر توسعه بازی هستند، این احتمالا یک راه حل واضح است. اما چون تازه وارد این رشته بودیم توصیه بسیار کاربردی برای ما بود.
بنابراین ما چندین الگو ایجاد کردیم: یک دره قیچی. سرنخ های مدادی - جمع آوری سریع آنها بسیار جالب است (هوووش، وووش، با انگشت خود). و یک الگوی دیگر که نمیدانم چه نامی بگذارم - فقط به شما میگویم که نام کلاس را در کدمان چه نامگذاری کردهایم: StraightForwardPattern
.
این الگوها آن را بهبود بخشیدند، اما به نوعی قابل پیش بینی بود. به همین دلیل یکی دیگر را اضافه کردیم: یک الگوی تصادفی. به عبارت دیگر، ما اکنون چند الگوی "ایستا" و یک الگوی تصادفی داریم (مم "کاملا متعادل" را در اینجا وارد کنید).
-
مشکل اصلی که با آن مواجه شدیم اینجاست. LibGDX متد render (float delta) را در یک حلقه بی نهایت فراخوانی می کند. اینجاست که تمام عناصر ترسیم می شوند. خط مداد به صورت زیر کشیده می شود: مختصات انگشت را می گیریم و بافت را در آنجا می کشیم. بنابراین، اگر ما انگشت خود را خیلی سریع روی صفحه حرکت دهیم، به دلیل میلی ثانیهای بین تماسهای متد رندر(دلتا) خط دارای "شکاف" خواهد بود.
راه حل بسیار ساده بود: آخرین مختصات را در جایی که بافت رسم شده به خاطر می آوریم، مختصات بعدی را بدست می آوریم و اگر فاصله بین آنها بیشتر از X باشد و انگشت رها نشده باشد، شکاف را پر می کنیم. در ابتدا، ما فکر کردیم که این گزینه ممکن است کار نکند - خطوط زاویه ای خواهند بود. اما ترس ما بی اساس بود، همه چیز همانطور که باید کار می کرد.
درباره بازی
گیم پلی بازی ادعا نمی کند که منحصر به فرد است، اما بسیار خوب است و می تواند کاربران را به سمت خود بکشاند. شما یک مداد را کنترل می کنید، به معنای واقعی کلمه روی کاغذ نقاشی می کنید و موانع را دور می زنید - قیچی، ستاره های نینجا و سیاه چاله ها. در همین حال، سرب مداد شما در حال تمام شدن است و باید مدادهای کوچک بردارید. اگر مداد شما قبل از جمع آوری یک مداد کوچک به پایان می رسد، می توانید تکه ای از یک آینه را بردارید. برای چند ثانیه، بهجای مصرف سرب مداد، بازیابی میشود، با این حال، در همان زمان، کنترلها منعکس میشوند - اگر انگشت شما به سمت چپ حرکت کند، مداد به سمت راست میکشد. شما همچنین می توانید قلبی را بردارید که به شما اجازه می دهد یک بار به مانعی برخورد کنید و زنده بمانید. هرچه بیشتر مداد را بدون بلند کردن انگشت خود حرکت دهید، ترکیب شما بالاتر می رود، به این معنی که امتیازها را سریعتر جمع می کنید.
![در ابتدا ... - 4 وجود داشت]()
سرعت بازی نیز به تدریج افزایش می یابد. تنها چیزی که از دست می دهد پرندگان خشمگین هستند. در ابتدا قصد داشتیم نام بازی را کاران داش بگذاریم (ترجمه کلمه روسی مداد کارداش - ها! فهمیدی؟) اما بعداً نظرمان تغییر کرد و به Pencil Dash بسنده کردیم. ما این کار را انجام دادیم زیرا این جناس برازنده فقط برای مخاطبان روسی زبان قابل درک است. ما این بازی را چند روز پیش منتشر کردیم و اکنون در حال تبلیغ آن هستیم. اینجا هم هیچکس در تیم تجربه ای ندارد. ما تمام دانش خود را در مورد تبلیغ بازی از مقالات مختلف به دست آوردیم. ما اطلاعات بازی را در وب سایت ها/ انجمن های مختلف به صورت رایگان منتشر کردیم. کانال های پولی ما شامل تبلیغات در 4pd، تبلیغات با یک وبلاگ نویس، چندین پست در گروه های عمومی در VKontakte و تبلیغات AdMob بود. ضمنا، این پست نیز بخشی از تبلیغات ما است، بنابراین با اجازه مدیریت وب سایت، لینک بازی را در اینجا قرار می دهم. می توانید بازی را در گوگل پلی
اینجا
پیدا کنید . اگر آن را نصب کنید سپاسگزار خواهم بود (شاید خوشتان بیاید!)، و اگر رتبه ای بگذارید، قول می دهم اسم فرزندتان را بگذارم! :)
![در ابتدا ... - 6 وجود داشت]()
GO TO FULL VERSION