אתגרים בפיתוח משחקים לגיים בוי קולור

2026-02-27 - פרויקט, פיתוח משחקים

מתחילת חודש פברואר עבדתי על משחק לגיים ג'אם הארוג'אם. ולא סתם משחק, אלא משחק לגיים בוי קולור - קונסולת משחקים ניידת שיצאה ב1998 שהיא מעין הרחבה שלא ממש שונה יותר מדי מהגיים בוי, שיצא ב1989!

הגיים בוי קולור היא קונסולה מאוד מוגבלת מבחינת החומרה. יש לה מעבד 8bit שעובד בתדר של 4.2 או 8.4 מגה הרץ (לבחירתכם), 32kb ראם ו- 16kb וידאו ראם, מסך קטן ברזולוציה של 160x144 פיקסלים, ותמיכה של עד 56 צבעים בו זמנית!

זו הייתה קונסולה סופר פופולרית בזמנה שהולידה את אחד הפרנצ'ייזים המצליחים ביותר בכל הזמנים (פוקימון).

שני דברים גרמו לי לרצות לבנות משחק ל-gbc - הראשון, האסתטיקה והפשטות היחסית של החומרה, והשני, כי רציתי לבנות משחק שירוץ על הקונסולת משחקי רטרו שלי.

הצלחה!

הפוסט הזה מתרכז העיקר באתגרים שבבניית משחק לגיים בוי קולור ב2026 (ובכל זמן בעצם, כי הרבה מגיע ממגבלות החומרה). אז בואו נראה איך המשחק היחסית פשוט שהכנתי היה למעשה מורכב יותר מתחת לפני השטח.

האתגרים

שפה ומודל תכנותי

יש כרגע שלוש דרכים עיקריות לפתח משחקים לגיים בוי ולהן רמות שונות של אבסטרקציה: באסמבלי עם RGBDS, בסי עם GBDK, או עם מנוע בשם GB Studio.

אני בחרתי באופציה השניה עם GBDK כדי שאוכל לעבוד עם שפה שאני מכיר ושבכל זאת תהיה לי מספיק שליטה על מה שאני עושה.

למרות שסי היא שפה עילית ויש לה מודל משל עצמה לאיך תוכניות בנויות, המעבד של הגיים בוי מתבסס על טכנולוגיה מאוווד ישנה ולא נבנה כדי לתמוך בקונבנציות של סי כמו שימוש במחסנית בצורה אופטימלית ולכן שימוש במחסנית הוא לא כל כך מהיר. מה זה אומר?

  • קריאה לפונקציות הוא דבר יחסית איטי, כי כל קריאה עושה מניפולציה על המחסנית
  • שימוש במשתנים לוקאליים יחסית איטי
  • העברת משתנים לפונקציה יחסית איטי

שזה דיי ברדק כי זה הלחם והחמאה בסי ובכל שפת תכנות עילית בעצם. אז מה עושים?

  • השתמשתי במשתנים גלובליים בכל מקום
  • דאגתי שהפונקציות שאני מגדיר ונקראות הרבה יהיו inlined (עם המילה השמורה inline), כלומר הקומפיילר יעשה קופי פייסט לקוד לתוך איזור הקריאה במקום ליצור פונקציה ולקרוא לה
  • אף פונקציה לא מקבלת או מחזירה ערכים - הכל נעשה דרך משתנים גלובליים

תכנות במודל הזה קצת יותר קרוב לתכנות באסמבלי ולא צריך לשלם כביכול על דברים "בלתי נראים" מבחינת ביצועים.

לדוגמא היה לי מערך גלובלי שמחזיק עלים ומשתנה גלובלי שהיה מצביע לעלה אחד, ובמהלך לולאה הייתי משנה את המצביע וקורא לפונקציה inline שמעדכנת את מצב העלה עליו המשתנה הגלובלי היה מצביע. ככה לא הייתי צריך להגדיר משתנים מקומיים או לקרוא לפונקציה ולחזור ממנה עבור כל עלה בכל פריים במשחק, ויש 60 כאלה בשניה!

גרפיקה

אנימציה של דבורה ב-Pixelorama

החומרה של הגיים בוי קולור מאוד מוגבלת מבחינת גרפיקה. אי אפשר ממש לצייר למסך פיקסל פיקסל או לייבא תמונות בקלות. הנה כמה תכונות ומגבלות:

  • היחידה הגרפית הבסיסית היא הספרייט, וגודלה הוא 8x8 פיקסלים
  • הדבורה היא בגודל 16x16 ומורכבת מ4 ספרייטים. ביחד הם נקראים "מטאספרייט"
  • יש מקום ל-50 ספרייטים בו"ז על המסך, ו-10 בלבד בכל שורה
  • בגיים בוי קולור, לכל ספרייט יכולה להיות פלטת צבעים המורכבת מ3 צבעים (+1 שקוף)
  • יש מקום ל8 פלטות צבעים בו"ז
  • יש 3 שכבות גרפיות - רקע, ספרייטים, וחלון
  • הרקע מורכב גם הוא מיחידות של 8x8 שנקראות אריחים. בכל רגע אפשר לראות 20x18 אריחים, ואפשר להגדיר ברקע 32x32 בו"ז. לכל אריח 4 צבעים
  • כדי שספרייט או אריח יופיע על המסך צריך לשים אותו במקום ספציפי בזכרון ולעקוב איפה הוא נמצא כדי להתאים לו פלטת צבעים נכונה ולמקם אותו נכון במסך

זה הרבה מידע, אבל זה מידע הכרחי ולא טריוויאלי לעבוד איתו כשמפתחים לגיים בוי. הרבה מהבאגים צצו אצלי בגלל שלא שלטתי בכל הנתונים האלה בדיוק.

כדי ליצור ולצבוע ספרייטים ורקעים, השתמשתי בתוכנה בשם Pixelorama שנותנת גם לעבוד עם אריחים וגם ליצור אנימציה ולייצא ל "sprite sheet". לאחר מכן השתמשתי בתוכנה שבאה עם gbdk בשם png2asset כדי להמיר את התמונות לקבצי C.

בעיה אחת שצצה אצלי היא שצריך ממש לשים לב לא ליצור אריחים עם יותר מ4 צבעים, ולדאוג שלא יהיו יותר מ8 פלטות בכל הקובץ.

אתגר נוסף משמעותי ויפה הוא העובדה שרק 32x32 אריחים של רקע יכולים להיות בזכרון בו"ז, ואם המפה יותר גדולה מהכמות הזו, צריך לעשות load בצורה דינמית לאריחים תוך כדי שהמשחק רץ ולהחליף אריחים קיימים כשהם לא בפריים. זה נראה כך:

שורות מתחלפות בצורה דינמית כשהן מחוץ לפריים

יש עוד כל מני אתגרים. אבל לא אחפור עוד בנושא הזה.

מוזיקה

לגיים בוי 4 ערוצי אודיו שמייצרים אותות דיגיטליים ספציפיים לפי הקוד שהם מקבלים. בגדול שלושה מהם מייצרים צלילים טונאליים רגילים, ואחד מייצר "רעש" שהשימוש העיקרי שלו הוא צלילי תופים וכדומה.

כל ערוץ יכול ליצור תו אחד, אז מקסימום 4 תווים במקביל.

מוזיקה כזאת לא יוצרים עם גיטרה ומיקרופון, אלא באמצעות תוכנה בשם tracker. במקרה שלי, hUGETracker שמותאם לגיים בוי. אחרי שיוצרים את מוזיקה, אפשר באמצעות התוכנה לייצא אותה לקבצי C ולכלול אותם בתוך הפרויקט.

שיר הסיום ב-hUGETracker

הרבה מהלמידה היה ניסיון להבין איך למדל סאונדים סבירים ולהתחבר לממשק השונה. אחר כך זה לנסות להלחין על גיטרה ומקלדת שליטה ולתרגם את הצלילים לקליקים במקומות הנכונים על התוכנה.

התוצאה

את המשחק לגיים בוי קולור שבניתי, "דבש ודובדבן", אתם יכולים להוריד בעמוד הזה, ודרכו אפשר גם לשחק במשחק ישירות בדפדפן בלי להוריד את המשחק באמצעות אמולטור וובי בשם binjgb.

בכנות, כן הופתעתי מכמות החיכוכים שנתקלתי בהם וכמות האתגרים שהייתי צריך להתמודד איתם, אבל כן למדתי הרבה, נהנתי מהתהליך ואני מאוד מרוצה מהתוצאה.

אם אתם גם רוצים לתכנת לגיים בוי קולור אבל אתם פחות הארדקור ממני, יכול להיות שתרצו לנסות להשתמש ב-GB Studio. אם אתם יותר הארדקור ממני, כנראה שתרצו לנסות את RGBDS, אבל אם אתם בדיוק הארדקור כמוני, נסו את GBDK. ואם תרצו תשלחו לי מייל או תגובה אם אתם מתעניינים בנושא ורוצים לדעת עוד!

קישורים נוספים

לסיום, אשאיר כמה קישורים נוספים למדריך ודברים שעזרו לי במהלך הדרך. חלק כבר קישרתי, וחלק לא:

> gbdev.io
אתר מקיף על פיתוח משחקים לגיים בוי
> RGBDS
פיתוח באסמבלי
> GBDK
פיתוח ב-C
> GB Studio
פיתוח בעזרת מנוע
> Larold's Retro Gameyard
אתר עם הרבה מדריכים טובים
> GameBoy Graphics Explained
כמה סרטונים ממש טובים על גרפיקה בגיים בוי וטכניקות שונות. שווה צפייה!
> hUGETracker
תוכנת tracker ליצירת מוזיקה לגיים בוי
> Pixelorama
תוכנה לציור פיקסל ארט, מפות ואנימציה

רוצים להגיב? בדקו מהי שאלת הסינון בעמוד הראשי.