שיעור 04

הקו שזז — אנימציה ראשונה

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

while True לולאהמשתניםקפיצה מהקיר020 move the line.py
סרטוני השיעור

שני סרטונים לשיעור הזה

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

020 intro020 מבוא לאנימציה — לולאת משחק (16 דקות)021 move the line021 הקו שזז — הקוד בפעולה (8 דקות)
בדיקה מהירה

לפני שמתחילים

מוכנים אם:

הרצתם בהצלחה את 010 lines.py בשיעור הקודם וראיתם קו על המסך. אם לא, חזרו ל-שיעור 3 קודם.

הרעיון המרכזי

לולאת המשחק — Game Loop

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

1. נקה fill(0) 2. צייר line(...) 3. שלח show() 4. עדכן x += speed חוזר שוב ושוב — while True
💡
למה צריך לנקות כל פעם?

בלי fill(0) בתחילת הלולאה, הקו הישן נשאר על המסך. במקום תנועה, נקבל "זנב" של קווים שנערמים. נקה → צייר → שלח → עדכן. תמיד באותו סדר.

הפעלה

פתחו את הקובץ והריצו

1

פתחו את הקובץ ב-Thonny

File → Open, נווטו ל-c:\projects\single_button ופתחו את 020 move the line.py.

2

הריצו (F5)

הקו מתחיל לזוז! הוא נע ימינה, מגיע לקצה, וקופץ חזרה.

3

לעצור: לחצו Stop

כי הקוד רץ בלולאה אינסופית (while True), הוא לא ייעצר לבד. לחצו על כפתור Stop האדום ב-Thonny (או Ctrl+C).

הקו זז ימינה ושמאלה — אנימציה אמיתית!
הקוד

מה כתוב בקובץ?

קצר ופשוט. הקסם הוא בלולאה.

020 move the line.pyMicroPython
from machine import Pin, I2C
import ssd1306

i2c = I2C(scl=Pin(22), sda=Pin(21), freq=4000000)
display = ssd1306.SSD1306_I2C(128, 64, i2c)

# משתנים — מיקום ומהירות
x = 0
x_speed = 1

# לולאת המשחק — רצה לנצח
while True:
    display.fill(0)                    # 1. נקה
    display.line(x, 0, 63, 63, 1)    # 2. צייר
    display.show()                   # 3. שלח למסך
    x += x_speed                    # 4. עדכן מיקום
    if x > 127 or x < 0:          # הגענו לקצה?
        x_speed *= -1               # הפוך כיוון!
הסבר

שורה אחר שורה — מה חדש?

1

משתנים — x = 0 ו-x_speed = 1

משתנה הוא שם שמחזיק מספר. x הוא המיקום הנוכחי של הקו, ו-x_speed הוא כמה הוא זז בכל פעם.

כשכותבים x = 0 אנחנו אומרים: "הקו מתחיל בעמודה 0 (הקצה השמאלי)".

2

לולאה — while True:

"כל עוד זה נכון — תמשיך". True תמיד נכון, אז הלולאה רצה לנצח. כל מה שמוזח ימינה (עם רווחים) שייך ללולאה.

💡
מה זה הזחה?

ב-Python, רווחים בתחילת שורה אומרים "השורה הזו שייכת לבלוק שמעליה". כל השורות שמתחילות ב-4 רווחים אחרי while True: רצות בתוך הלולאה.

3

עדכון — x += x_speed

אחרי שציירנו ושלחנו למסך, אנחנו מזיזים את x. הסימן += אומר "תוסיף על מה שיש". אם x היה 30 ו-x_speed הוא 1, עכשיו x הוא 31.

בפעם הבאה שהלולאה רצה, הקו ייצוייר במיקום 31 במקום 30. ככה הוא "זז".

4

קפיצה מהקיר — x_speed *= -1

כש-x מגיע ל-127 (הקצה הימני) או יורד מתחת ל-0 (הקצה השמאלי), אנחנו הופכים את הכיוון.

*= -1 הופך חיובי לשלילי ולהפך. אם x_speed היה 1, הוא הופך ל-(-1). עכשיו x += x_speed מחסיר 1 במקום מוסיף. הקו זז שמאלה!

מצבx_speedמה קורה
זז ימינה1x גדל בכל סיבוב
הגיע לקצה*= -1הופך ל-(-1)
זז שמאלה-1x קטן בכל סיבוב
5

מהירות — freq=4000000

שימו לב שה-I2C פה מוגדר ל-4,000,000 (4 מגהרץ) במקום 400,000 כמו בשיעור הקודם. זה פי 10 יותר מהר! בלי זה האנימציה תהיה איטית מאוד כי show() שולח את כל הזיכרון למסך בכל סיבוב.

אתגרים

עכשיו תורכם!

שנו מספרים בקוד, שמרו, והריצו שוב. ראו מה משתנה.

1

הפכו את זה למהיר יותר

שנו מספר אחד בלבד

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

💡 לחצו לרמז
חפשו בקוד את המילה "speed". חשבו — אם הקו מתקדם 1 כל פעם, מה קורה כשהוא מתקדם יותר?
2

הפכו את הכיוון

הצד העליון קבוע, התחתון זז

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

🎯 לחצו לרמז
בשורת display.line(x, 0, 63, 63, 1) — הפרמטר הראשון (x) הוא הנקודה שזזה. העבירו את ה-x למקום אחר בפקודה.

בונוס — תנועה בשני הצירים

הקו זז גם למעלה ולמטה

הוסיפו משתנה y ו-y_speed וגרמו לנקודה גם לעלות ולרדת, לא רק ימינה ושמאלה.

הנקודה הירוקה זזה בשני הצירים בו-זמנית
💡 לחצו לרמז
שכפלו את אותו דפוס: y += y_speed ו-if y > 63 or y < 0: y_speed *= -1. השתמשו ב-y בתוך display.line().
סיכום

מה למדנו היום

🔄

while True

לולאה אינסופית

📦

משתנים

x, x_speed — שם שמחזיק מספר

x += speed

מזיז את המיקום

🧱

if — תנאי

בודק אם הגענו לקצה

↩️

*= -1

הופך כיוון

freq=4MHz

מהירות I2C לאנימציה חלקה

🚀
מה הלאה?

בשיעור 5 נלמד לצייר צורות נוספות — מלבנים, עיגולים, ונקודות. המסך הולך להיות הרבה יותר מעניין.