תכנות לילדים באמצעות Game Maker/משחק מרובה משתתפים/מימוש המשחק

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


הוא אחראי על ערכים של הכדור. העבד פשוט מושך את הכדור בעמדה הנכונה בכל שלב. איך אפשר לשים את זה לתוך העבודה? קודם כל, מחבט הראשי (שהוא שמאל אחד) צריכה להיות נשלטת על ידי המורה בלבד. משמעות הדבר היא כי למעלה ולמטה במקלדת החץ אירועים מלאה זה אנחנו צריכים לוודא כי העמדה היחידה שינויים אם אנחנו הורים. אז את הקוד של המפתח על החץ למעלה יכול להיות משהו כמו: (if (!) Global.master יציאה: אם (y> 104) y -= 6; mplay_data_write (1, y);) עבור המחבט עבדים אנו כותבים חתיכת דומים של קוד. עכשיו הן הבסיס ואת העבד חייב לוודא שהם במקום מחבט של אחרים במיקום הנכון. אנו עושים זאת בשלב אפילו. אם אנחנו עבדים, במקרה צעד של המחבט הורים עלינו להגדיר את המיקום. אז כאן אנו משתמשים את הקוד הבא: (אם (global.master) יציאה: y = mplay_data_read (1);) בדומה לבת השפחה. לבסוף, על הכדור אנחנו קודם כל חייבים לוודא שהוא מקפץ סביב כאשר הוא יגיע הקירות ואת העטלפים. למעשה, רק בשביל האדון הזה חייב להיעשות. כדי להעביר את המיקום של הכדור לשפחה, להוסיף את הקוד הבא במקרה צעד: (אם (global.master) (mplay_data_write (3, x); mplay_data_write (4, y);) אחר (x = mplay_data_read (3 ): y = mplay_data_read (4);)) עם התקשורת זה הבסיסי נעשה. מה שנותר הוא להתחיל את הטיפול של המשחק, כבש את הנקודות, וכו 'שוב, כל זה נשאר הכי טהור תחת שליטה של המורה. אז המורה מחליט 8 כאשר מאבד שחקן, משנה את התוצאה (אשר אנו יכולים להשתמש במיקום נוספת לתקשר אותה לשפחה), ומאפשר להתחיל כדור חדש. אתה יכול לבדוק את pong1.gmk המשחק המצורף לפרטים. שים לב כי עם ערכת תקשורת תיאר, שני משחקים עדיין יכול להיות קצת לא מסונכרנת. זה בדרך כלל לא בעיה. ניתן למנוע זאת על ידי כך חפץ סינכרון המשתמשת ערכים מסוימים על מנת לוודא כי שני הצדדים של המשחק מוכנים לפני כל דבר הוא צייר על המסך. זו צריכה להיות בשימוש בטיפול אף כי זה עלול לגרום לבעיות, כמו הקיפאון שבו שני הצדדים מחכים השני. הביני שכאשר שחקן מצטרף משחק אחר את הערכים המשותפים השתנה הם לא שלח שחקן חדש (זה היה לוקח יותר מדי זמן). שינויים חדשים אז רק אחרי רגע נשלחות הנגן החדש. הודעות מנגנון התקשורת השני כי Game Maker תומך היא שליחה וקבלה של הודעות. שחקן יכול לשלוח הודעות אחד או את כל השחקנים האחרים. שחקנים יכולים לבדוק אם הודעות הגיעו ולפעול בהתאם. הודעות ניתן לשלוח במצב מובטח שבו אתה בטוח שהם יגיעו (אבל זה יכול להיות איטי) או במצב שאינו מובטח, וזה יותר מהר. אנחנו הראשונים להשתמש בהודעות להוסיף כמה אפקטים קוליים המשחק שלנו. אנחנו צריכים צליל כאשר הכדור פוגע במחבט, כאשר הכדור פוגע בקיר, וגם כאשר שחקן זוכה בנקודה. רק המורה יכול לזהות אירועים כאלה. אז האדון חייב להחליט כי קול חייב להיות שיחק. קל לעשות את זה במשחק שלו. זה יכול פשוט לשחק את הצליל. אבל הוא חייב גם לומר את העבד כדי להשמיע את הצליל. אנחנו יכולים להשתמש משותפת נתונים על זה אבל זה די מסובך. באמצעות הודעת קל. האדון פשוט שולחת הודעה העבד כדי להשמיע צליל. העבד מקשיב הודעות ומשחק את הצליל הנכון, כאשר ביקש לעשות כן. השגרה הודעות הבאים:  mplay_message_send (שחקן, id, ואל) מסר לשחקן מצוין (או מזהה או שם; שימוש 0 לשלוח את ההודעה לכל השחקנים). הזהות היא הודעת שלם מזהה וואל הוא הערך (או אמיתי או מחרוזת). ההודעה תישלח במצב הלא מובטחים.  mplay_message_send_guaranteed (שחקן, id, ואל) מסר לשחקן מצוין (או מזהה או שם; שימוש 0 לשלוח את ההודעה לכל השחקנים). הזהות היא הודעת שלם מזהה וואל הוא הערך (או אמיתי או מחרוזת). זה מובטח לשלוח.  mplay_message_receive (שחקן) מקבל את ההודעה הבאה מהתור את ההודעה כי בא השחקן המצוין (או מזהה או שם). השתמש ב 0 הודעות מכל נגן. חוזר לשגרה אם אכן היה הודעה חדשה. אם כך אתה יכול להשתמש בשגרות הבאות כדי לקבל את תוכנו:  mplay_message_id () מחזירה את המזהה של ההודעה שהתקבלה לאחרונה.  mplay_message_value () מחזירה את הערך של המסר שקיבל לאחרונה.  mplay_message_player () מחזירה את השחקן ששלח את ההודעה קיבל לאחרונה. 9  mplay_message_name () מחזירה את השם של השחקן אשר שלח את ההודעה קיבל לאחרונה.  mplay_message_count (שחקן) מחזירה את מספר ההודעות שמאל בתור מהנגן (0 משתמשים כדי לספור את כל ההודעה). כמה הערות יש מקום כאן. קודם כל, אם אתם רוצים לשלוח הודעה לשחקן מסוים בלבד, יהיה עליך להכיר את השחקנים מזהה ייחודי. כפי שצוין קודם לכן אתה יכול לקבל את זה עם הפונקציה mplay_player_id (). מזהה זה השחקן משמש גם בעת קבלת הודעות מכל שחקן מסוים. לחלופין, תוכל לתת את השם של השחקן כמחרוזת. אם מספר שחקנים בעלי שם זהה, רק הראשון יקבל את ההודעה. שנית, אתם יכולים לתהות מדוע כל הודעה יש מזהה שלם. הסיבה היא כי זה עוזר הבקשה לשלוח סוגים שונים של הודעות. המקבל יכול לבדוק את סוג ההודעה באמצעות זיהוי לנקוט בפעולות המתאימות. (כי הודעות אינן מובטחות להגיע, שליחת זיהוי ערך הודעות שונות יכול לגרום לבעיות חמורות.) עבור משחק של צלילים שאנחנו עושים את הגישה הבאה. כאשר הורים קבעו כי הכדור פוגע במחבט זה מבצע את פיסת הקוד הבאה: (if (! Global.master) היציאה; sound_play (sound_bat); / / לשחק mplay_message_send עצמך צליל (0100, sound_bat); / / לשלוח אותו לשפחה) מטרת בקר במקרה צעד, מבצע את הפעולות הבאות: (בזמן (mplay_message_receive (0)) (אם (mplay_message_id () == 100) sound_play (mplay_message_value ());)) כלומר, הוא בודק אם יש הודעה ואם כן בדיקות כדי לראות מה הוא מזהה. אם זה 100 זה משחק קול מצוין ערך את ההודעה. עוד בכלל, אתה משחק בדרך כלל יש אובייקט בקר בחדרים שלך, במקרה צעד, עושה משהו כמו: (var מ, שם, messid, ואל; בזמן (mplay_message_player mplay_message_receive (0)) (מ = (); 10 שם = mplay_message_name (); messid = mplay_message_id (); ול = mplay_message_value (); אם (messid == 1) (/ / לעשות משהו אחר) אם (messid == 2) (/ / לעשות משהו אחר) / / וכו ' )) בזהירות בעיצוב פרוטוקול תקשורת המשמש (כלומר, המציין אילו הודעות שנשלחו על ידי מי ובאיזה רגעים, ואיך האחרים חייבים להגיב עליהם) הוא מאוד חשוב. ניסיון להסתכל דוגמאות של אחרים עוזר הרבה. המלח, חשבון נפש משחק פונג שתוארו לעיל יש בעיה רצינית. כאשר יש כפרי-up בתחום התקשורת את הכדור של העבד באופן זמני לעמוד בשקט. לא לתאם עמדות חדשות מגיעות, ולכן, הוא לא זז. בעיה זו מתרחשת בעיקר כאשר המרחק בין המחשבים הוא גדול ו / או התקשורת הוא איטי. כאשר משחקים לקבל מורכבים יותר, תצטרך ערכי יותר לתאר את המצב של המשחק. בעת שינוי המון ערכים בכל שלב, המון מידע חייב להיות מועבר. זה יכול לעלות הרבה זמן, להאט את המשחק למטה או עושה דברים עבור מסונכרנת. הדרך הראשונה לעשות את תקשורת הנתונים המשותפים קצת יותר מהר הוא לדרוש כבר לא מובטח תקשורת הנתונים. זו יכולה להיות מושגת על ידי שימוש בפונקציה:  mplay_data_mode (guar) קובע או לא להשתמש מובטחת העברת נתונים משותף. guar צריך גם להיות אמיתי (ברירת המחדל) או שקרית. שיטה טובה יותר להשתמש כדי לתקן בעיה זו נקראת חשבון נפש מת. כאן אנו שולחים מידע רק מפעם לפעם. בין המשחק עצמו ניחושים מה שקורה על סמך המידע שיש. אנו כעת להשתמש למשחק פונג שלנו. במקום לשלוח את מיקום הכדור בכל שלב אנו גם לשלוח מידע על כדורי המהירות והכיוון. עכשיו העבד יכול לעשות את רוב החישובים עצמו. כל עוד אין מידע חדש מגיע מן האדון, זה פשוט מחשב שבו נע הכדור. אנו מתחייבים לא להשתמש משותפים הנתונים במקרה זה. במקום זאת אנו משתמשים הודעות. אנו משתמשים מסרים המעידים על שינוי בעמדת הכדור, מהירות הכדור, עמדת המחבט, ועוד הורים שולח הודעות כאלה בכל פעם שמשהו משתנה. מטרת בקר ב העבד מקשיב הודעות אלה וקובע את הזכות 11 הפרמטרים. אבל אם העבד מקבל דבר זה עדיין מאפשר להעביר הכדור. אם הוא עושה טעות קטנה, מסר מאוחר יותר מן האדון לתקן את המיקום. כך למשל, במקרה צעד של הכדור אנחנו שמים את הקוד הבא: (if (! Global.master) היציאה; mplay_message_send (0,11, x); mplay_message_send (0,12, y); mplay_message_send (0,13 , מהירות); mplay_message_send (0,14, כיוון);) במקרה צעד של בקר אובייקט יש לנו את הקוד הבא: (messid var, val; בזמן (mplay_message_receive (0)) (messid = mplay_message_id (); ול = mplay_message_value (); / / בדוק שינויים המחבט אם (messid = = 1) bat_left.y = ול: אם (bat_right.y messid == 2) = ול: / / בדוק אם השינויים הכדור (object_ball.x messid == 11) = ול: אם (messid == 12) object_ball. y = ול: אם (messid == 13) object_ball.speed = ול: אם (messid == 14) object_ball.direction = ול: / / בדוק אם נשמע (messid == 100) sound_play (Val);)) שים לב שההודעות לא צריך להישלח במצב מובטח. אם אנחנו מתגעגעים אחד מפעם לפעם זה לא בעיה רצינית. אתה יכול למצוא את המשחק מותאם ב pong2.gmk את הקובץ. עכשיו אתה תהיה מאוכזב כאשר אתה מפעיל משחק pong2. יש עדיין שיהוקים. מה גורם האלה? הסיבה לכך היא העברת עלול להיות איטי. פירוש הדבר כי העבד יכול לקבל הודעות שנשלחו לפני כמה זמן. כתוצאה מכך יהיה לקבוע את מיקום הכדור קצת אחורה ואז, כאשר הוא מקבל את ההודעות החדשות, מגדיר אותה שוב קדימה. אז הרשו לנו לעשות לנסות השלישי, שבו תוכלו למצוא pong3.gmk את הקובץ. במקרה זה אנו חילופי מידע רק כאשר הכדור פוגע במחבט. אז את שארית כל תנועה נעשית באמצעות חשבון המתים. האדון אחראי למה שקורה בצד של העטלף של אדון ועבד הוא אחראי למה שקורה בצד השני. אמנם מעביר את הכדור מצד אחד אין הודעות אחרות הם החליפו יותר. 12 כפי שתראה הכדור נע בצורה חלקה עכשיו. רק כאשר הוא יגיע עטלף כפרי קצר את יכולה להתרחש או הכדור יכול להתחיל לזוז לפני שהוא מגיע העטלף יריבים. הסיבה היא כי מנגנון זה מבוסס על ההנחה כי בשני המשחקים לרוץ במהירות בדיוק. אם אחד המחשבים הוא איטי זה עלול לגרום לבעיה. אבל כפרי, אל עטלף הוא הרבה יותר מקובל מאשר כפרי-up במהלך תנועה. כדי להימנע מסוג זה האחרון של הבעיה אתה צריך מנגנונים מתקדמים יותר. לדוגמה, אתה יכול לשלוח מידע עיתוי כזה כל צד יודע כמה מהר המשחק פועל במחשב השני, והוא יכול לבצע תיקונים בהתאם. יש לקוות, עכשיו אתה מבין כמה קשה הסינכרון. אפשר גם להתחיל להעריך כמה משחקים מסחריים להשיג זאת. הם צריכים להתמודד עם אותן בעיות בדיוק. צ 'אט תוכנית לקבלת הדגמה השני שלנו אנחנו עושים שיחה קטנה בתוכנית. כאן אנו מאפשרים מספר שרירותי של שחקנים. כמו כן נאפשר עבור פגישות מרובות ולתת לשחקן את הבחירה לבחור ישיבה מסוים. נשתמש הודעות עם מחרוזות לשלוח את הטקסט המודפס סביב. אנו משתמשים במנגנון מעט יותר מסובך לעשות את החיבור. החדר הראשון עכשיו יש ארבע אפשרויות עבור ארבעה סוגים שונים של קשרים. אבל הוא לא עושה את החיבורים. במקום זה רק ממלא connecttype משתנה גלובלי. בחדר השני שחקן יכול שוב לבחור אם ליצור משחק (או בעצם chatbox) או להצטרף לאחת. רק עכשיו הוא החיבור אותחל. תלוי אם השחקן יוצר או מצטרף למשחק כמה שאלות מתבקשות. לאחר החיבור נעשה בהצלחה, הפגישה נוצר או הצטרפו. הפעם השחקן הוא ביקש שלו / שלה שם כזה שחקנים יכולים להיות מזוהים. הצטרף חלק הוא קצת יותר מסובך הפעם. אנו בונים תפריט של כל מושב שונה תאריך שממנו השחקן יכול לבחור אחת. בדרך כלל, כאשר המשחק שיצר את הפגישה מסתיימת, הפגישה מסתיימת. לשיחה תוכנית זו היא כנראה לא מה שאתה רוצה. שאר השחקנים צריכים להיות מסוגלים להמשיך לפטפט. זו ניתן לשנות באמצעות הפונקציה:  mplay_session_mode (להעביר) קובע או לא להעביר את המארח הפעלה למחשב אחר, כאשר המארח את הקצוות. המהלך אמור להיות או אמת או שקר (ברירת המחדל). מנגנון שלם של שני החדרים הראשונים אתה בטח רוצה חוזר על המשחקים שלך כי זה בדרך כלל ברובו זהה. אחרי זה אנחנו עוברים לחדר chatbox. יש רק אחד בקר האובייקט עושה את כל העבודה כאן. אני לא אסביר את הפרטים לתת את סוג המשתמש של שורות טקסט ולהציג את הזוג האחרון של קווים. זה הכל לשים כמה סקריפטים שאתה יכול לעשות שימוש חוזר, אם אתה רוצה. זה הכל פשוט למדי (כאשר אתה יודע איך לתכנת ב GML). החלק היחיד שהוא עדיין מעניין הוא שבכל פעם לוחץ השחקן על מקש Enter, קו מודפס הוא לשלוח את כל השחקנים האחרים, עם שם השחקנים מול זה. גם כאשר שחקן מצטרף או עוזב, הוא שולח הודעה לכל השחקנים האחרים מצביע על מה שהוא עשה. 13 תראו chat.gmk את הקובץ לקבלת פרטים. מסקנה מתקנים מרובי ב Game Maker מאפשרת ליצור משחקים מרובי מפואר. פונקציות כי רק לעזור לך עם התקשורת ברמה נמוכה. אתה עצמך צריך לתכנן את המנגנון המשמש לתקשורת. זהו תהליך זהיר. זה צריך להיות מתוכנן בעת עיצוב המשחק. קשה מאוד להוסיף מרובי יעיל אחר. להלן כמה הנחיות העולמי:

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