1. עקרונות התכנות
פלאש היא תוכנה שאפשר לעשות בה הרבה דברים. אבל היא לא אוטומטית, רק חצי אוטומטית. בקיצור, מה שאני מנסה להגיע אליו זה אל השורה התחתונה – בשביל לבנות משחקים בפלאש צריך לתכנת.
השפה שבה מתכנתים בפלאש נקראת Action Script, שהיא שפת סקריפט. אני לא יודע בדיוק איך מסבירים את ההבדל בין שפת תכנות לשפת סקריפט (אני לא יודע מה ההגדרה המדוייקת), אבל זה גם לא כל כך רלוונטי.
מה שכן רלוונטי זה שאם אין לכם שום רקע בתכנות, פה אני אסביר ככה בגדול על פקודות בסיסיות. ואם יש לכם רקע בתכנות... תעברו על ההודעה הזאת ברפרוף, רק כדי להכיר את דרך הכתיבה של הדברים בaction script, זאת אומרת את הsyntax.
שימו לב שבמהלך קריאת הפרק הבא יש סיכוי גבוה שאתם הולכים לאבד אותי כמה פעמים, אז אל תלחצו. תקראו שוב, ואם זה עדיין לא ברור – תמשיכו הלאה, ואולי בהמשך, עם דוגמאות ועם כניסה לנושאים חדשים, תבינו יותר.
אז ככה...
פקודות
בתכנות, הכל בנוי מרצף של פקודות שמתבצעות על ידי המחשב. הדבר דומה לאילוף של כלב. הכלב לומד מספר "פקודות", ולאחר מכן ניתן לתת לו "הוראות", למשל "ארצה" והוא ישב, או "לך תביא את המקל" והוא ירוץ ויחזור עם המקל בפיו.
בתכנות הדבר מאוד דומה. המחשב מכיר מספר פקודות, וכל פקודה תגרום לו לבצע דבר אחר. שני הבדלים עיקריים בין כלב למחשב – האחד, למחשב אין רצונות משלו, וכל דבר ש"תגידו" לו לעשות הוא יעשה. השני – למחשב לא מדברים (אתם מוזמנים לנסות, אבל זה לא עובד בדרך כלל), למחשב כותבים. בתכנות, נהוג לכתוב כל פקודה בשורה נפרדת.
אם נמיר עכשיו את פקודות הכלב שלנו לכתבה, הדבר יראה בערך כך:
* לך תביא את המקל
* ארצה
* תלחץ לי את היד
התוצאה תהיה שהכלב ירוץ ויחזור אם המקל בפיו, ישב וילחץ לך את היד. כמובן, אם זה כלב ממושמע.
רצף פקודות הגיוני בתכנות יהיה:
* תדפיס על המסך את המשפט "Hello World"
* תדפיס על המסך את המספר 3
* תדפיס על המסך את התוצאה של התרגיל 2+5
התוצאה של הרצף הזה תהיה: Hello World 3 7. אבל זאת סתם דוגמה. בעצם, זה אפילו לא קשור לפלאש – בפלאש אין פקודה שהמשמעות שלה היא "תדפיס על המסך". מה שכן חשוב זה שבפלאש, כמו בהרבה שפות תכנות\סקריפט אחרות, מעבר שורה הוא לא משהו שהמחשב מגדיר כ"סוף פקודה". זאת אומרת, שאם יש פקודה a, ואני רוצה שהמחשב עכשיו יבצע a פעמיים, אם אני אכתוב:
a
a
או:
aa
המחשב יפרש את זה אותו דבר, ולכן לא יצליח במשימתו. ולכן יש מפריד בין פקודה לפקודה. את ההפרדה בין פקודות בפלאש (וגם בעוד הרבה שפות) מסמנים ב;. זאת אומרת, שעל מנת לבצע את מה שאנחנו רוצים, היה עלינו לכתוב:
a;
a;
בעקרון, גם:
a;a;
היה מחזיר את אותה תוצאה, אבל זה פחות מסודר. סדר בזמן עבודה מונע הרבה כאבי ראש בשלב מאוחר יותר!
הערות - תיעוד
לפעמים, וזה הרגל טוב, אנחנו רוצים לתעד את הקוד שלנו. מה זאת אומרת? זאת אומרת שאנחנו רוצים לכתוב פקודה מסויימת, או רצף של פקודות, ולהסביר מה זה עושה. ככה אחרי זה הרבה יותר קל וברור להבין את הקוד. למשל, אם יש לנו פקודות a, b, c (אלה סתם דוגמאות), אנחנו רוצים להסביר מה כל פקודה עושה, כדי שאחרי זה לא נגלה ששכחנו ועכשיו אנחנו צריכים לחפש באינטרנט או בעזרה של הפלאש מה הפקודות עושות, או שנזכור מה הפקודה עושה אבל לא נזכור לשם מה השתמשנו בה. ויותר מזה – נניח שאנחנו משתמשים בכל הפקודות בשביל לעשות משהו מסויים שקורה ע"י רצף של כל הפקודות. אז הנה דוגמה לאיך שעושים את זה:
// doing that very special thing
a; // starting the blah
b; // doing the ha
c; // create the rahhhh
// end!
המחשב יתעלם מההערות שלנו! לגמרי! הוא אפילו לא ידע שהן שם. מבחינתו, רק הפקודות קיימות. ההערות שם אך ורק בשבילנו. אז איך זה עובד? ברגע שבשורה מסויימת כתבנו //, כל מה שנכתב אחרי ה// יהיה הערה – המחשב יתעלם ממנו.
עוד דרך להערה היא:
/* this is a comment */
ההבדל הוא, שלהערה מהסוג הזה יש התחלה ויש סוג. כל מה שכתוב בין /* ל*/ הוא הערה. זאת אומרת שאפשר ככה להפוך להערה חצאי שורות ואפשר להפוך להערה כמה שורות ביחד, למשל:
/*********************************************
********************היי***********************
**********************************************/
זאת הערה. קצת מיותרת, אבל בשביל ההמחשה היא סבבה...
משתנים
משתנה הוא כל דבר שמכיל ערך. מה זאת אומרת? למשל אם יש לנו משתנה בשם X. הוא יכול להכיל את המספר 3. אולי עם דוגמה זה יהיה יותר פשוט...
X=3;
זאת שורת קוד שמכניסה למשתנה בשם X את הערך 3. שימו לב ש3 זה מספר. זה בטח נשמע לכם מגוחך שאני אומר את זה... אבל יש לזה סיבה. אפשר לעשות גם משהו כזה:
X="3";
במקרה הזה, X יכיל 3, אבל לא כמספר. אלא את התו 3. מה זאת אומרת? זאת אומרת שהמחשב ידע שהמשתנה X מכיל 3, אבל לא ידע שהמשתנה X מכיל את המספר 3. אני אתן לכם דוגמה קצת יותר ברורה. נשתמש עכשיו במשתנה בשם dani, בלי שום סיבה מיוחדת:
dani = "hello";
עכשיו המשתנה dani מכיל את המילה hello. מבחינת המחשב, hello זאת לא מילה אלא רצף של אותיות, או בשפה קצת יותר מקצועית, מחרוזת של תווים (או בקיצור – מחרוזת).
המחשב מתייחס לכל התווים – בין אם זה אותיות, סימנים, רווחים או מספרים – כאל תווים. וזה בדיוק ההבדל בין 3 לבין "3". 3 זה המספר 3. "3" זה מחרוזת של תווים, שבמקרה מכילה את התו 3. למה זה משנה – את זה תבינו בהמשך...
אגב, ברוב השפות, לא כל משתנה יכול להכיל גם מספרים וגם מחרוזות. אבל action script זאת שפה מאוד "רכה", ולכן אפשר לעשות בה דברים כאלה... בנוסף, משתנה יכול להכיל מספרים לא שלמים (למשל 2.5), מה שלא תמיד נכון בכל השפות.
case sensitive
action script, כמו הרבה שפות אחרות, היא case sensitive. זאת אומרת, בקיצור, שהיא מבחינה בין אותיות גדולות לקטנות. אם זה מבלבל אתכם, אני אתן דוגמה מאוד מאוד פשוטה, והפעם עם השם shmolik.
שימו לב לשורות הקוד הבאות:
shmolik = 1;
Shmolik = 2;
SHmolik = 3;
shMolik = 4;
shmoLik = 5;
הגדרתי פה 5 משתנים שונים כולם נקראים שמוליק, אבל יש הבדל בצורת הכתיבה שלהם. המחשב מתייחס אליהם כאל משתנים שונים. חשוב לדעת את זה.
פעולות על מספרים ומחרוזות
אני אתחיל מדוגמה:
y = 2+3;
כמו שאתם יכולים לנחש, המשתנה y מכיל עכשיו את הערך 5.
ומה במקרה הבא?
x = 2;
y = 3;
z = x-y;
המשתנה z מכיל עכשיו את המספר -1, כי 2-3=-1. פשוט...
פעולות אפשריות:
+ חיבור, - חיסור, / חילוק, * כפל
אמממ.... זהו, בגדול, אלה הפעולות החשובות, לפחות בהתחלה.
מחרוזות גם ניתן לחבר. מה יקרה במקרה הבא?
x = "1";
y = x + "1";
הגיוני לחשוב שy יכיל 1+1=2. אבל לא ככה הדבר. מכיוון שמדובר במחרוזות, המחשב לא מתייחס ל"1" כאל מספר. ולכן, y יכיל את המחרוזת "11".
כמו כן,
x = "world";
y = "hello";
z = y + " " + x; // z = "hello world"
עוד משהו שטוב לדעת זה את הקיצורים שאפשר להשתמש בהם.
זאת אומרת, אם אנחנו רוצים להעלות משתנה באחד, אפשר לכתוב:
x = x+1;
אבל אפשר גם לכתוב פשוט
x++;
זה קיצור שימושי מאוד.
עוד קיצורים:
x = 2;
x+=3; //x=5
x=5;
y=8;
y-=x; //y = 3
y=4;
y--; //y=3
תחשבו ששני המיני פרקים "case sensitive" ו"פעולות על מספרים ומחרוזות" בהודעות נפרדות מזאת, טוב? פשוט בטעות גזרתי גם אותם, לא שמתי לב :-\
פונקציות ופונקציות מובנות
פונקציות הן פקודות שניתן להשתמש בהן בזמן כתיבת הקוד. קצת קשה להסביר, ולכן אני אתן דוגמה במה שנקרא "אלגוריתם עברי", זאת אומרת, כשכותבים בעברית מה שרוצים שהתוכנית תעשה, בשביל לתכנן מראש מה שרוצים לתכנת:
* הדפס על המסך "hello world"
* X <- 1 (הכוונה בשורה הזאת – תציב במשתנה X את הערך 1)
* Y <- 2
* הדפס על המסך X+Y
בשביל לכתוב תוכנית כזאת, אנחנו צריכים פקודה שתגיד למחשב להדפיס מה שאנחנו רוצים שהוא ידפיס על המסך של המשתמש.
בפלאש אי אפשר פשוט להדפיס על המסך מה שרוצים, זה טיפה יותר מסובך, אבל נניח לרגע שאפשר להדפיס מה שרוצים ושהפקודה לכך נקראת print. הפקודה print צריכה לדעת מה אנחנו רוצים שהיא תדפיס על המסך, ולכן אנחנו צריכים "להגיד" לפקודה print מה להדפיס, "לשלוח" לפקודה print את מה שאנחנו רוצים שהיא תדפיס. בשביל להסביר איך עושים את זה, הנה מה שכתבנו מקודם כאלגוריתם עברי מתורגם לשפה דמיונית כלשהי, שבה הפונקצייהprint מדפיסה על המסך את מה שהיא מקבלת:
print("hello world");
X = 1;
Y = 2;
print(X+Y);
כלומר, משתמשים ב( ו) על מנת "לשלוח" לפונקציות את הערך שהן צרכות לקבל. לפעמים יש מצב שפונקציות צריכות לקבל יותר מערך אחד, ובמקרה כזה:
func(value1, value2);
מפרידים את המשתנים ע"י פסיקים. כמובן, באותה מידה, אפשר לעשות משהו כזה:
func("blah", 2);
מה שחשוב זה לשלוח לפונקצייה משתנים מהסוג המתאים, כלומר, לא לשלוח סטרינג (מחרוזת) לפונקצייה שצריכה לקבל מספר, למשל.
יש גם פונקציות שפשוט עובדות, בלי לקבל ערך. במקרה כזה, הקריאה לפונקציה נעשית ככה:
func();
הרבה פעמים פונקציות מחזירות ערך. מה זאת אומרת? זאת אומרת שלמשל אפשר לכתוב משהו כזה:
x = func(y);
יש שפות שבהן יש פונקציות שמחזירות ערך ויש פרוצדורות שלא מחזירות ערך. אבל בחלק מהשפות פונקציות יכולות להחזיר ערך או שלא. דוגמה לפונקציה שמחזירה ערך זאת למשל פונקציה שמקבלת שני מספרים ומחזירה את המספר הגדול מבינהם.
פונקציות מתחלקות ל-2: פונקציות מובנות ופונקציות משתמש. פונקציות משתמש אלה פונקציות שאתם כותבים לעצמכם בשביל להשתמש בהן מאוחר יותר. אבל בזה נטפל מאוחר יותר.
פונקציות מובנות הן פונקציות שכבר קיימות בשפה. זאת אומרת, למשל אם בשפה יש אפשרות להדפיס על המסך דבר מה, וזה נעשה ע"י פונקציה שקוראים לה print, אז print היא פונקציה מובנית בשפה – אתם לא צריכים לכתוב אותה בעצמכם.
פונקציות מובנות בסיסיות
דיברתי הרבה על "להדפיס על מסך המשתמש". זאת הפעולה הכי בסיסית שיש בהרבה שפות. אבל בפלאש אין פקודה כזאת, כי הפלאש פשוט לא תדע לאן להדפיס.
מה שכן, אם רוצים לבדוק משהו, אפשר להשתמש בפונקציה trace.
הפונקציה trace מקבלת מחרוזת ומדפיסה את התוכן שלה. אפשר גם לשלוח לה מספר והיא תדפיס אותו. מה שחשוב זה שהיא פותחת חלון קטן של פלאש תוך כדי הריצה וכותבת הכל לתוכו, בשורות נפרדות. זאת אומרת, אם נכתוב:
trace("hello");
Name = "yossi";
trace(Name);
y = 1.5*3;
trace(y+1);
כשתריצו את הפלאש יפתח חלון קטן עם התוכן הבא:
hello
yossi
5.5
אבל מה? הפקודה trace לא תמיד עובדת. בשביל שהיא תפעל, צריך בפלאש במקום להפעיל את הפרוייקט רגיל, ללחוץ על Ctrl+Enter, או להכנס לControl->test movie. מה שעשיתם עד עכשיו יפתח, בצורה כזאת שגם פקודות trace יעבדו. אם תפעילו את המשחק רגיל, לא תראו את מה שיכתב ע"י trace. זאת אומרת, שtrace מיועדת אך ורק לצורך בדיקות שלכם!
עוד פונקציות מובנות יעילות הן הפונקציות המתמטיות המובנות. הפונקציות המתמטיות שייכות לאובייקט Math. אובייקטים זה נושא די מבוסך ולא ברור, ולכן נגיע אליו רק עוד הרבה זמן... בכל מקרה, מה שחשוב לדעת זה שבשביל להשתמש בפונקצייה של אובייט, עושים:
objectName.functionName();
ולכן, בפונקציות של Math משתמשים ככה:
x = -4;
y = Math.abs(x); // y = 4
הדוגמה הנ"ל תחזיר ערך מוחלט של x, כלומר 4 במקרה הזה. יש עוד כל מני פונקציות כמו סינוס וקוסינוס, עיגול של מספר לא שלם, חזקה וכו'. אני לא אפרט על הכל כאן, אם אתם רוצים, אתם יכולים להעזר בHELP של הפלאש, ולכתוב Math. ולראות איך הפלאש נותן לכם להשלים את זה, יפתח חלון קטן עם כל הפונקציות של האובייקט. בנוסף, לאובייקט Math יש משתנים, כמו PI. משתנים של אובייקט הם כמו פונקציות של אובייקט. פשוט משתמשים בהם עם שם האובייקט נקודה שם המשתנה. למשל Math.PI יחזיר את המספר פאי הידוע לשמצה.
תנאים
אחד מהדברים הבסיסיים והחשובים ביותר בתכנות הוא התנאים. למשל:
if (x>y){
trace("x");
} else {
trace("y");
}
מה קורה פה?
יש פה בדיקה – האם x גדול מy? אם כן – אנחנו מדפיסים x, ואם לא, אנחנו מדפיסים y.
ועוד דוגמה:
if (x==y){
trace("yes");
}
מה שאנחנו עושים פה זה בודקים אם x שווה לy, ואם כן – מדפיסים "yes".
שימו לב למבנה:
if (תנאי){
// מה לבצע אם התנאי מתקיים
}
ואפשרות לעשות גם:
if (תנאי){
// מה לבצע אם התנאי מתקיים
} else {
// מה לבצע אם לא
}
יש גם אפשרות ליותר מזה:
if (תנאי 1){
// מה לבצע אם התנאי הראשון מתקיים
} else if (תנאי 2){
// מה לעשות אם התנאי הראשון לא מתקיים אבל התנאי השני כן
} else {
// מה לעשות אם שני התנאים לא מתקיימים
}
וכן הלאה...
בעקרון, ב{ ו} משתמשים על מנת לתחום כמה שורות קוד ביחד. זאת אומרת:
if (x==y){
a;
b;
}
c;
a וb יתבצעו רק אם x שווה לy. c יתבצע בכל מקרה.
לגבי התנאים עצמם...
אלה הדברים שאפשר לבדוק:
x>y – איקס גדול מוואי
x==y – איקס שווה לוואי (בניגוד לx=y שמשמעו להציב את הערך של y בתוך המשתנה x)
x<y – איקס קטן מוואי
x>=y – איקס גדול או שווה לוואי
x<=y – איקס קטן או שווה לוואי
x!=y – איקס שונה מוואי
שלילת תנאים:
שלילת תנאים מתבצעת ע"י שימוש בסימן !. זאת אומרת:
if (!(תנאי){
trace("a");
}
יודפס a רק אם התנאי לא מתקיים.
שימו לה שבעקרון אפשר להשתמש בכמה סוגריים שרוצים, כל עוד דואגים לשים מספר פותחי סוגריים ומספר סוגרי סוגריים שווה. אבל צריך לדעת איך להשתמש בזה...
אפשר לחבר כמה תנאים. זאת אומרת, אם אתם רוצים לבדוק אם a גדול מb וגם b גדול מc, עושים דבר כזה:
if ((תנאי 1) && (תנאי 2)){
trace("b");
}
יודפס b אם גם תנאי 1 וגם תנאי 2 מתקיימים. ואלה הפעולות שאפשר לבצע בין תנאים:
תנאי 1 && תנאי 2 – שני התנאים מתקיימים ("וגם", and)
תנאי 1 || תנאי 2 – אחד מהתנאים מתקיים ("או", or)
הזחה\עימוד
בפרק על תנאים היו כמה בלוקים של קוד. בשביל "להבדיל" אותם משאר השורה, בתחילת כל שורה היה רווח. אני השתמשתי ב4 רווחים, אבל בדרך כלל משתמשים בזיח שנעשה ע"י מקש הTAB. למה זה טוב? לפלאש לא איכפת מכמה רווחים משתמשים ואיפה (כל עוד זה לא באמצע שם של פקודה או משתנה). אבל זה עוזר לנו לקרוא את הקוד. תנסו לקרוא את הקוד הבא:
if (a==b){
trace("a");
trace("b");
a--;
if (a>2){
if (c<8){
trace("z");
} else {
if(c==b){
b = -Math.abs(y);
}
} else {
trace("k");
}
} else {
trace("m");
}
לא ממש מובן מה קשור למה, נכון?
אבל תנסו עכשיו:
if (a==b){
trace("a");
trace("b");
a--;
if (a>2){
if (c<8){
trace("z");
} else {
if(c==b){
b = -Math.abs(y);
}
} else {
trace("k");
}
} else {
trace("m");
}
זה הרבה יותר ברור... לא ככה?
משתנים בוליאנים
משתנים בוליאנים הם משתנים שמכילים "אמת" או "שקר", true או false. אל תטעו, לא "true" ו"false", אלא true וfalse. זאת אומרת:
a = true;
כשרוצים להשתמש במשתנים בוליאנים בתנאים, אפשר לעשות:
if (a==true)
אבל זה מיותר.
אפשר פשוט לעשות:
if (a)
בשביל לבדוק אם הוא שווה לtrue, ו
if (!a)
בשביל לבדוק אם הוא שווה לfalse.
עכשיו, דבר נוסף שאפשר לעשות זה להכניס תנאים לתוך המשתנים, זאת אומרת למשל:
a = y==x;
b = !((r>h) || (h>x));
והם יקבלו true או false בהתאם.
אפשר לשלוח משתנים בולאנים לtrace על מנת לבדוק את הערך שלהם.
לולאות
בלולאות משתמשים על מנת להריץ קטעי קוד מספר פעמים. למשל:
trace("a");
trace("a");
trace("a");
trace("a");
trace("a");
trace("a");
trace("a");
trace("a");
trace("a");
trace("a");
אפשר לעשות בדרך קצרה בהרבה....
אפשר להשתמש בלולאת for, למשל. לולאה for מורכבת משלושה חלקים: הגדרת ערך, תנאי, פעולה לביצוע בסוף. למשל, אם רוצים שהלולאה תרוץ 10 פעמים:
for (var i=0; i<10; i++){
trace("a");
}
בעצם קיבלנו את אותה תוצאה בפחות שורות קוד. אבל מגיע לכם הסבר...
var זאת פקודה שבעזרתה מגדירים משתנה. זאת אומרת, למשל
var a;
בשורה הזאת הגדרנו משתנה בשם a. בשפות תכנות "אמיתיות" חייבים להגדיר משתנים לפני שמשתמשים בהם, אבל בפלאש זה לא חובה. מה שכן, משתמשים בזה בשביל להגדיר משתנים כגלובאליים ולוקליים למשל, אבל לזה עוד לא הגענו!.
חלקי הfor מופרדים ע"י ;, כמו פקודות.
מה שעשינו זה הגדרנו משתנה בשם i כ0, התנאי שנתנו הוא i<10 והפקודה לביצוע בסוף הלולאה – להעלות את i באחד. זאת אומרת: המחשב יגדיר את המשתנה איי ויציב בו את הערך 0. המחשב יבדוק אם איי קטן מ10. איי אכן קטן מ10, ולכן המחשב יבצע את הפקודות (במקרה שלנו – להדפיס a) ויעלה את איי ב-1. אז המחשב יבדוק שוב אם התנאי מתקיים, ואם כן – יבצע שוב את הפקודות ושוב יעלה את איי באחד. וחוזר חלילה. במקרה שלנו זה יקרה 10 פעמים. כמובן שבאותה מידה זה יכול לקרות גם 100 פעמים, מיליון פעמים או X פעמים (כלומר – כשX הוא משתנה). עוד דבר שאפשר לעשות זה למשל:
for(var i=0; i<=100; i+=2){
trace(i);
}
מה שיקרה זה שהמחשב יכתוב בחלונית הקטנה של הפלאש את כל המספרים הזוגיים בין 0 ל100 כולל. כלומר – אפשר להשתמש במשתנה של הלולאה בתוך הלולאה, כמו משתנה רגיל.
סוג נוסף של לולאות הוא לולאת הwhile. זאת לולאה קצת יותר פשוטה אבל משמשת למקרים קצת יותר מסובכים...
למשל:
var i = 0;
while (i<10){
trace("a");
i++;
}
הלולאה הזאת עובדת בצורה מאוד פשוטה – כל עוד התנאי מתבצע – תבצע את הפקודות שבלולאה.
במקרה הזה יתקבל אותו אפקט של כתיבת a עשר פעמים. אבל בלולאת while משתמשים בדרך כלל לדברים יותר מסובכים. למשל – אנחנו רוצים להדפיס את סדרת פיבונא'צי. זאת סידרה מאוד מיוחדת שלקוחה מהטבע. היא לא תעזור לנו בבניית משחקי מחשב (אלא אם נרצה לעשות משהו שמבוסס על תהליך רביית השפנים, אבל...), אבל היא תעזור להבנה של לולאת while, אני מקווה. הסדרה הזאת מתחילה מ1, 1 ואז כל איבר בסדרה היא סכום שני המספרים שקדמו לו. למשל:
1 1 2 3 5 8 13 21
כי:
1
1
1+1=2
2+1=3
3+2=5
5+3=8
8+5=13
13+8=21
וכן הלאה...
בשביל להדפיס את הסדרה הזאת אנחנו צריכים גם משתנה שישמור את האיבר הקוד...
נניח שprevNum יהיה המספר הקודם וNum יהיה האיבר הנוכחי.
נעשה משהו כזה:
prevNum = 1;
Num = 1;
trace(num);
while (num<1000){
trace(num);
num += prevNum;
prevNum = num - prevNum;
}
אני לא אכנס עכשיו להסבר המתמטי, כי הוא גם לא חשוב.
מה שיותר חשוב זה שזה משהו שלא בנוי בצורה מובהקת ללולאת for, על אף שבעקרון אפשר לעשות את זה גם בfor אם מתעקשים ממש. אבל עם while זה יותר נח.
ועוד דבר חשוב זה שתמיד צריך לשים לב שאנחנו לא יוצרים בטעות לולאה אינסופית. למשל:
var i = 8;
while (i<9){
trace(i);
}
איי תמיד יהיה שווה לשמונה, כי שום דבר לא משנה אותו. לכן הלולאה הזאת תרוץ שוב ושוב ושוב, ותתקע את המחשב. במקרה של פלאש, אחרי כמה שניות שהמחשב יהיה תקוע, הפלאש תתן הודעה על כך שהסקריפט שרץ כנראה תקוע ותשאל האם להפסיק את פעולתו. בכל מקרה, תמיד חשוב לשים לב שיש סוף ללולאות שלנו.
מערכים
המשתנים שהכרנו עד עכשיו הכילו ערך אחד כל אחד. עכשיו נכיר מערכים. מערך הוא מן משתנה שמכיל כמה משתנים. בעקרון זה עובד על מצביעים, אבל זה כבר משהו טכני ואני לא אסבך אתכם יותר מדי כי זה גם לא כל כך רלוונטי כרגע (מי שמתעניין בזה שילמד שפת תכנות בצורה רצינית מההתחלה עד הסוף, כמו שאמרתי, פה זה רק למי שלהוט לבנות משחקים ואין לו רקע בכלל. בכל מקרה, מי שבאמת רוצה ללמוד לבנות משחקי מחשב חייב ללמוד איזה שפת תכנות כמו שצריך כדי להבין איך כל העסק עובד, אז יהיה לו הרבה יותר קל והתוצאות יצאו יותר טובות. אבל מה שאני כותב נראה לי מספיק בתור הקדמה ובתור "קרש קפיצה" לא רע...).
יש כמה דרכים להגדיר מערך.
var myArray = new Array();
זאת הדרך הכי.... פשוטה. היא תגדיר לנו מערך בשם myArray בגודל לא ידוע. אגב, זה משהו שאי אפשר לעשות בכל שפת תכנות, בדרך כלל הגודל חייב להיות ידוע מראש.
עכשיו אנחנו יכולים להתייחס למשל ל
myArray[0]
שזה התא הראשון המערך. התא השני הוא
myArray[1]
וכן הלאה. חשוב לזכור שמערכים מתחילים מ0 ולא מ1. זה לא ככה בכל השפות, אבל בחלקן הגדול.
דוגמה לקוד:
myArray = new Array();
myArray[0] = 1;
myArray[1] = 2;
trace (myArray[0]+myArray[1]);
הקוד הזה יחזיר 3.
דרך נוספת להגדיר מערך בפלאש:
myArr = new Array(8)
יגדיר לנו מערך בגודל של 8 תאים, זאת אומרת, 0 עד 7.
והדרך האחרונה היא משהו כזה:
myArr = new Array("helo", "hello", "helllo", "hellllo");
ככה אנחנו מגדירים מערך ומציבים ערכים כבר בתאים שלו. התא הראשון (שמספרו, שנקרא אינדקס אגב, הוא 0) יכיל helo, השני hello וכן הלאה, עד לתא הרביעי.
מה שנחמד במערכים בפלאש זה שאפשר לבדוק את הגודל שלהם בצורה אוטומטית. למשל להגדיר תא בגודל לא ידוע, להכניס אליו ערכים ואז להדפיס את כולו. זה מתאפשר בעזרת פונקצייה של המערך. אם תעשו:
myArr.length()
תקבלו את האורך של המערך. אני יודע שאולי זה יהיה קצת לא מובן בהתחלה, אבל length זאת פונקצייה שמוגדרת עבור המערך. היא לא מקבלת את המערך כערך אלא מתבצעת עליו.
ואם נרצה לכתוב קוד שמדפיס את כל תאי המערך נכתוב:
for (var i=0; i<myArr.length(); i++){
trace(myArr[i]);
}
פונקציות משתמש
הנושא האחרון שאני רוצה לגעת בו בפרק ההקדמה הארוך הזה הוא פונקציות משתמש (שוב, זה לא מספיק בשביל להיות תכנתנים מי-יודע-מה, אבל זה מספיק בתור התחלה...). אם עד עכשיו הכרנו פונקציות קיימות, עכשיו נלמד איך אנחנו יכולים ליצור פונקציות משלנו. נתחיל בליצור פונקציה שמדפיסה 10 פעמים על המסך את המספר 1106.
אנחנו יודעים איך לעשות את זה:
for(var i=0; i<10; i++){
trace(1106);
}
אבל אם אנחנו רוצים לעשות את זה כמה פעמים בתוכנית שלנו? נוכל בקלות להפוך את זה לפונקציה:
function forum(){
for(var i=0; i<10; i++){
trace(1106);
}
}
יצרנו פה פונקציה בשם forum. עכשיו כל פעם שנקרא לה, זאת אומרת נכתוב:
furom();
יודפס בחלונית הקטנה והמגניבה של פלאש עשר פעמים המספר 1106. חשוב לשים לב שאת ההגדרה של הפונקצייה חובה לעשות לפני שהקריאה אליה מתבצעת, אחרת המחשב לא ידע מה לעשות ויחזיר שגיאה.
עכשיו נניח שאנחנו רוצים כל פעם להדפיס מספר אחר. לשלוח לפונקצייה את מספר הפעמים שאנחנו רוצים להדפיס את המספר ושהיא תדפיס אותו. בשביל זה נשתמש בסוגריים. זה עובד ככה:
function forum(num){
for(var i=0; i<num; i++){
trace(1106);
}
}
עכשיו כל מה שנשאר לנו הוא לעשות משהו כזה:
forum(15);
והמספר 1106 יודפס 15 פעמים
עכשיו, דיברנו גם על פונקציות שמחזירות ערכים. נניח אנחנו רוצים לעשות פונקציה שבודקת אם מספר ששוליחם אליה קטן מ1106 או לא. אנחנו צריכים להחזיר Boolean, זאת אומרת true או false. השאלה היא, איך עושים את זה? זה צריך להיות משהו כזה:
function isGreaterThenForum(num){
if (num>=1106){
// true
} else {
// false
}
}
מה שעושים זה משתמשים בפקודה return. הפקודה הזאת פשוט מחזירה ערך. בין אם זה מספר, מחרוזת או משתנה בוליאני, היא מחזירה אותו. זאת לא פונקציה – זאת פקודה. נעשה דבר כזה:
function isGreaterThenForum(num){
if (num>=1106){
return true;
} else {
return false;
}
}
עכשיו, בעקרון, כשעושים return, הפונקציה מיד מפסיקה לפעול. לכן, אם נעשה דבר כזה:
function isGreaterThenForum(num){
if (num>=1106){
return true;
}
return false;
}
זה יהיה אותו דבר – אם המספר גדול או שווה ל1106 הפונקציה תחזיר אמת ותפסיק לפעול. אחרי זה, במידה שהיא לא הפסיקה לפעול כבר, היא תחזיר שקר.
עכשיו, יש עוד שיפור, עוד יותר משמעותי... אפשר לעשות את כל זה בפקודה אחת.
function isGreaterThenForum(num){
return num>=1106;
}
בעצם התנאי עצמו יחזיר לנו true או false, ואנחנו רק צריכים להחזיר את מה שהוא מחזיר. אם נרצה ההפך, נוכל לעשות:
function isGreaterThenForum(num){
return !num>=1106;
}
וזה פשוט יחזיר הפוך, בגלל ה!.
הנושא האחרון בתוך הפונקציות שאני רוצה לדבר עליו זה על משתנים גלובאליים ומשתנים מקומיים. הזכרתי את זה מקודם, אבל לא הסברתי.
משתנה יכול להיות "כללי", גלובאלי, ואז כל התוכנית וכל הפונקציות של התוכנית יוכלו להשתמש בו. למשל:
function myFunc(){
if (a==2){
trace("a=2");
}
}
a = 2;
myFunc();
a++;
myFunc();
מה יקרה פה? התוכנית בעצם מגדירה משתנה בשם a. המשתנה הזה הוא גלובאלי, זאת אומרת שמתוך הפונקציה myFunc אני יכול לבדוק אותו, לשנות את ערכו וכו'.
לעומת זאת, תסתכלו על התוכנית הבאה:
function myFunc(){
var b = 2;
}
myFunc();
trace(b);
אנחנו קוראים לפונקציה. הפונקציה מגדירה משתנה בשם b. אחרי זה אנחנו מבקשים להציג את ערכו של המשתנה b. מה יוחזר? הגיוני לחשוב שעל המסך, בחלונית הקטנה הזאת של הפלאש, יוצג המספר 2. אבל לא. בחלונית הזאת יהיה כתוב unidentified. זה כי התוכנית לא מכירה את המשתנה b. למה? כי המשתנה b הוא משתני מקומי, לואקלי, של הפונקציה myFunc. מה זאת אומרת? זאת אומרת שרק מתוך הפונקציה אפשר להשתמש בו. מחוץ לפונקציה הוא לא מוכר.
בשביל להגדיר משתנה לוקאלי צריך להגדיר אותו בתוך הפונקציה, עם הפקודה var. אם נעשה דבר כזה:
function myFunc(){
b = 2;
}
myFunc();
trace(b);
המשתנה b יהיה גלובאלי ולא לוקאלי, כי הוא אמנם הוגדר בתוך הפונקציה, אבל לא עם var.
עוד דבר.... בקוד הזה:
function myFunc(){
trace(b);
var b = 2;
trace(b);
}
var b = 3;
trace(b);
myFunc();
trace(b);
התוצאה תהיה:
3
3
2
3
למה? כי יש משתנה גלובאלי b, שאותו אנחנו מדפיסים מחוץ לפונקציה ופעם אחת בתוכה. אחרי זה אנחנו יוצרים משתנה לוקאלי באותו שם. מאותו רגע, הפונקציה תתייחס רק למשתנה המקומי b, ותתעלם מהמשתנה הגלובאלי b. כשאנחנו מדפיסים את בי שוב מחוץ לפונקציה, התוכנית כבר מתייחסת רק למשתנה הגלובאלי.
ועכשיו, כשסיימנו ללמוד קצת על תכנות בכלל ועל תכנות בפלאש בפרט, הגיע הזמן להתקדם לשלבים הבאים.
2. עבודה בפלאש
קודם כל, כבר אמרתי, שבמדריך הזה אני לא אסביר איך לעבוד עם פלאש. מי שרוצה לבנות משחקים בפלאש צריך איזשהו ידע כללי בפלאש – עבודה עם הפריימים, עבודה עם הlayerים, אנימציות, גרפיקות – את כל זה לא תלמדו כאן. וזה משהו שדרוש על מנת לבנות משחקים בפלאש, כמו כל דבר אחר שרוצים לעשות בפלאש. זה הבסיס. אבל את כל זה קל ללמוד. מהHELP של פלאש או ממדריכים למתחילים באינטרנט, או אם אתם רוצים להגיע לרמה גבוהה עוד יותר – אפשר לקנות ספר טוב על פלאש ולהתחיל לקרוא. בכל מקרה, עד שלא תדעו לעבוד עם פריימים, לאיירים, לעשות אנימציות פשוטות (ברמה של עיגול שזז מצד לצד), לעבוד עם motion guide, לעבוד עם מסכות ולעבוד עם סצנות - אין לכם למה להמשיך לקרוא את הפרקים הבאים. אבל שוב, את כל זה קל מאוד ללמוד. תשחקו קצת עם הפלאש, תעשו דברים בסיסיים וטיפשיים, ותחזרו.
אם אתם יודעים לעבוד עם פלאש...
יש לנו כמה הגדרות לסדר.
הדבר הראשון, בתפריט הmodify -> document אנחנו צריכים להגדיר דברים עבור המסמך שלנו. יש שם את גודל הפלאש, את רקע הפלאש ואת הFPS. רקע הפלאש זה דבר עיצובי בלבד, ולכן אין לי מה להרחיב לגביו. לגבי הגודל והFrames Per Second...
קודם כל אתם צריכים להחליט אם אתם רוצים משחק דפדפן או משחק עצמאי. משחק דפדפן הוא משחק שנמצא בתוך אתר אינטרנט ולא מורידים קובץ כלשהו כדי לשחק בו. צריך נגן של פלאש כדי לשחק בו. משחק עצמאי הוא משחק שמורידים כקובץ למחשב, ומשחקים בו, בלי קשר לדפדפן או לנגן פלאש.
אם אתם רוצים לבנות משחק אינטרנטי (שעובד על הדפדפן), אתם יכולים לבחור איזה מידות שאתם רוצים. שימו לב שאחת הגדולות של פלאש היא הגרפיקה הווקטורית. המשמעות היא שאם אתם מציירים עיגול הוא נשמר כעיגול ולא כמפה של נקודות בצבעים שונים (פיקסלים), ולכן אם תעשו את המשחק שלכם בגודל של 100 על 100 ולאחר מכן תגדילו את החלון לגודל של 200 על 200, העיגול לא יהרס אלא יגדל בהתאם. כל זה לא תקף אם לא משתמשים באנימציה ווקטורית. זאת אומרת, שאם אתם למשל מדביקים תמונה כלשהי בתוך הפלאש – היא נשמרת כתמונה רגילה, כלומר כאוסף של נקודות צבעוניות, ואם תגדילו את חלון המשחק, האיכות תרד והתמונה תהיה מטושטשת. לכן, אם אתם רוצים להשתמש בגרפיקה לא ווקטורית (למשל תמונות או דברים שנעשים בתוכנות שלא תומכות בכך), שימו לב שהגודל שתקבעו יהיה הגודל המקסימלי שאליו יוכל המשחק שלכם לגדול מבלי לאבד מאיכותו הגרפית. אם אתם משתמשים בגרפיקה ווקטורית (כלומר דברים שמצויירים מצורות), תוכלו להגדיל את חלון המשחק כאוות נפשכם, עם עדיפות, כמובן, לשמור על היחס המקורי.
במקרה שאתם רוצים שהמשחק יהיה עצמאי, המצב קצת שונה. זה חשוב בעיקר אם אתם רוצים שהמשחק יעבוד על חלון מלא. המידות שלכם צריכות להיות ביחס של 8:6. זאת אומרת, הרזולוציה הכי נמוכה היום היא 640 על 480. הרזולוציה שאחריה, שהיא הרבה יותר נפוצה, היא 800 על 600, ואני ממליץ לכם להשתמש בה. רזולוציות גבוהות יותר הן למשל 1024 על 768 או 1600 על 1200. אבל אין לכם סיבה להשתמש בהן, זה רק יקשה עליכם, ויהיה מיותר.
אם אתם לא מתכוונים שהמשחק יעבוד במסך מלא, עדיין יהיה טוב לשמור על היחס הזה, וגם במשחקי WEB זה יהיה לא רע. אבל זה הרבה פחות קריטי...
הדבר השני שצריך לבחור בחלון הזה הוא הFrames per second. המשמעות די ברורה – פריימים לשנייה. זאת אומרת, כמה פריימים יראו בשנייה, או כל כמה זמן הפלאש יתעדכן.
סרטי קולנוע, למשל, עובדים ב24 פריימים בשנייה. ככל שיש יותר פריימים לשנייה, האנימציה נראית חלקה יותר. אבל שימו לב שאם תבחרו להשתמש למשל ב24 פריימים בשנייה, ותעשו הכל, ואז תעברו ל32 פריימים לשנייה – הכל יהיה מהיר יותר. לכן חשוב לבחור עם כמה פריימים לשנייה לעבוד. אני אישית אוהב לעבוד בקצב של 32 פריימים לשנייה – זה לא רע. יש גם הרבה משחקים שעובדים בקצב של 80 או 100 פריימים לשנייה, אלה בדרך כלל המשחקים היותר ריאליסטיים, שעובדים גם בסביבה תלת מימדית.
עוד הגדרות שיש לנו לעשות נמצאות בfile -> publish settings. פה אנחנו מחליטים בפועל אם זה יהיה משחק WEB או משחק עצמאי. אם אנחנו רוצים משחק עצמאי, נבטל את הVים ליד HTML וSWF ונסמן V ליד WINDOWS PROJECTOR (אם רוצים משחק למקינטוש ולא לwindows נבחר באפשרות המתאימה). אם אנחנו רוצים שזה יהיה משחק WEB, נשאיר את הVים ונלך להגדרות של הSWF ושל הHTML. שם יש לנו כל מני הגדרות לשחק איתן – גירסאת הפלאש, איכות התמונות (שלא מורכבות מצורות, כלומר ווקטוריות, אלא תמונות רגילות), איכות הקול אם יש, גודל על הדפדפן וכו' וכו'. רק תעברו על ההגדרות ולשחקו איתן קצת בשביל לגלות מה כל אחת עושה.
כשתרצו ליצור את הקבצים של המשחק שלכם, תוכלו לעשות file->publish. יווצרו הקבצים המתאימים: EXE (או HQX) למשחקים עצמאיים או SWF וHTML למשחקי WEB. אגב, חשוב שתדעו – קובץ הSWF הוא הקובץ של המשחק שלכם. קובץ הHTML הוא קובץ של עמוד אינטרנט שמכיל את המשחק. הSWF יכול לעבוד עצמאית בנגן של פלאש (או בדפדפן ע"י הנגן של פלאש). בכל מקרה, כשתעלו את המשחק לאינטרנט, תצטרכו להעלות את קבצי הSWF לשרת, ולהדביק את קוד הHTML במקום המתאים באתר.
אם אתם רוצים לבדוק את המשחק תוך כדי העבודה, אתם יכולים ללחוץ על F12. הפלאש יצור את הקבצים הרלוונטיים ויפעיל אותם, וככה תוכלו לבדוק את מה שעשיתם.









