חיפוש
  • יניב אור

משחק דו-מימד - platformer - ב-Godot

עודכן ב: 14 אוק 2019

התחלתי לבנות משחק 2D - סגנון platformer. יש מספר אפשרויות מבחינת מנועי משחק - בחרתי בתוכנה Godot, אותה התחלתי ללמוד בימים האחרונים. שפת התכנות המובנית, GDscript מאוד דומה לפייתון עם כמה שינויים.


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


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


ה-repo נמצא כאן: https://github.com/YanivOr/x-rover


בינתיים יש לנו tiles, כלי רכב ורקע:


חתכתי בעזרת Gimp את כלי הרכב לחלקים - גלגלים, מתלים, פנס, אגזוז ואת מכונת הירייה.

ב-Godot פתחתי scene בשם vehicle שיטפל אך ורק בכלי רכב והוספתי את כל חלקי הרכב ל-scene הזה. הגדרתי אנימציה לגלגלים.



קיצרתי את משך האנימציה לחצי שניה והוספתי תנועה מעלה-מטה לגוף הרכב - אפקט של נסיעה בשטח.


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

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

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



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



עדכון 29/09/19

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


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

_physics_process

ובסקריפט של המצלמה בפונקציה:

_process


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


דבר שני, זיהוי הרצפה. לפני התיקון שמיד אפרט עליו, השתמשתי ב-is_on_floor. הבעיה היא שהרכב קופץ בגלל המהמורות. כל קפיצה קטנה כזאת גורמת ל-is_on_floor להחזיר false והעניין גורם לבעיות. הקפיצה, למשל, שמתרחשת כאשר לוחצים על חץ למעלה - מתבצעת אך ורק אם is_on_floor הוא true.


החלפתי לשימוש באובייקט מסוג RayCast2D (מעין חיישן מרחק) וכך אפשר להגדיר מרחק מסויים מהרצפה שגורם ל-is_colliding להחזיר true למרות שהאוביקט לא על הרצפה בצורה מוחלטת.


***


מעבר לתיקונים הנ"ל, הוספתי אפשרות לירות כדורים מהמכונת ירייה והוספתי גם עשן שיוצא מהאגזוז:


עדכון 3/10/19

כשתכנתתי את הכדורים ואת פעולת הירי - כתוצאה מפזיזות ומחוסר ידע - כתבתי את זה לא כל כך טוב. השתמשתי ב-AnimationPlayer והוספתי אנימציה, shoot, כך שב-keyframe הראשון הכדור ממוקם בקצה הקנה וב-keyframe האחרון מיקמתי אותו 3000 פיקסלים ימינה או שמאלה, בהתאם לכיוון הירי. כלומר מדובר ב-instance אחד, וכל עוד מקש הרווח לחוץ האנימציה מתבצעת שוב ושוב ומתקבלת אשליה של צרור כדורים. ראה סרטון למעלה.


מה שעשיתי זה לבטל את ה-AnimationPlayer ובמקומו אני מייצר instance-ים של הכדור בצורה דינאמית (בקוד שמטפל בלחיצה על מקש הרווח). כמו כן, שיניתי את סוג ה-Node של הכדור ל-RigidBody2D שגורם לאובייקט להיות מושפע ע"י גורמים פיסיקליים. שיניתי טיפה גם את המראה של הכדור.


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


התחלתי לעבוד על ה-Level הראשון וזה נראה ומרגיש לא רע בכלל. ה-tiles הסגולים היו יפים אבל יחד עם הסגול של ה-Rover זה לא נראה כל כך טוב אז שיניתי להם את הצבע. אגב, אפשר בקלות לשנות את ה-Tiles ולעדכן את הקבצים כך שה-tilemap יתעדכן מיידית ללא צורך בכתיבה מחדש של ה-Level


עדכון 10/10/19

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


עדכון 14/10/19

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




עדכונים נוספים בקרוב...


© 2023 by DO IT YOURSELF. Proudly created with Wix.com