תכנות לילדים באמצעות Game Maker/פק-מן/צעד 3: תנועה במבוך

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


מבט מקרוב על המבוך[עריכה]

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

Pacman maze.png

Gmaker grid.png

בהרבה משחקים התנועה של האובייקטים מוגבלת לרשת כזו. לרשת נהוג לקרוא grid (גְרִיד) - שריג. למרבה המזל, ל-Game Maker יש פעולות מיוחדות בשביל לתכנת תנועה בשריג.

תנועה בשריג[עריכה]

כרגע פקמן יכול לפנות בכל נקודה וככה הוא "דורך" על הקוים של השריג. אפשר לגרום לו להתייצב בדיוק במשבצת של השריג באמצעות פעולת היישור לשריג שנמצאת בלשונית move Gmaker align button.png.

Gmaker align dialog.png

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

כדאי לדעת:

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

Gmaker test save.png כשפקמן מסתובב, הוא קופץ למשבצות השריג וככה הוא נע רק בין קוי השריג.




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

פעולות תנאי[עריכה]

הבדיקה אם פקמן מיושר לשריג נעשית באמצעות פעולה מיוחדת, שנמצאת בלשונית control ונקראת בדיקת יישור לשריג: Gmaker if grid button.png.

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

כדאי לדעת:

Gmaker if actions.png

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

Gmaker if grid dialog.png

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

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

אבל רגע! מה עם פעולת שינוי הדמות? גם אותה צריך לבצע רק אם פקמן מיושר לשריג!

בלוק[עריכה]

כשרוצים שפעולת תנאי תקבע אם יתבצעו כמה פעולות, אפשר לצרף את כל הפעולות האלה לגוש אחד, שנקרא block (בְּלוֹק). Game Maker מתייחס לכל הבלוק כאל פעולה אחת.

Gmaker block.png

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

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

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

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

Gmaker room grid.png



Gmaker test save.png עכשיו פקמן לא קופץ ולא פונה כשהוא לא מיושר לשריג בדיוק. אבל איך אפשר לדייק וללחוץ בדיוק ברגע שהוא מיושר???




שינוי ארוע[עריכה]

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

אבל הארוע של הקשה על חץ לא מתאים לזה - הוא קורה רק כשהמשתמש מתחיל ללחוץ על החץ. צריך להחליף אותו בארוע של מקש חץ לחוץ - הארוע שקורה שוב ושוב כל עוד המשתמש ממשיך ללחוץ על החץ. Gmaker key.png

למרבה המזל, אין צורך ליצור ארוע חדש, להעתיק אליו את כל הפעולות מהארוע של הקשה על חץ, ואז למחוק את הארוע הישן. במקום כל התהליך הארוך הזה, Game Maker מאפשר לנו לשנות את הארוע בלי לאבד את הפעולות שלו. בשביל לשנות את ארועי ההקשה על החצים, צריך:

  1. ברשימת הארועים של האובייקט, להקליק על אחד מארועי החצים כדי לבחור אותו.
  2. מתחת לרשימת הארועים יש שלושה כפתורים; ללחוץ על הכפתור Change (צֵ'יינְג') - שנה.
  3. מופיע חלון סוגי הארועים. כאן צריך לבחור בארוע החדש - ארוע מקש לחוץ. Gmaker key.png
  4. בתפריט שצץ, לבחור את המקש המתאים. (אותו המקש של הארוע הישן)

את שינוי הארוע צריך לעשות לכל ארבעת ארועי החצים.


Gmaker test save.png יותר קל לסובב את פקמן עכשיו. אבל האם הוא תמיד מסתובב כשצריך? או שהוא עובר כמה משבצות בשריג עד שהוא מסתובב?




צעדים[עריכה]

עכשיו תורכם:

לשנות את מהירות התנועה של פקמן, אותה המהירות שקבעתם בארוע היצירה שלו באמצעות המשתנה move_speed (מוּב סְפִּיד) - מהירות תנועה.

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

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

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


מה זה צעד?

כמו שאנחנו מתקדמים צעד-צעד, ככה גם המשחק מתקדם כל פעם צעד אחד. בכל צעד, Game Maker מזיז כל אובייקט בהתאם לכיוון ולמהירות שלו, בודק מי מתנגש במי, מעדכן את התת-תמונה בהנפשה של הדמויות המונפשות, ועושה את כל שאר הדברים שצריכים לקרות באותו רגע במשחק. אחר כך הוא מחכה קצת (ממש מעט - חלקיק שניה), ועובר לצעד הבא: מזיז שוב את האובייקטים ועושה את כל שאר הדברים.

Gmaker speed5.png

הצעדים של Game Maker הרבה יותר מהירים משלנו (30 צעדים בכל שניה!) וככה אנחנו לא מבחינים בהם אלא רואים תנועה רצופה של האובייקטים במשחק.

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

Gmaker grid5.png

אבל מה קורה כשפקמן נע במהירות 5? אז אחרי שני צעדים הוא יתקדם 10 פיקסלים, אחרי שלושה צעדים הוא יתקדם 15 פיקסלים, וכך הוא ימשיך הלאה. אחרי 6 צעדים הוא כבר יתקדם 30 פיקסלים, אבל בצעד הבא הוא כבר יגיע ל-35 פיקסלים - הוא יעבור את המקום המתאים לפנייה, מבלי להגיע אליו בדיוק! רק כשהוא יעבור חמש משבצות שריג - 160 פיקסלים - פקמן יגיע בדיוק למקום מתאים לפנייה.

זאת אומרת שבשביל שפקמן יוכל לפנות בשריג בגודל 32 פיקסלים, המהירות שלו צריכה להכנס מספר שלם של פעמים ב-32. למשל, 4 זה בדיוק 32/8 (32 לחלק ל-8), כלומר ב-8 צעדים של 4 פיקסלים פקמן עובר בדיוק 32 פיקסלים. לכן מהירות 4 מתאימה לתנועה בשריג בגודל 32 על 32 פיקסלים. עוד מהירויות שמתאימות הן 32/9, או 32/10, או 32/7, וכן הלאה. אפשר לכתוב אחד הביטויים האלה בתור הערך של move_speed, ואז Game Maker כבר יחשב בעצמו את התוצאה.


Gmaker test save.png כדאי לוודא שפקמן באמת מסתובב עכשיו כמו שצריך.




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

עדכון רשימת העבודה[עריכה]

אז עכשיו הרשימה שלנו נראית ככה:

  • פקמן
  • קירות המבוך
  • נקודות שפקמן אוכל
  • פירות
  • רוחות
  • כדורי כוח
  • (אולי) להאיץ את מהירות התנועה

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


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