אי דיוק של MouseEvent על קנבס
-
גילוי נאות: אני מקודד בשביל התחביב בלבד, לא לפרנסתי. אז אולי לא תרצה לעזור לי...
יצרתי שעון מחוגים באמצעות JS ואלמנט קנבס. הוספתי אפשרות לכוון את השעון לשעה מותאמת-אישית על ידי גרירת המחוגים ידנית (שו' 306 והלאה).
כשמחוג מוזז על ידי המשתמש, השעה מתעדכנת בהתאם לסוג המחוג (שעות/דקות/שניות), ובהתאם לזווית שלו, שמחושבת לפי הקוארדינטות של הסמן, עם גיאומטריה. עדכון השעה מעדכן גם את שאר המחוגים בהתאם.
בשלב הזה היה חסר משהו: כשהמשתמש מזיז את מחוג הדקות וחולף על פני הספרה 12, הוא משלים בכך סיבוב שלם ולכן מחוג השעות היה אמור לעלות בשעה אחת, כמו ההתנהגות של שעון מחוגים אמיתי כשמכוונים אותו. בפועל, הבדיקה של הקוארדינטות יודעת רק שמחוג הדקות נמצא כעת מעט אחרי הספרה 12, ולכן הדקות הן בערך 0, מחוג השעות קופץ לתחילת השעה.
כדי לפתור את זה הוספתי עוד בדיקה: מוצאים את המיקום הקודם של הסמן, ואם המיקום הקודם הוא לפני הספרה 12 (=מרכז השעון), והמיקום הנוכחי הוא אחרי – צריך להוסיף שעה. המיקום הקודם מחושב ע"י
event.clientX-event.movementX
.זה עובד והכל מצוין – חוץ מכאשר המשתמש מעביר את מחוג הדקות על פני 12 לאט מדי. במקרים כאלה מחוג השעות קופץ אחורה, כלומר הקוד לא קלט משום מה שעברו על פני 12; ולפעמים להיפך – הקוד חושב שהמחוג עבר שם כמה פעמים, ומתווספות כמה וכמה שעות.
אני לא מצליח למצוא את הבעיה. לכאורה החישובים והתנאים הם ללא רבב ואמורים לעבוד.
מה יכולה להיות הסיבה לבעיה?
או איך אפשר להתגבר עליה?
אודה לך אם תציץ בקוד, הנמצא כאן ותיתן איזו תובנה.
כדי להפעיל את מצב הכוונון יש ללחוץ הכפתור הירוק > "כוון", ואז לגרור מחוגים עם הסמן.נ.ב. לשם המחשה דיברתי על השפעת מחוג הדקות על השעות, ועל תנועה בכיוון השעון – אבל זה נכון גם בקשר להשפעת מחוג השניות על הדקות, וכן על תנועה בשני הכיוונים.
-
@שלום-עולם-0 לא עברתי על הקוד.
אבל אצלי נראה שכשהוא מתכוונן אחורה ומגיע בדיוק על 12 זה קורה, כשממשיכים הלאה זה חוזר לשעה האמיתית.
ככל הנראה משהו בחישוב, אך כאמור אין לי כח להתעמק בקוד. -
@WWW כתב באי דיוק של MouseEvent על קנבס:
אבל אצלי נראה שכשהוא מתכוונן אחורה ומגיע בדיוק על 12 זה קורה, כשממשיכים הלאה זה חוזר לשעה האמיתית.
תן לי להבין בדיוק: זה עובד נכון רק בהזזה אחורה אבל לא בהזזה קדימה?
-
@שלום-עולם-0 כתב באי דיוק של MouseEvent על קנבס:
אני לא מצליח למצוא את הבעיה. לכאורה החישובים והתנאים הם ללא רבב ואמורים לעבוד.
לא הצלחתי לשחזר את הבאג
מה יכולה להיות הסיבה לבעיה?
אני מעלה השערה שזו אולי בעיה בחומרה שלך, למשל, העכבר שלך משדר תנועות מזעריות כשהוא זז לאט.
או איך אפשר להתגבר עליה?
תוכל להדפיס לקונסול באופן רציף את את ערכי
event.clientX
וevent.movementX
לפני שאתה משנה את השעה ולבדוק מדוע החישוב שגוי -
@שלום-עולם-0 כתב באי דיוק של MouseEvent על קנבס:
תן לי להבין בדיוק: זה עובד נכון רק בהזזה אחורה אבל לא בהזזה קדימה?
הפוך,
כשמזיזים אחורה ומשתהים בדיוק על 12 זה קופץ שעה אחורה, אך כשממשיכים לגרור זה מסתדר.
הנ"ל במחוג הדקות, במחוג השניות נראה שלגמרי הוא לא מדוייק. -
@שלום-עולם-0 כתב באי דיוק של MouseEvent על קנבס:
אני מקודד בשביל התחביב בלבד, לא לפרנסתי. אז אולי לא תרצה לעזור לי...
הפוך, זה נותן חשק לעזור, כי זה סימן שאתה מעוניין בתשובה עצמה ולא רק ב-
כל הכבוד על הפרוייקט הנחמד
לצערי עוד לא יצא לי להתעמק בקוד שלך
אבל הצלחתי לשחזר את הבאג -
@OdedDvir כתב באי דיוק של MouseEvent על קנבס:
לא הצלחתי לשחזר את הבאג
נסה להזיז את מחוג השניות על 12, לאט. אצלי זה מקפיץ את מחוג הדקות בכמה דקות טובות.