بررسی بقیه کدهای بازی آردوینو
برای کنترل علامت ضربدر ما از تابع های helper زیر استفاده می کنیم:
void move_crosshairs() {
if (left) chx -= chvx;
if (right) chx += chvx;
if (up) chy -= chvy;
if (down) chy += chvy;
if (chx <= CH_LEN)
chx = CH_LEN + 1;
if (chx >= WIDTH - CH_LEN)
chx = WIDTH - CH_LEN - 1;
if (chy <= CH_LEN)
chy = CH_LEN + 1;
if (chy >= HEIGHT - CH_LEN)
chy = HEIGHT - CH_LEN - 1;
}
void draw_crosshairs() {
tv.draw_row(chy, chx - CH_LEN, chx - 1, WHITE);
tv.draw_row(chy, chx + 1, chx + CH_LEN, WHITE);
tv.draw_column(chx, chy - CH_LEN, chy - 1, WHITE);
tv.draw_column(chx, chy + 1, chy + CH_LEN, WHITE);
}
آدرس:
Tinkering/Pragduino/Pragduino.ino
متد move_crosshairs تمام متغیرهای سراسری(global) که به حالت فعلی Nunchuk مربوط می شوند را بررسی می کند. این متد بسته به مقادیر متغیر مذکور، موقعیت علامت ضربدر را آپدیت می کند. سپس اطمینان حاصل می کند که علامت ضربدر در داخل مرزهای صفحه ی نمایش باقی بماند. تابع draw_crosshairs علامت ضربدر را در صفحه ی نمایش ترسیم می کند. ما به جای استفاده از یک bitmap برای رسم علامت ضربدر، از دو متد جدید کتابخانه ی TVout استفاده می کنیم. متد draw_row یک خط افقی را در خروجی نشان می دهد و ما از آن برای نشان دادن دو خط افقی ضربدر در خروجی استفاده می کنیم. به طور مشابه، ما از متد draw_column برای رسم دو خط عمودی استفاده می کنیم. ما در نقطه ی برخورد، یک پیکسل را خالی می گذاریم تا علامت ضربدر ما جالب تر شود.
ممکن است تصور کنید که چرا ما از یک bitmap استفاده نمی کنیم؛ مشکل تصاویر bitmap این است که وقتی که روی یکدیگر می افتند، خوب به نظر نمی رسند.حتی اگر تصویر bitmap همانند علامت ضربدر باشد، هنوز هم به شکل یک مربع به نظر خواهد رسید. اگر ما یک علامت ضربدر بیت مپ(bitmap) را بر روی یک دایره ببریم، تصویر بیت مپ، بخش بزرگی از پیکسل های دایره را محو می کند. برای کامل کردن سورس کد بازی، ما به دو تابع برای مدیریت دایره ها نیاز داریم:
bool target_hit() {
if (z_button)
return (target_x - chx) * (target_x - chx) +
(target_y - chy) * (target_y - chy) < target_r * target_r;
return false;
}
void check_target() {
if (target_hit()) {
hits++;
create_target();
}
int remaining_time = millis() - target_creation;
if (remaining_time >= TARGET_LIFESPAN) {
create_target();
}
int w = map(TARGET_LIFESPAN - remaining_time, 0, TARGET_LIFESPAN, 0, WIDTH);
tv.draw_rect(0, 0, w, 3, WHITE, WHITE);
}
آدرس:
Tinkering/Pragduino/Pragduino.ino
متد target_hit بررسی می کند که آیا بازیکن به دایره ی فعلی ضربه زده است یا نه. این کار تنها زمانی انجام می شود که بازیکن دکمه ی Z را فشار دهد. برای این کار، ما از یک سری محاسبات فاصله ای استفاده می کنیم تا ببینیم که علامت ضربدر چه زمانی در داخل دایره ی مورد نظر قرار می گیرد. برای مدیریت چرخه ی حیات(lifecycle) دایره ی فعلی، ما از متد check_target استفاده می کنیم. اگر دایره ضربه دیده باشد، ما شمارشگر ضربه(hits counter) را افزایش می دهیم و دایره ی بعدی را ایجاد می کنیم. پس از آن، ما زمانی را که دایره ی فعلی قرار است در صفحه باقی بماند، بدون اینکه ضربه بخورد، را محاسبه می کنیم. اگر این زمان، بیشتر از طول عمر(lifespan) دایره باشد، ما یک دایره ی جدید را ایجاد می کنیم. در انتهای این تابع، ما زمان باقی مانده(remaining time) را در داخل یک نوار وضعیت(status bar) در بالای صفحه نشان می دهیم.
ما با نوشتن کمتر از 200 خط کد، یک بازی کامل را برای کنسول بازی ویدئویی جدید خود ایجاد کردیم. این بازی، قطعا یک بازی مهم قابل فروش نیست، بلکه فقط یک سرگرمی است و یک فرصت بزرگ برای یادگیری پایه های بسیار اساسی برنامه نویسی بازی است. همچنین به ما اعتماد به نفس زیادی می دهد تا بازی های پیش رفته تری بسازیم. در داخل وب می توانید بازی های ساده ی زیادی پیدا کنید که تقریبا از همین سخت افزارهایی که در این فصل استفاده کردیم، استفاده می کنند. همچنین می توانید این لینک را مشاهده کنید.
اگر کدها درست کار نکردند چه کنیم؟
از دید یک سازنده، این فصل یک فصل ساده است. و هنوز هم ممکن است در کدها اشتباه ایجاد شود، به خصوص در هنگام نوشتن.مطمئن شوید که در آردوینو و دسته ی Nunchuk به پین های صحیح متصل شده باشید. همچنین بررسی کنید که سیم ها محکم به دسته ی Nunchuk و سوکت های آردونیو متصل شده باشند. اگر شک دارید، از یک سیم با قطر بزرگتر استفاده کنید. همچنین بخش "اگر کدها کار نکرد چه کنیم؟" را در آخرین مقاله ی فصل قبل، مشاهده کنید تا تمام چیزهایی که به هنگام تولید سیگنال ویدئو در آردوینو ممکن است اشتباه باشند را مشاهده و بررسی کنید.
تمرین های آخر فصل
1. بازی ای که ما در فصل 7 توسعه دادیم را بازنویسی کنید و یک بازی برای کنترلر بازی حسگر حرکت در صفحه 11 بنویسید، تا از کنترلر Nunchuk پشتیبانی کند. این بازی باید از اهرمک آنالوگ(analog stick) و شتاب سنج پشتیبانی کند. شاید بتوانید با استفاده از دکمه های دسته ی Nunchuk بین آنها سوئیچ کنید.
2. سرهم بندی کردن چیزها با Nintendo’s Wii Motion پیچیده تر است. اما جالب است و یک راه ارزان برای افزایش مهارت های سرهم بندی کردن شما است. برای اطلاعات بیشتر به این لینک مراجعه کنید.
3. کتابخانه ی TVout کمی از صوت(audio) پشتیبانی می کند. یک زنگ اخبار پیزو(piezo buzzer) را به پین دیجیتال 11 متصل کنید و از توابع tone و noTone برای اضافه کردن قابلیت های صدا به کنسول بازی ویدئویی استفاده کنید. همچنین چند افکت صدا را به بازیPragduino اضافه کنید.
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.