מאמרים אחרונים
5 באוגוסט 2022סרטון זה מדגים כיצד לייצא את האנימציה או המשחק שבנינו כאפליקצית אנדרואיד המוכנה להעלאה ושיתוף בחנות גוגל Google Play Store או בכל חנות אחרת ברשת.
לפני תחילת העבודה יש להתקין את התוכנות:Android Studio – אשר תשמש אותנו לפתיחת האפליקציה ולייצור קובץ ה APK או ה AAB שאותו ניתן להעלות לחנות גוגלSceneMax3D – ניתן להוריד ולהתקין אותה פה באתר באיזור ההורדות. היא תשמש אותנו לכתיבת האנימציה של הדרקון המעופףכמו כן, על מנת להריץ ולבדוק את האפליקציה שהכנתם, יש להשתמש או בטלפון המחובר עם כבל USB למחשב ואשר האופציה usb debugging דלוקה בהגדרות שלו (ראה הוראות כאן) או להתקין תוכנת אמולטור שתדע להריץ את האפליקציה שלכם. ישנם אמולטורים בסביבת Android Studio עצמה או חיצוניים. אני ממליץ על NOXאם נתקלתם בבעיה כלשהי בבניית האנימציה או הרצתה, ניתן לשלוח שאלות בפורום השאלות ותשובות [...]
Read more...
7 בספטמבר 2020כשהמשחק שלנו מתחיל לגדול מבחינת כמות הקוד, מומלץ לחלק אותו למספר קבצים לדוגמא נניח שיש לנו משחק מכוניות פשוט שמכיל מסלול, מכונית ושעון זמן. הקוד יכול להיות משהו בסגנון הזה:
var time=60
track is a static track2
car is a gtr_nismo vehicle : pos (0,2,0)
camera.chase car : trailing=true
timer = {
time=time-1
sys.print "Time: "+time : pos (0,0,0) and font "yoshi"
if(time==0) {
sys.print "Game Over" : pos (300,300,0)
stop
}
}
run timer every 1 second
ניתן לראות שהתכנית מכילה מספר חלקים:
א. הגדרת משתנים
ב. טעינת מודלים של מסלול ומכונית
ג. פרוצדורה שמטפלת בשעון ומגבילה את המשחק ל 60 שניות
במקום לשים את כל הקוד הזה בקובץ אחד (קובץ main) אפשר לחלק אותו למספר קבצים לדוגמא: בואו נעביר את כל טעינת המודלים לקובץ נפרד –
ניצור קובץ חדש תחת התקיה של המשחק – נקרא לו load_game
נעביר לקובץ load_game את הפקודות שטוענות את המסלול והמכונית ואת מצלמת המעקב:
track is a static track2
car is a gtr_nismo vehicle : pos (0,2,0)
camera.chase car : trailing=true
ואז נחבר את הקובץ load_game לתכנית הראשית בקובץ main באמצעות הפקודה add code:
var time=60
add "load_game" code
timer = {
time=time-1
sys.print "Time: "+time : pos (0,0,0) and font "yoshi"
if(time==0) {
sys.print "Game Over" : pos (300,300,0)
stop
}
}
run timer every 1 second
כעת, כל קוד שקשור בטעינת משאבים למשחק יכול להיכתב ישירות בקובץ load_game
הדבר הבא שנרצה לעשות זה להעביר את כל אסטרטגיית ניהול זמן המשחק לקובץ נפרד –
ניצור קובץ חדש בשם game_timer תחת תקיית המשחק.
נעביר לתוכו את הפרוצדורה שמטפלת במדידת הזמן של המשחק:
timer = {
time=time-1
sys.print "Time: "+time : pos (0,0,0) and font "yoshi"
if(time==0) {
sys.print "Game Over" : pos (300,300,0)
stop
}
}
ואז נחבר אותו לתכנית הראשית בקובץ main:
var time=60
add "load_game" code
add "game_timer" code
run timer every 1 second
באופן הזה אנו מחלקים את התכנית לחלקים הגיוניים שקל יותר לתחזק אותם. שימו לב שישנה חשיבות למקום בו נשים את פקודת ה add code . הגיוני שטעינת המשאבים תהיה בהתחלה מפני שקטעי הקוד הבאים ישתמשו באותם משאבים וכך גם הוספנו את הקוד שמטפל בשעון המשחק לפני שקראנו לפקודה
run timer every 1 second
מפני שהפרוצדורה timer הוגדרה שם. [...]
Read more...
18 ביולי 2020מאת: אורי ברוסילובסקי
גרסה באנגלית: https://brusi.itch.io/alchemize/devlog/153703/alchemize-ai-algorithm
באוגוסט 2018 סתיו גולדשטיין ויקיר בונקר השתתפו בג’אם האינטרנטי Ludum Dare, בנושא Running Out of Space, במהלכו הם בנו את המשחק Alchemize.Alchemize הוא משחק לוח אסטרטגי לשני שחקנים, בסגנון משחקים כמו רברסי והקסגון. גם אני השתתפתי בג’אם באותה שנה, ויצא לי בשלב הדירוג לשחק ב-Alchemize. המשחק נראה מרשים וכיפי, וקיבלתי את הרושם שיש בו הרבה עומק, ובעיקר הופתעתי מהעובדה שמדובר במשחק עם חוקים חדשים לגמרי שהם פיתחו מאפס ב-72 השעות של הג’אם! אבל היתה רק בעיה אחת – זה היה משחק לשני שחקנים, ואני הייתי רק שחקן אחד.באותו רגע חשבתי לעצמי “לשחק נגד מחשב יכול היה להיות נחמד” והמשכתי בחיי…אבל כעבור שנה וחצי, אחרי ששוב השתתפנו בג’אם Ludum Dare (והפעם סתיו, יקיר ואני שיתפנו פעולה ובנינו משחק ביחד), שוב עלה הרעיון – מה עם Alchemize? לא חבל שרעיון כזה מגניב יהיה מוגבל רק לשני שחקנים על אותו המחשב?אז החלטנו לשתף פעולה פעם נוספת, ולהקים לתחיה את Alchemize. הפעם אני מאחורי כיסא המתכנת, כתבתי מחדש את קוד המשחק, בתוספת האפשרות לשחק נגד המחשב. כתיבת אינטליגנציה מלאכותית זאת משימה מעניינת ומאתגרת, ולמרות שיש דרכים מקובלות לגשת לבעיה, הפתרון שממומש בסוף תמיד שונה ומיוחד עבור כל משחק ומשחק.בפוסט הזה אספר איך יצרתי את שחקן המחשב של Alchemize. אפרט על האתגר ביצירת כזה שחקן, ועל הפתרונות שבחרתי כדי בדגש על אסטרטגיה, מהירות תגובה וחוויה חיובית לשחקן.
חוקי המשחק
אם עוד לא שיחקתם, אפשר לשחק אונליין כאן. אחרי שתקראו את ההוראות הקצרות ותשחקו דקה או שתיים, החוקים אמורים להיות ברורים. אבל בכל זאת אעבור על הבסיס:
השחקנים הם בצבעים אדום וכחול, וכל שחקן בתורו מניח שיקוי בצבע שלו.כאשר מניחים שיקוי, אז נוצרים קריסטלים בצבע של השחקן, בכל משבצת שנוגעת בשיקוי החדש שהונח וגם נוגעות גם בשיקוי בצבע של השחקן השני. בנוסף, כל משבצות שנוגעות גם בשיקוי החדש וגם בשיקוי קיים באותו הצבע, תושחר. אם משבצת מושחרת מכילה קריסטל, הקריסטל מושמד.המשחק נגמר כשהלוח מתמלא, והמטרה היא לאסוף כמה שיותר קריסטלים ולהביס את היריב.החוקים הבסיסיים האלה יצרו משחק מתוחכם ועמוק (ושאפו לסתיו ויקיר שהמציאו את המשחק הזה לגמרי מאפס בזמן הג’אם!). בכל תור, השחקן צריך לחשוב על השיקולים הבאים:האם השיקוי שלי ייצור קריסטלים?האם היריב יוכל לנצל את השיקוי שלי כדי ליצור קריסטלים בצבע שלו?האם אני יכול להשמיד קריסטלים של היריב?האם אני יכול לחסום את היריב מלהשמיד את הקריסטלים שלי?ואפשר להמשיך כמה עמוק שרוצים. למשל, מהלך טוב יכול להיות כזה שמכריח את האויב שלך להניח שיקוי שישמיד את הקריסטלים שלך, באופן שיאפשר לך ליצור קריסטלים חדשים מהשיקוי שלו, וכן הלאה. כל מי ששיחק משחק שחמט אחד או שניים בחייו מכיר את החשיבה האסטרטגית הזאת.
כתיבת שחקן המחשב
מבוא לאינטלגנציה מלאכותית למשחקי לוח
אז ניגשתי למלאכה של לכתוב שחקן מחשב שידע להתמודד עם העומק הזה. הבחירה הטבעית היתה להשתמש באלגוריתם מינימקס, האלגוריתם הסטנדרטי לסוג כזה של משחק לשני שחקנים. על רגל אחת, האלגוריתם בוחר את הצעד הבא על ידי כך שהוא מנסה להציץ לעתיד הקרוב של המשחק – עבור כל מהלך אפשרי, הוא לוקח בחשבון את כל התגובות האפשריות של היריב; עבור כל אחת הוא לוקח בחשבון את כל התגובות של השחקן, וכן הלאה. המהלך שיבחר יהיה זה שמבטיח את התוצאה הכי טובה עבור השחקן בהתחשב תגובה אידיאלית של היריב.עבור משחקים קצרים (כמו איקס עיגול), המחשב יכול לחשב את כל המהלכים האפשריים במשחק, וכך ליצור שחקן מושלם, שאמנם טוב במשחק אבל לא מאוד כיף לשחק נגדו. לעומת זאת, עבור משקים ארוכים יותר עם הרבה מהלכים אפשריים בכל תור, מספר החישובים הנדרשים גדל כל כך שזה כבר בלתי אפשרי. למשל בשח יש בממוצע 20 מהלכים כל תור. מה שאומר שכדי לחזות 2 מהלכים לעתיד צריך לחשב 400 מהלכים; כדי לחזות 5 מהלכים צריך יותר מ-3 מיליון מהלכים, וכדי לחזות 7 מהלכים צריך יותר ממיליארד!אז במשחקים כמו שח (ו-Alchemize הוא אכן כמו שח במובן הזה), צריך להשתמש באלגוריתם עם יוריסטיקה – זו דרך להעריך כמה מצב לוח (כלומר, כמות ומיקום הקריסטלים והשיקויים בלוח) הוא טוב עבורך, לעומת מצבים אחרים – כלומר עבור איזה מצב לוח הסיכוי לנצח הוא הכי גדול. לכל מצב מחשבים ערך מספרי מסויים.אלגוריתם מינימקס למעשה בוחר את המהלך שיתן לך את הערך המקסימלי, בהנחה שהיריב יעשה את המהלך הרע ביותר עבורך, שייתן לך את הערך המינימלי, ומכאן שמו.אתאר את היוריסטיקה שבחרתי עבור אלכמייז.
היוריסטיקה
התחלתי עם היוריסטיקה הבאה:[מספר הקריסטלים בצבע שלך] פחות [מספר הקריסטלים של היריב]היוריסטיקה בפשטות מנסה להגיע למצב שיש לך כמה שיותר קריסטלים, וליריב כמה שפחות, על ידי מיקסום ההפרש. למשל, היא תעדיף לוח שבו לך יש 5 קריסטלים וליריב 2 (הערך הוא 3), לעומת לוח שבו לך יש 10 קריסטלים וליריב 9 (הערך הוא 1). וכמובן ששניהם עדיפים על לוח שבו ליריב יש יותר קריסטלים ממה שיש לך (ערך שלילי).
בלוח הזה למשל, הערך הוא 3 = 2 - 5 = מספר הקריסטלים הכחולים פחות מספר הקריסטלים האדומים
בלוח הזה, הערך עבור השחקן הכחול הוא מינוס 2.
היוריסטיקה הפשוטה הזאת עבדה לא רע בכלל! בהנתן עומק מספיק גדול (כלומר, מספר התורות שהאלגוריתם מחשב קדימה), התקבלו שחקני מחשב שיכולים לעשות מהלכים טובים מאוד. יתרון נוסף של היוריסטיקה הזאת הוא שהיא מיושרת באופן מובהק עם ניצחון במשחק, כך שאם במקרה המחשב מצליח לחשב קדימה עד סוף המשחק, אז במקרה הזה באמת יתקבל “שחקן מושלם”.
ניסיון 1 - יוריסטיקה פשוטה, עומק שונה
אז בתור התחלה הגדרתי את שחקני המחשב הבאים:קל – יוריסטיקה פשוטה, עומק 1בינוני – יוריסטיקה פשוטה, עומק 2קשה- יוריסטיקה פשוטה, עומק 3מטורף – יוריסטיקה פשוטה, עומק 4כלומר, כולם עם אותה היוריקסטיקה, בעומק שונה. ואכן התקבלו שחקנים טובים ברמות קושי מגוונות! קל היה שחקן פשוט וקפריזי, שרק ניסה למקסם את הניקוד שלו בכל תור רק עבור המהלך שלו, בלי להתחשב בתגובת היריב או במהלכים הבאים. כל מי שהבין את חוקי המשחק ופיתח טקטיקה בסיסית יכול לנצח אותו.בינוני הוא כזה שלוקח בחשבון גם את תגובת היריב למהלך שלו. נדרשת קצת מיומנות כדי לנצח אותו, אבל זה עדיין אפשרי יחסית בקלותקשה כבר היה באמת קשה! הרבה יותר מבינוני. זה דורש כבר הבנה מעמיקה של המשחק, ופיתוח של אסטרטגיות ארוכות טווח. עבורי היה קשה לנצח אותו ודרש לא מעט אימון.מטורף בתורו כבר היה הרבה יותר קשה מקשה. כדי לנצח אותו צריך שליטה חזקה מאוד במשחק, וניצול כל מהלך כדי לקבל יתרון בלוח, בחשיבה לטווח הארוך.כך שמבחינת חוויית השחקן, לדעתי השחקנים האלה לגמרי עשו את העבודה!היו רק שתי בעיות:האחת, המשחק היה איטי מדי. לשחקן הקשה לקח 5-6 שניות לעשות מהלך, אבל השחקן המטורף לקח לפעמים יותר מ-20 שניות! הבעיה השניה היתה שגיליתי אסטרטגיה שבה יכולתי לנצח יחסית בקלות, אפילו לפעמים את השחקן המטורף.
ניסיון 2 - יוריסטיקה מתקדמת - "קריסטלים חסומים"
המטרה ב-Alchemize היא ליצור כמה שיותר קריסטלים. אבל לא פחות חשוב, עליך להשמיד גם את הקריסטלים של היריב! מאוד נפוץ שבסוף משחק, נשארים מעט מאוד קריסטלים על הלוח. קחו למשל את הלוח האופייני הבאף שבו לכל שחקן יש רק 2 קריסטלים:
זה מאוד הגיוני כשחושבים על זה – קריסטלים מושמדים ממש בקלות. מכיוון שכל קריסטל, בהגדרה, הוא שכן של שיקוי כחול אחד ושיקוי אדום אחד, אז ברגע ששמים לידו שיקוי נוסף (ולא משנה באיזה צבע) אז המשבצת של הקריסטל תושחר והוא יושמד.זה כשיש מעט קריסטלים, זה אומר שכל קריסטל הוא חשוב. אם יש קריסטל אשר חסום מכל הכיוונים (כלומר אין לו משבצת שכנה ריקה), זה אומר שאי אפשר להשמיד אותו. נקרא לקריסטלים כאלה “קריסטלים חסומים”.
בלוח הזה, הקריסטלים החסומים מסומנים בצהוב, והקריסטלים שאינם חסומים מסומנים בירוק. את החסומים אי אפשר להשמיד ומיקומם מובטח עד סוף המשחק; ולעומת זאת, את אלה שאינם חסומים אפשר להשמיד, ורוב הסיכויים שהם אכן יושמדו.שמתי לב שכשאני משחק נגד מחשב וממקד את המאמצים שלי בליצור כמה שיותר קסיסטלים חסומים, אני מצליח לנצח. אז חשבתי – למה לא להפוך את זה לחלק מהאסטרטגיה של המחשב?אז שיפרתי את היוריסטיקה:100 כפול [ההפרש בין הקריסטלים החסומים שלך לאלה של היריב] + [ההפרש בין כל הקריסטלים שלך לאלה של היריב]כלומר, ששחקן מחשב תמיד ינסה להגיע למקסימום קריסטלים חסומים (וכמה שפחות קריסטלים חסומים של היריב), ורק במקרה של תיקו בין שני לוחות, כלל הקריסטלים יילקחו בחשבון. כמו שאומרים, עדיף קריסטל חסום אחד ביד מ-10 לא חסומים על העץ.אז עדכנתי את הגדרות שחקני המחשב:קל – יוריסטיקה בסיסית, עומק 1בינוני – יוריסטיקה בסיסית, עומק 2קשה – יוריסטיקת קריסטלים חסומים, עומק 2מטורף – קריסטלים חסומים, עומק 3כלומר, עבור השחקנים קשה ומטורף, החלפתי ליוריסטיקה המשופרת, והורדתי ב-1 את העומק.בניסויים בהם נתתי לשחקני מחשב לשחק זה נגד זה, גיליתי שהקשה החדש הצליח לנצח את הקשה הישן! כלומר, שבפחות עומק (2 במקום 3, ולכן גם בזמן ריצה מהיר בהרבה), הגעתי לתוצאה טובה יותר!כמו כן גיליתי שהשחקן המטורף החדש הוא בערך כמו המטורף הישן, מה שאומר שהגעתי לאותה תוצאה בפחות עומק. עכשיו עבור כל שחקני המחשב, תור לוקח רק כמה שניות, והם עדיין מאתגרים לא פחות ממקודם. נהדר!וכך הוצאנו את המשחק – עם עדכון קטן:
ניסיון 3 - שחקן קל עם אקראיות
שמתי לב שהשחקן הקל, היה די צפוי ומשעמם. מכיוון שהוא עשה את המהלך שיתן לו הכי הרבה קריסטלים בתור הקרוב, היה מאוד קל לצפות איך הוא יגיב, ולמעשה לגרום לו לעשות מהלכים שיפגעו בו. כתוצאה מכך, האסטרטגיה הכי טובה נגד השחקן הקל היתה שונה מהאסטרטגיה הכללית (למשל כשמשחקים נגד שחקן אנושי או נגד מחשב), ולדעתי זה פגע באיך ששחקנים חדשים תופסים ולומדים את המשחק.אז הוספתי אקראיות ליוריסטיקה. כלומר, בסיכוי מסויים, השחקן הקל בחר מהלך שהוא לא המהלך “הכי טוב” שחושב. ההשפעה של זה על החוויה היתה מצויינת לדעתי – קודם כל, השחקן כבר לא היה צפוי, מה שהפך אותו ליותר מאתגר ופחות משעמם. מצד שני, זה אומר שהוא מדי פעם עשה “טעויות”, מה שאיפשר לשחקנים חדשים ללמוד גם איך לנצל טעויות של היריב, ושיפר את עקומת הלמידה של המשחק.והדבר הכי מצחיק הוא – שהאקראיות לא באמת הפכה את השחקן ל”פחות טוב” – כשנתתי לשחקן קל אקראי לשחק נגד שחקן קל רגיל, מספר הנצחונות של שניהם היה כמעט זהה. מה שאומר שכשמוסיפים אקראיות לשחקן שהוא לא מאוד אופטימלי מלכתחילה (ועומק 1 זה באמת לא מאוד אופטימלי), מקבלים משהו שהוא עדיין לא מאוד אופטימלי, אבל כן עם יותר עניין ואתגר.אז בסופו של דבר, הוצאנו את המשחק עם שחקני המחשב הבאים:קל – יוריסטיקה פשוטה עם אקראיות, עומק 1בינוני – יוריסטיקה פשוטה, עומק 2קשה – קריסטלים מאובטחים, עומק 2מטורף – קריסטלים מאובטחים, עומק
עוד אפשרויות שלא נכנסו למשחק
ישנם עוד כיוונים בהם אפשר לנסות לשפר את שחקן המחשב. הנה כמה דוגמאות:לא להתחשב בקריסטלים “חסרי ערך”. יש קריסטלים שממוקמים כך שהם תמיד יושמדו עד סוף המשחק אלה קריסטלים שלא שווים כלום, ולא צריך לספור אותם. נסו לחשוב בעצמכם על דוגמאות.להעדיף “שיקויים חסומים”. כדאי למקם את השיקויים כך שהם יהיו כמה שיותר חסומים מכל הכיוונים ולא חשופים. שיקוי חשוף (עם משבצות ריקות לידו) אומר שהיריב יכול להשתמש בו כדי ליצור קריסטלים. שחקן שיקח את זה בחשבון יוכל לעשות מהלכים חכמים יותר.ויש עוד הרבה כיוונים אפשריים, אבל בסוף החלטתי לא להוסיף אותם למשחק. קודם כל כי השחקן הנוכחי עובד טוב, וכל חישוב שנוסיף יאט אותו, ועלול לפגוע בחוויה. אבל גם כי המטרה שלי אינה ליצור את שחקן המחשב המושלם, אלא ליצור את האתגר המושלם – משחק שעם האסטרטגיה הנכונה אפשר גם לנצח. כי בסופו של דבר, חוויה המשחק היא לפני הכל.
אשמח לשמוע מה חשבתם על הפוסט!אורי ברוסילובסקיAlchemizeעוד משחקים שלי.הטוויטר שלי [...]
Read more...
22 במאי 2020גרסה 1.4.1 עלתה לאוויר וכוללת עדכונים חשובים לתוכנה:מנוע פיזיקלי משופראפשרות להציג את המפרקים של המודל התלת מימדיאפשרות לבחור באיזה מפרקים להשתמש במשחקדמות התנגשות ( collision shape ) מדוייקת יותרמידע מדיוק על המפרקים שהיו מעורבים בבדיקת התנגשותמצבי מודל חדשים – ragdoll, kinematic ו- floating הוספת פונקצית distance למדידת מרחק בין גופיםשיפורי התוכנה הללו נועדו לאפשר פיתוח משחקי קרבות בין דמויות מורכבות ולשפר באופן כללי את דיוק בדיקות ההתנגשות במרחב. [...]
Read more...
10 בפברואר 2020תכנות – מקצוע חובה לילדים
אי אפשר להפריז בחשיבות למידת התכנות בגילאים הצעירים. רבות דובר על תכנות לילדים בכל פורום אפשרי. מדינות העולם המערבי מודעות לחשיבות האסטרטגית של מקצועות הטכנולוגיה וכולם שוברים את הראש – כיצד לקרב יותר ויותר ילדים לעולם התכנות. כבר היום במספר מדינות ובעתיד הקרוב ברובן, ניתן יהיה לראות כיצד נכנסים לימודי התכנות כמקצוע חובה כבר בבתי הספר היסודיים. זה חיוני להישרדותה של אומה. בסרטון הזה, פונה הנשיא אובמה לילדי ארה”ב בבקשה ללמוד לתכנת:
תכנות לילדים אפשר ללמוד באופנים רבים במגוון מקומות. השאלה איך עושים את זה נכון כדי להביא את הילד ממצב של חוסר ידיעה לרמה של יודע לתכנת ומוכן לכניסה לעולם הטכנולוגי.
את הכללים הבאים אני כותב מתוך נסיון של מעל 20 שנה בתכנות ושנים רבות בלימוד תכנות ילדים ונערים מכל שכבות האוכלוסיה. מתוך הנסיון הזה יצרתי את שפת התכנות לילדים וסביבת הפיתוח SceneMax3D אשר עליה אני מחיל את הכללים הללו לקבלת תוצאות לימוד מירביות. כמובן שאין לראות ברשימה הזאת אמת מוחלטת, זאת לא תורה מסיני וכל מקרה לגופו אך מנסיוני עם מרבית הילדים – השיטה עובדת.
כלל מספר 1 – ילדים אוהבים משחקי מחשב. צריך ללמוד לתעל את זה לטובתינו
פיתוח משחקי מחשב ואנימציות הוא דרך נהדרת ללמד את הילדים תכנות מחשבים במיוחד אם עושים זאת בשיטת PBL שזה קיצור של Project Based Learning . אין טעם להעמיס על התלמידים הררי תאוריה וחומרים מקצועיים ואז להתחיל (או לסכם) בפרוייקט מעשי. יש להתחיל את הפרוייקט כבר מההתחלה וללמוד בכל שעור נושאים שמקדמים את הפרוייקט.
כשהייתי ילד קטן בערך בגיל 10 בתחילת שנות השמונים, אהבתי (כמו כולם) לשחק במשחקי מחשב אבל יותר מזה עניין אותי כיצד בונים אותם, איך מכניסים חיים במסך, איך יוצרים עולמות דמיוניים, איך מתבצעת כל האינטראקציה הזאת שבין השחקן למחשב.
אז כילד, התחלתי לחפש (ומצאתי) דרכים כיצד לדבר עם המחשב, לגרום לו לעשות את מה שאני רוצה. התקופה הייתה אחרת.
לא היה אינטרנט, גוגל, יוטיוב, יודמי. כלום. פשוט כלום וכל חומר שמצאתי, כל פיסת מאמר שהתפרסמה, הסתערתי עליה כמוצא שלל רב והוצאתי ממנה כל מה שרק אפשר לקידום בניית העולמות שלי. חלק מהחומרים התפרסמו בעברית אבל הרוב המוחלט היה באנגלית.
כלל מספר 2 – השקיעו בלימוד אנגלית לילדיכם.
זה אולי המקצוע החשוב ביותר בתקופתינו. המפתח להצלחה בכל תחום לימודי ומחקרי.
בפשטות, ילד שלא יחשוש להתמודד עם חומרים באנגלית יהיה בעמדת ייתרון על פני חבריו.
לא תאמינו כמה חרדות אני פוגש גם בתקופתינו מהצורך להתעסק עם חומרים באנגלית… צריך לפתור את הבעיה הזאת מוקדם ככל האפשר.
בשעורים שלי אני פותח בשאלה: מי יודע פה אנגלית? הילדים מהססים ואז אני שואל: מי יודע מה אומר המשפט adi is a ninja וכולם מצביעים בשמחה. הם יודעים בדיוק מה פירוש המשפט ואז אני כותב את זה לאט על המסך בפונטים ענקיים ולוחץ על לחצן ההרצה. מיד מופיע לוחם נינג’ה תלת מימדי על המסך.
הילדים בהתרגשות גדולה. הם היו שותפים לתהליך, הבינו מה שאלתי, הבינו מה כתבתי, הבינו את הקשר בין הכתוב לבין התוצאה הנראית על המסך, כל אחד ואחד מהם יכול להצליח לכתוב ולהריץ את המשפט הזה בעצמו. כעת הם פחות חרדים מהשימוש באנגלית. המטרה הושגה.
כלל מספר 3 – צריך שהלימוד יהיה מעניין ו “מדליק”
עד כדי כך שהילדים ירצו להתעסק בזה גם בזמנם החופשי.
אני מקבל שאלות מתלמידים גם חודשים רבים לאחר סיום הקורסים. זה מבחינתי מדד אולי החשוב ביותר להצלחת הקורס – העובדה שהצלחנו לזרוע את זרע התכנות והיזמות אצל התלמידים וזה הולך ומתפתח אצלם.
כלל מספר 4 – יש לייצר תחושת הצלחה ותוצרים משמעותיים כבר בשעור הראשון
ובכל שעור שלאחריו – אנו נמצאים בתקופת ה Instant. הכל מהיר, אין סוף הסחות דעת, סף ריגוש גבוה, טרנדים מתחלפים בקצב מהיר, תחרות מתמדת עם הטלפון, ילדים מאבדים עניין בקלות ועוברים לדבר הבא. לכן אנו צריכים כבר בשעור הראשון לקנות אותם. להוכיח להם שהם יכולים לתכנת משחקים, להדגים את החזון ולייצר ציפיה לשעורים הבאים. אני רוצה להדגיש את הנקודה האחרונה – כדאי מאוד שבכל סוף שעור נספר בשתי מילים על מה הולך להיות בשעור הבא. זה טריק שיווקי ידוע ליצירת ציפיה לקראת ההמשך.
כלל מספר 5 – הסבירו לילדים מה עומד מאחורי המושגים
תלמידים אוהבים להבין מה הם כותבים. ברגע שישנה הבנה זה מרתק ומכניס אותם לקשב. באחד השעורים בהם הייתי נוכח, המורה ביקשה מהתלמידים לכתוב את הפקודה :
skybox.show “lagoon”
היא הסבירה שכך אנו מכניסים תפאורת רקע של לגונה למשחק. הילדים ניסו להקשיב. ניכר שהיה להם קשה להבין מה הקשר בין תפאורת רקע במשחק למילה המוזרה skybox.
ביקשתי מהמורה רשות לדבר והסברתי לילדים באופן הבא:
אנו לומדים לפתח משחק תלת מימדי בדיוק כמו ב Play Station או ה XBox שלכם – [יצירת חיבור לעולם שאותו הם מכירים]
בעולם מפתחי המשחקים ישנו מושג כזה שנקרא skybox – [הרגעה. זה בסדר שאתם לא מבינים. זהו מושג של מפתחי משחקים]
ה skybox כשמו כן הוא – קופסא ענקית בגובה השמיים שעליה מודבקות תמונות מכל הכיוונים. במקרה הזה בחרנו להדביק תמונה של לגונה – [עכשיו הסבר על המושג החדש. שיבינו מה עומד מאחורי המילה]
כל המשחק שלנו מתחולל בתוך אותה קופסא ענקית ולכן היא משמשת כתפאורה למשחק – [ולבסוף למה אנחנו בכלל צריכים את אותו skybox , מה התפקיד שלו במשחק שלנו]
נוצרה דממה בכיתה. ניכר שהילדים הבינו מה עומד מאחורי המשפט המוזר. הם ממש חיכו לרגע שיוכלו להכניס למשחק את קופסת התפאורה הענקית הזאת.
בהמשך הקפדנו לעבוד באופן הזה של להשקיע מספר דקות בחיבור הילדים אל החומר והסבר קצר על המושגים לפני שרצים להקליד אותם. זה עבד טוב. טוב מאוד.
כלל מספר 6 – תכנית הלימוד צריכה להיות ברורה ומסודרת עם מורה ששולט ביד רמה בחומר
מורה שמוצא את עצמו בקושי “שורד” את השעור, מנחה את התלמידים להכנס לסביבת הלימוד, לקרוא לבד את ההוראות, לצפות בסרטונים ולעשות עם זה משהו, צפוי לשחיקה גבוהה, בלאגן בכיתה, הפרעות ותסכול של התלמידים. זה יכול “להצליח” ולהכשל באותה מידה.
אנו לא רוצים להשאיר שום דבר לידי המזל.
התכנית צריכה להיות ברורה. מערכי שעור מסודרים לכל השנה.
המורה מבין את החומר על בוריו, כל שעור הוא יחידת לימוד עצמאית ככל שניתן.
כל הילדים מבצעים את המשימה הנלמדת. תלמידים מתקדמים יכולים בזמן הנותר לאחר מילוי המשימה לעזור לאחרים או להתקדם עם פרוייקט משחק אישי.
לראייתי המורה צריך לבסס את מעמדו כאוטוריטה מקצועית. זה חלק גדול מהביטחון של התלמידים בדרך ונותן להם מוטיבציה להתקדם בחומר. הם יודעים שיש על מי לסמוך.
כלל מספר 7 – להיות קשורים למציאות
פיתוח משחקים ואנימציות זה נפלא אבל מטרת העל היא לקרב את הילדים למקצועות הטכנולוגיה בעולם האמיתי. אני שואף שלתלמידים שלי יהיה טבעי בסוף הקורס לעבור לפתח בסביבות פיתוח מורכבות יותר. לשם כך אני דואג שבתכנית פיתוח המשחק יהיה שימוש בתכנות עם עצמים, הגדרות משתנים, פרוצדורות ופונקציות, שימוש בלולאות, ריבוי תהליכים, תנאים, קלט מהמשתמש, עבודה עם קבצים וכולי. נשמע קשה נכון? נכון! זה באמת לא פשוט ללמידה. אז מה הסוד? איך אפשר בכל זאת להעביר את כל החומר הזה לילדים?
התשובה היא להפוך את המושגים שהוזכרו לצרכים:
התלמיד צריך להגדיר משתנים כדי שיוכל לזכור את תוצאת המשחק ואת החיים שנותרו לשחקן הראשי.
התלמיד צריך להגדיר פרוצדורות כדי לשמור על סדר בקוד.
התלמיד צריך לקבל קלט מהמשתמש על מנת להפוך את המשחק לאינטראקטיבי וכך הלאה. חובה להדגיש בפני התלמידים את הצורך שלהם לפני שמלמדים לבצע עוד אספקט בתכנות.
ככל שפיתוח המשחק מתקדם כך הופך הילד מבלי להרגיש כמעט למתכנת מחשבים לכל דבר ועניין. אני יכול להעיד על עצמי שאני חייב את כל הקריירה שלי לאותם משחקים פשוטים שתכנתתי בבית הספר היסודי.
כלל מספר 8 – לתת לילדים להתחבט בבעיות ולמצוא פתרונות
לא תהיה למידה אם ניתן לילדים בכפית את כל הפתרונות. התלמידים צריכים לשבור את הראש קצת לבד על מנת למצוא את הפתרון המתאים לצורך או לבעיה. למה זה כל כך חשוב? משתי סיבות:
א’ – מי שמתאמץ וחוקר ומחפש ומוצא ומתנסה בפתרון בעיה, הידע נצרב לו במוח.
ב’ – חשובה לא פחות מהפתרון היא הדרך בה חיפשנו אותו. בתקופתינו, היכולת לחפש מידע רלבנטי חשובה לא פחות (אולי אפילו יותר) מיכולת הקידוד.
כלל מספר 9 – להפוך את הילדים ליצרנים
בעיני זה חשוב. אני שואף שהתלמידים לא רק ילמדו לתכנת משחקים אלא גם לייצר משחקים. בסוף התהליך כל ילד יכול לייצא (לארוז) את המשחק שלו לקובץ הפעלה, להעלות אותו לחנויות באינטרנט ואף למכור אותו. ה 2 דולרים הראשונים שהוא יקבל על פרי עמלו הדיגיטלי יתדלקו את אש היצירתיות שלו והרצון שלו ללמוד ולפתח עוד מוצרים כאלה, עד האוניברסיטה. עד כדי כך זה חשוב.
ובנוסף ישנו גם את אספקט השיווק. יצרת מוצר? כל הכבוד לך. עכשיו צריך ליידע את קהל היעד בדבר קיומו. לפרסם ברשתות החברתיות, בקבוצות השונות, בקרב החברים והמשפחה וכל מי שרק יכול להפיץ את הבשורה. כישורי השיווק חשובים ומשלימים את כישורי הייצור.
כלל מספר 10 – הישתמשו בכלי פיתוח חינמיים
לא מתוך קמצנות. המורה צריך לבחור בכלי פיתוח חופשיים לשימוש על מנת לאפשר לילדים להתאמן בבית בזמנם החופשי ללא מגבלות של רשיון, פתיחת חשבון משתמש, תשלום דמי מנוי וכד’
לשמחתנו רוב סביבות הפיתוח ושפות התכנות הפופולאריות כיום הן חופשיות לשימוש.
כלל מספר 11 – כיתות קטנות
צריך לשאוף ללא יותר מ 15 תלמידים בכיתה שלומדת תכנות וגם זה מאתגר מאוד למורה הממוצע. במקרה של כיתות מלאות, צריך לבצע תיאום צפיות ולדעת שתהליך הלמידה יהיה איטי וכנראה גם דיי מבולגן. זאת לא אשמתו של המורה. מקצוע התכנות לא מתאים ללמידה בכיתות גדולות בגילאי יסודי ואף מעבר לכך.
לדעתי במקרה של כמות תלמידים גדולה ישנה עדיפות להעברת שעורים מקוונים (אם אפשר). בשעורים כאלה החיכוך עם התלמידים יותר נמוך, המורה פחות נשחק, אין צורך להתרוצץ בין התלמידים, אין צורך לייצר שקט והקשבה. האחריות לכך עוברת לצד התלמיד. המורה מתעסק בעיקר בלימוד החומר.
בין אם מדובר בכיתה גדולה או קטנה, תמיד כדאי לסדר את התלמידים בצורת ח’ ולנסות שישבו קרוב אל המורה ככל שניתן. זה עושה הבדל דרמתי ביכולת לייצר קשב.
במה לבחור – שפות טקסטואליות או וויזואליות?
כל שפות התכנות הפופולאריות בעולם כגון: C#, JAVA, C++, Python, Ruby, JS כולן הן שפות טקסטואליות ז”א שיש להן מילים שמורות ותחביר ואת התכניות כותבים בתוך עורך טקסט בדיוק כמו שכותבים מסמך בוורד.
הבעיה עם השפות הללו ככל שמדובר על תכנות לילדים היא שיש להן עקומת למידה חדה עם סביבות פיתוח “מאיימות”. בהחלט לא משהוא שמתאים לילדים בכיתה ה’ ומנסיוני גם בכיתות גבוהות יותר זה לא פשוט לרוב התלמידים.
מצד שני ישנן שפות תכנות וויזואליות כגון: סקראץ’, טינקר, אליס בהן לא מקלידים את התכניות בעורך טקסט אלא יוצרים אותן באמצעות גרירת בלוקים אשר מייצגים פעולות שונות. היתרון הגדול של השפות הוויזואליות הללו הוא שעקומת הלמידה שלהן מתונה, קל מאוד להתחיל לתכנת איתן וסביבות הפיתוח שלהן לא מאיימות ואפילו משעשעות.
ישנן דיעות שונות לגבי יעילותן של שפות הפיתוח הוויזואליות בהכשרת התלמידים לעתיד טכנולוגי. במבחן התוצאה עשרות מליוני ילדים לומדים באמצעותן תיכנות, חשיבה מחשובית, רובוטיקה וכד’ ולכן דעתי היא שהן בהחלט תורמות ומתאימות ללימוד בגילאי יסודי.
אף אל פי כן אני אישית מעדיף ללמד את התלמידים שלי תכנות טקסטואלי ממספר סיבות:
א. לדעתי זה מכין אותם טוב יותר לקראת כניסה לעולם התכנות האמיתי – הם לא יקבלו הלם בפוגשם לראשונה שפת פיתוח אמיתית
ב. יותר קל (לדעתי כמובן) לקרוא ולתחזק תכנית מחשב טקסטואלית על פני תכנית וויזואלית. איך שהוא תכניות וויזואליות מורכבות נראות לי תמיד כמו איזה פזל ענקי מבלבל בעיניים. קשה לערוך אותן, לבצע שינויים מהירים ואי אפשר פשוט להעתיק את הקוד ולשמור בקובץ טקסט או לשלוח בדואר האלקטרוני. חייבים להסתמך על יכולות ניוד ושיתוף של סביבת הפיתוח וזה מגביל.
כשהמצאתי את שפת התכנות לילדים SceneMax3D שאפתי לתת פתרון שהוא מצד אחד קל וידידותי כמו סקראץ’ ומצד שני מאפשר כן כתיבת קוד טקסטואלית כמו ב “שפות של הגדולים” כך שהתלמידים יעשו מכאן מעבר חלק לתכנות בעולם האמיתי.
בסרטון הבא ניתן לראות השוואה בין שפות וויזואליות לשפות טקסטואליות:
מה עושים במקרה של תלמיד המתקשה בחומר?
תמיד יהיו מספר תלמידים כאלה בכיתה. הכינו מראש קבצי Baseline ז”א אומרת קבצים מוכנים עם הקוד הרלבנטי לאותו שעור. תלמיד שלא מצליח להדביק את החומר עדיף ליישר לו קו עם קבצי ה Baseline ולאפשר לו להמשיך לעבוד מאשר לאבד אותו בכלל.
דבר נוסף שאפשר לעשות זה לבקש מתלמידים מתקדמים לסייע לו בהבנת הבעיה. במקרים מסויימים גם עבודה בזוגות יכולה להצליח אם כי באופן כללי זה לא מומלץ בשעורי תכנות.
לסיכום
במאמר זה העליתי את הדברים שעל פי נסיוני מאפשרים לימודי תכנות לילדים באופן מיטבי במסגרת המגבלות הידועות. מטרת העל של כולנו היא לקרב את דור העתיד למקצועות הטכנולוגיה לרבות תכנות מחשבים וכל כלי וכל שיטה שעושה את העבודה הרי זה מבורך.
בהצלחה! [...]
Read more...
7 בפברואר 2020גרסה 1.3.6 עלתה לאוויר וזמינה להורדה לכלל המשתמשים. גרסה זו כוללת מספר עדכונים חשובים לרבות:
יכולת לייבא SkyBox חיצוני מקובץ ZIP – ה Skybox הוא משאב חשוב המשמש אותנו להצגת רקעים במשחק. עד כה יכולת הכנסת רקעים חדשים הייתה מוגבלת מאוד אך מעתה זה קל למדי – פשוט יוצרים 6 תמונות לכל כיוון (קדימה, אחורה, מעלה, מטה, ימינה ושמאלה) באמצעות תוכנה ייעודית להכנת Skybox , שומרים את התמונות בקובץ ZIP ומייבאים בקלות לתוך המערכת.
לחץ כאן ליצירת Skybox בתוכנה אונליין
פקודת ההדפסה למסך ( print ) עודכנה וכעת מאפייני ההדפסה נקבעים בדומה לשאר הפקודות בשפה לדוגמא:
header.print “hello world” having color=yellow and size=3
פונקציה בשפת C# יכולה להחזיר מערך ושפת SceneMax3D יכולה לקבל את ערכי המערך אוטומטית לתוך מספר משתנים. זה מאפשר שיפור ביצועים משמעותי בעבודה עם שתי השפות וקוד קריא, קצר ונוח יותר לכתיבה. לדוגמא:
c#.x1,y1,ry = c#.Logic.GetValues
כפי שניתן לראות שלושת המשתנים x1,y1,ry מקבלים כולם ערכים מהפונקציה GetValues
[...]
Read more...
23 בינואר 2020ישויות דו מימדיות במשחקי מחשב נקראות ספרייטים. ספרייט הוא תמונה שטוחה דו מימדית שיכולה להכיל דמות אחת או להיות מחולקת לאוסף של תמונות קטנות שיוצרות אנימציה כלשהיא.
לדוגמא, הספרייט הזה הוא תמונה פשוטה של כוונת רובה:
ואילו הספרייט הזה הוא תמונה המחולקת לאוסף תמונות קטנות המרכיבות אנימציה של איש רץ:
במקרה הזה נשים לב שהתמונה מחולקת ל 6 עמודות ו 5 שורות המהוות סה”כ של 30 תמונות (מסגרות) קטנות. אם נציג את המסגרות הללו אחת אחרי השניה ברצף נקבל אשליה של אנימצית איש רץ.
בשפת SceneMax3D אנו טוענים אובייקט של ספרייט באופן הבא:
man is a RunningMan sprite
במקרה הזה הגדרנו אובייקט בשם man מסוג RunningMan שהוא sprite רשום במערכת.
אם נריץ את התכנית הקצרה הזאת תופיע תמונה של איש במרכז המסך:
המחשב באופן אוטומטי חותך את התמונה ומציג רק את המסגרת הראשונה.
להרצת האנימציה של הספרייט נשתמש בפקודה play לדוגמא:
man.play (frames 0 to 29)
פקודה זאת מציגה את כל המסגרות בתמונה ברצף. ממסגרת מספר 0 ועד מסגרת מספר 29 וכך מתקבלת אשליה של תנועה.
במידה ונרצה להריץ את האנימציה שוב ושוב בלולאה, ניתן להוסיף את מילת המפתח loop בסוף הפקודה:
man.play (frames 0 to 29) loop
במקום לולאה אין סופית, ניתן לקבוע את פרק הזמן להרצת האנימציה:
man.play (frames 0 to 29) for 5 seconds
במקרה הזה קבענו שהאנימציה תרוץ במשך 5 שניות.
אנו יכולים בנוסף גם לקבוע את מהירות האנימציה – ברירת המחדל היא שמהלך שלם של אנימציה מתבצע בשניה אחת. ניתן לשנות זאת לפרק זמן אחר לדוגמא בואו נראה כיצד נגרום לאיש הרץ לבצע את האנימציה פי 5 יותר לאט:
man.play (frames 0 to 29 in 5 seconds) loop
בדוגמא זו ביקשנו מהמחשב להריץ את תמונות 0 עד 29 ב 5 שניות שזה פי 5 מברירת המחדל של שניה אחת. [...]
Read more...
18 בינואר 2020פרוצדורות ולולאות מאפשרות לנו לבצע שימוש חוזר בקטעי קוד וארגונו לבלוקים הגיוניים ומסודרים. למעשה אין כמעט אפשרות לכתוב משחקים (וכל תכנית מחשב אחרת לצורך העניין) ללא שימוש נרחב בלולאות ובפרוצדרות.
בסרטון המצ”ב אני מדגים את השימוש בפרוצדורות ולולאות בשפה הוויזואלית למתחילים Scratch לעומת שפת SceneMax3D ו- C#
לכל אחת מהשפות יש את היתרונות והחסרונות שלה. ניתן לומר ש Scratch ו- SceneMax3D מתאימות במיוחד לילדים אשר עושים את צעדיהם הראשונים בתכנות לעומת שפת C# אשר מיועדת לקהל יותר מתקדם ומנוסה. בכל אופן מעניין לראות את ההבדלים שבין השפות, את הגישה שכל שפה מאפשרת לפתור בעיה נתונה. [...]
Read more...
17 בינואר 2020אז מה צריך על מנת לפתח משחק מכוניות תלת מימדי בסיסי? צריך שיהיה לנו כביש, צריך לשים מכונית על הכביש ואז לתכנן כיצד יתבצע המשחק – מה תהיה מכניקת המשחק. במקרה שלפנינו בחרתי לפתח משחק פשוט למדי – יש לאסוף 5 כדורים בזמן הקצר ביותר.
לצפיה בהדרכה המקוונת המלאה שנערכה ב 16 לינואר 2020 בפני תלמידי יסודי ומורים.
דיברנו על שימוש בקוביה כמודל סטטי המשמש ככביש, שמנו על ה”כביש” מכונית מסוג hatchback ופיזרנו מספר כדורים שאותם תצטרך המכונית לאסוף.
מבחינה תכנותית ראינו שגם במשחק הפשוט ביותר אי אפשר להמנע מאבני הבסיס של כל תכנית – משתנים, פרוצדורות, לולאות, בדיקות התנגשות, הדפסות ותגובה לקבלת קלט מהמשתמש.
אני ממליץ לילדים ולמורים לעבור על סרטון ההדרכה ולתכנת את כל המשחק מההתחלה על מנת למכסם את תהליך הלמידה. [...]
Read more...
3 בינואר 2020שימוש ב data במשחקים נדרש לעיתים על מנת לפשט ולייעל משימות מסויימות. הנה דוגמא לכך : השבוע חשבתי לכתוב משחקון “משוגע” קצר של מכונית הנעה לאורך מסלול מירוץ כלשהוא וצריכה לאסוף 5 דונאלד טראמפים הפזורים לאורך המסלול בזמן הקצר ביותר האפשרי. בדרך, המכונית צריכה להזהר מ “הפרה המשוגעת” ורקדן הגנגנם סטייל.
מכונית נעה לאורך מסלול זה לא אתגר קשה מדי ב SceneMax3D פשוט טוענים את המסלול ,”זורקים” עליו מכונית ומכיילים מצלמה לעקוב אחריה. סיפור של 3 שורות קוד. לא יותר. משהוא בסגנון הזה:
t is a static track2
car is a hatchback vehicle : pos (0,6,0)
camera.chase car : trailing=true and vertical rotation =15
האתגר התכנותי במשחקון הזה היה להציב את הפרה, רקדן הגנגנם והטראמפים במקומות אקראיים לאורך המסלול. לשם כך נדרשו הצעדים הבאים:
1. ביצוע חד פעמי של נסיעת מבחן איטית לאורך המסלול והקלטת כל הנקודות בהן עברתי
2. שמירת הנקודות הללו בקובץ
3. פתיחת הקובץ והעתקת כל הנקודות המוקלטות למערך אחד ארוך בתוך תכנית המשחק
4. קריאה של 5 מיקומים אקראים מתוך המערך והצבת “טראמפ” בכל מיקום
5. קריאת מיקום אקראי מתוך המערך והצבת הפרה המשוגעת שם וכך גם לגבי רקדן הגנגנם
לשם ביצוע ההקלטה ושמירת המיקומים בקובץ כתבתי class חדש ב C# ובו שתי פונקציות:
1. פונקצית איסוף נקודות – צוברת את ה x,y,z הנתון לתוך משתנה סטטי מסוג string
2. פונקצית שמירה לקובץ – שומרת את התוכן של המשתני לתוך קובץ טקסט
כך נראות הפונקציות:
public void Track(float x, float y, float z) {
track+=x+","+y+","+z+",";
}
public void Save() {
System.IO.File.WriteAllText(@"C:\dev\track.txt", track);
}
הפונקציה Track צוברת את הנתונים והפונקציה Save שומרת אותם בקובץ.
מתוך התכנית ב SceneMax3D יצרנו טיימר שקורא לפונקצית ה Track בכל שניה. ז”א שתוך כדי נסיעת המבחן, דגמנו את מיקום המכונית בכל שניה וצברנו אותו באמצעות הפונקציה Track.
בסיום נסיעת המבחן, קראנו לפונקציה Save והרי לנו קובץ עם נתוני המיקום של המכונית לאורך המסלול.
עם הנתונים הללו אפשר לעשות המון דברים לדוגמא:
א. להניע מכוניות לאורך המסלול
ב. להציב דמויות במיקומים אקראיים (כפי שעשינו במשחק הזה)
ג. להטיס מצלמת רחיפה לצילומים דינאמיים מזווית שונות
במקרה שלנו לקחנו את כל ה Data הזה והצבנו אותו בתוך מערך סטטי של double. זה נראה בערך ככה:
static double[] track = new double[] {0.0007467895,-5.671143,0.005862104,-0.0009969613,-5.471975,0.2241218,-0.02135887,-5.55441,0.5309632,-0.02154934,-5.554307,0.530955,-0.02119409,-5.554948,0.5309886,-0.02005673}
וכעת כל שנשאר הוא לבחור איזה שימוש לעשות עם הנתונים הללו. במשחקון הזה כאמור בחרנו לשלוף חמישה מיקומים אקראיים מתוך המערך וליצור שם “טראמפים”.
זאת הייתה דוגמא לשימוש ב Data במשחק. תחילה דגמנו ואספנו את הנתונים, לאחר מכן שמרנו אותם בקובץ ולבסוף העברנו אותם לגוף התכנית לשימוש במכניקת המשחק. [...]
Read more...