# יצירת משחק באמצעות אירועים
האם אי פעם תהיתם איך אתרים יודעים כשאתם לוחצים על כפתור או מקלידים בתיבת טקסט? זה הקסם של תכנות מבוסס אירועים! ומה יותר טוב מללמוד את המיומנות החשובה הזו מאשר לבנות משהו שימושי - משחק מהירות הקלדה שמגיב לכל הקשה שאתם מבצעים.
אתם הולכים לראות ממקור ראשון איך דפדפני אינטרנט "מדברים" עם קוד ה-JavaScript שלכם. בכל פעם שאתם לוחצים, מקלידים או מזיזים את העכבר, הדפדפן שולח הודעות קטנות (אנחנו קוראים להן אירועים) לקוד שלכם, ואתם מחליטים איך להגיב!
עד שנסיים כאן, תבנו משחק הקלדה אמיתי שעוקב אחרי המהירות והדיוק שלכם. חשוב מכך, תבינו את העקרונות הבסיסיים שמניעים כל אתר אינטראקטיבי שאי פעם השתמשתם בו. בואו נתחיל!
## שאלון לפני ההרצאה
[שאלון לפני ההרצאה](https://ff-quizzes.netlify.app/web/quiz/21)
## תכנות מבוסס אירועים
חשבו על האפליקציה או האתר האהוב עליכם - מה גורם לו להרגיש חי ומגיב? הכל קשור לאיך שהוא מגיב למה שאתם עושים! כל לחיצה, הקשה, החלקה או הקשה על מקש יוצרים מה שאנחנו קוראים לו "אירוע", ושם מתרחש הקסם האמיתי של פיתוח אתרים.
הנה מה שהופך את התכנות לאינטרנט לכל כך מעניין: אנחנו אף פעם לא יודעים מתי מישהו ילחץ על הכפתור הזה או יתחיל להקליד בתיבת טקסט. הם עשויים ללחוץ מיד, לחכות חמש דקות, או אולי בכלל לא ללחוץ! חוסר הוודאות הזה אומר שאנחנו צריכים לחשוב אחרת על איך אנחנו כותבים את הקוד שלנו.
במקום לכתוב קוד שרץ מלמעלה למטה כמו מתכון, אנחנו כותבים קוד שממתין בסבלנות שמשהו יקרה. זה דומה לאיך שמפעילי טלגרף במאה ה-19 היו יושבים ליד המכונות שלהם, מוכנים להגיב ברגע שהודעה מגיעה דרך החוט.
אז מה בדיוק זה "אירוע"? בפשטות, זה משהו שקורה! כשאתם לוחצים על כפתור - זה אירוע. כשאתם מקלידים אות - זה אירוע. כשאתם מזיזים את העכבר - זה עוד אירוע.
תכנות מבוסס אירועים מאפשר לנו להגדיר את הקוד שלנו להאזין ולהגיב. אנחנו יוצרים פונקציות מיוחדות שנקראות **מאזיני אירועים** שממתינות בסבלנות לדברים ספציפיים לקרות, ואז פועלות כשהם קורים.
חשבו על מאזיני אירועים כמו פעמון לדלת עבור הקוד שלכם. אתם מגדירים את הפעמון (`addEventListener()`), אומרים לו איזה צליל להאזין לו (כמו 'click' או 'keypress'), ואז מציינים מה צריך לקרות כשמישהו מצלצל בו (הפונקציה המותאמת שלכם).
**כך מאזיני אירועים עובדים:**
- **מקשיבים** לפעולות משתמש ספציפיות כמו לחיצות, הקשות או תנועות עכבר
- **מבצעים** את הקוד המותאם שלכם כשהאירוע המוגדר מתרחש
- **מגיבים** מיד לאינטראקציות משתמש, ויוצרים חוויה חלקה
- **מטפלים** במספר אירועים על אותו אלמנט באמצעות מאזינים שונים
> **NOTE:** כדאי להדגיש שיש דרכים רבות ליצור מאזיני אירועים. אפשר להשתמש בפונקציות אנונימיות או ליצור פונקציות עם שמות. אפשר להשתמש בקיצורי דרך שונים, כמו הגדרת מאפיין `click`, או שימוש ב-`addEventListener()`. בתרגיל שלנו נתמקד ב-`addEventListener()` ובפונקציות אנונימיות, שכן זו כנראה הטכניקה הנפוצה ביותר שמפתחי אתרים משתמשים בה. היא גם הכי גמישה, שכן `addEventListener()` עובד עבור כל האירועים, ושם האירוע יכול להינתן כפרמטר.
### אירועים נפוצים
בעוד שדפדפני אינטרנט מציעים עשרות אירועים שונים שניתן להאזין להם, רוב האפליקציות האינטראקטיביות מסתמכות רק על כמה אירועים חיוניים. הבנת האירועים המרכזיים הללו תעניק לכם את הבסיס לבניית אינטראקציות משתמש מתוחכמות.
יש [עשרות אירועים](https://developer.mozilla.org/docs/Web/Events) שניתן להאזין להם בעת יצירת אפליקציה. למעשה, כל דבר שמשתמש עושה בדף מעלה אירוע, מה שנותן לכם הרבה כוח להבטיח שהם יקבלו את החוויה שאתם רוצים. למרבה המזל, בדרך כלל תצטרכו רק קומץ קטן של אירועים. הנה כמה נפוצים (כולל שניים שנשתמש בהם כשניצור את המשחק שלנו):
| אירוע | תיאור | שימושים נפוצים |
|-------|--------|----------------|
| `click` | המשתמש לחץ על משהו | כפתורים, קישורים, אלמנטים אינטראקטיביים |
| `contextmenu` | המשתמש לחץ על כפתור העכבר הימני | תפריטי לחיצה ימנית מותאמים אישית |
| `select` | המשתמש סימן טקסט | עריכת טקסט, פעולות העתקה |
| `input` | המשתמש הזין טקסט | אימות טפסים, חיפוש בזמן אמת |
**הבנת סוגי האירועים הללו:**
- **מופעלים** כשמשתמשים מבצעים אינטראקציה עם אלמנטים ספציפיים בדף שלכם
- **מספקים** מידע מפורט על פעולת המשתמש דרך אובייקטי אירוע
- **מאפשרים** לכם ליצור אפליקציות אינטרנט מגיבות ואינטראקטיביות
- **עובדים** באופן עקבי בדפדפנים ומכשירים שונים
## יצירת המשחק
עכשיו כשאתם מבינים איך אירועים עובדים, בואו ניישם את הידע הזה על ידי יצירת משהו שימושי. ניצור משחק מהירות הקלדה שמדגים טיפול באירועים תוך כדי פיתוח מיומנות חשובה למפתחים.
אנחנו הולכים ליצור משחק כדי לחקור איך אירועים עובדים ב-JavaScript. המשחק שלנו יבדוק את מיומנות ההקלדה של השחקן, שהיא אחת המיומנויות הכי פחות מוערכות שכל מפתח צריך. עובדה מעניינת: פריסת המקלדת QWERTY שאנחנו משתמשים בה היום תוכננה למעשה בשנות ה-1870 עבור מכונות כתיבה - ומיומנויות הקלדה טובות עדיין חשובות מאוד למתכנתים היום! תהליך המשחק ייראה כך:
```mermaid
flowchart TD
A[Player clicks Start] --> B[Random quote displays]
B --> C[Player types in textbox]
C --> D{Word complete?}
D -->|Yes| E[Highlight next word]
D -->|No| F{Correct so far?}
F -->|Yes| G[Keep normal styling]
F -->|No| H[Show error styling]
E --> I{Quote complete?}
I -->|No| C
I -->|Yes| J[Show success message with time]
G --> C
H --> C
```
**כך המשחק שלנו יעבוד:**
- **מתחיל** כשהשחקן לוחץ על כפתור ההתחלה ומציג ציטוט אקראי
- **עוקב** אחרי התקדמות ההקלדה של השחקן מילה אחר מילה בזמן אמת
- **מדגיש** את המילה הנוכחית כדי להנחות את המיקוד של השחקן
- **מספק** משוב חזותי מיידי על טעויות הקלדה
- **מחשב** ומציג את הזמן הכולל כשהציטוט הושלם
בואו נבנה את המשחק שלנו ונלמד על אירועים!
### מבנה הקבצים
לפני שנתחיל לקודד, בואו נתארגן! שמירה על מבנה קבצים מסודר מההתחלה תחסוך לכם כאבי ראש בהמשך ותהפוך את הפרויקט שלכם למקצועי יותר. 😊
אנחנו נשמור על דברים פשוטים עם רק שלושה קבצים: `index.html` עבור מבנה הדף שלנו, `script.js` עבור כל לוגיקת המשחק שלנו, ו-`style.css` כדי לגרום להכל להיראות נהדר. זה השלישייה הקלאסית שמניעה את רוב האינטרנט!
**צרו תיקייה חדשה עבור העבודה שלכם על ידי פתיחת חלון קונסול או טרמינל והקלדת הפקודה הבאה:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**כך הפקודות הללו פועלות:**
- **יוצרות** ספרייה חדשה בשם `typing-game` עבור קבצי הפרויקט שלכם
- **מנווטות** לתוך הספרייה החדשה שנוצרה באופן אוטומטי
- **מגדירות** סביבת עבודה נקייה לפיתוח המשחק שלכם
**פתחו את Visual Studio Code:**
```bash
code .
```
**הפקודה הזו:**
- **משיקה** את Visual Studio Code בספרייה הנוכחית
- **פותחת** את תיקיית הפרויקט שלכם בעורך
- **מספקת** גישה לכלי הפיתוח שתצטרכו
**הוסיפו שלושה קבצים לתיקייה ב-Visual Studio Code עם השמות הבאים:**
- `index.html` - מכיל את המבנה והתוכן של המשחק שלכם
- `script.js` - מטפל בכל לוגיקת המשחק ומאזיני האירועים
- `style.css` - מגדיר את המראה החזותי והעיצוב
## יצירת ממשק המשתמש
עכשיו בואו נבנה את הבמה שבה כל פעולת המשחק שלנו תתרחש! חשבו על זה כמו עיצוב לוח הבקרה של חללית - אנחנו צריכים לוודא שכל מה שהשחקנים שלנו צריכים נמצא בדיוק במקום שהם מצפים לו.
בואו נבין מה המשחק שלנו באמת צריך. אם הייתם משחקים במשחק הקלדה, מה הייתם רוצים לראות על המסך? הנה מה שנצטרך:
| אלמנט ממשק משתמש | מטרה | אלמנט HTML |
|-------------------|-------|------------|
| תצוגת ציטוט | מציגה את הטקסט להקלדה | `
` עם `id="quote"` |
| אזור הודעות | מציג הודעות סטטוס והצלחה | `
` עם `id="message"` |
| שדה טקסט | המקום שבו השחקנים מקלידים את הציטוט | `` עם `id="typed-value"` |
| כפתור התחלה | מתחיל את המשחק | `