משהו שמשגע אותי

DeadalusX

New member
משהו שמשגע אותי

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

ועד שהgarbage collector מתפנה לטפל בהם, כבר מאוחר מידי, ויש לו יותר מידי מה לנקות, עצה שלי, תתחיל מהזה שתנהל storage של אוביקטיםֿ, אל תיצור ותהרוס אותם כל הזמן על המסך, תכין עשרה מראש (או כמה שאתה צריך) ותכניס כל פעם שאתה צריך לגבולות המסך, ותוציא מגבולות המסך כשאתה לא צריך.
 

DeadalusX

New member
המממ, אני יודע למה אתה מתכוון

אני כבר עושה את זה בכל מקרה עם אובייקטים גרפיים, יש דרך לעשות את זה גם עם ליסטנרים? בעקרון עכשיו אני עושה פשוט addEventListener ללחיצה של העכבר וכשאני רוצה לבטל אותו אני עושה removeEventListener, יש משהו יותר טוב?
 
אני מתאר לעצמי שלהוסיף ולהוריד יכול להכביד

למה שלא תתן משתנה bool בשם inUse שיהיה true כשמשהו על המסך, ואז לחיצה, תבדוק אם הוא true רק ליתר ביטחון ותוציא אותו פשוט מהמסך?
 

erezor

New member
עוד משהו לגבי מאזינים

אחת הדרכים לשפר את ה-garbage collection היא להוסיף useWeakReference = true בשורה שבה אתה מוסיף את המאזין. למשל:
mc.addEventListener(MouseEvent.CLICK, myFunction, false, 0, true);​
הפרמטר האחרון בשורה שערכו true אומר לפלאש לנקות את המאזין הזה אם האובייקט שהמאזין הוצמד אליו כבר לא קיים.
 

TheGreatNut

New member
פתרון פשוט...

במקום לעשות מאזין לכל אובייקט, אפשר לעשות מאזין אחד לקליק כללי על המסך ( MC בלתי נראה שמכסה את כל המסך ) ולפי האיזור של הקליק לחשב על ידי רדיוסים מה האובייקט הכי קרוב שהקלקת עליו (כביכול). החישובים האלו מהירים פי כמה וכמה מהמאזינים. אם איני טועה, מהירים פי יותר ממאה. עדיף מאזין אחד וחישוב שעובר על המיקום של X אובייקטים מ-X מאזינים.
 

pulse11

New member
למה לבצע חישוב כזה?

האובייקט שעליו מקליקים יכיל mouseChildren=false שים מאזין עכבר על האובייקט הראשי / במה. ה-target של האירוע יהיה האובייקט עצמו.
 

TheGreatNut

New member
כי הוא זול יותר. למרות שאני לא בטוח...

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

Brusi

New member
אם כל האובייקטים שאתה רוצה לבדוק

הם ילדים של אותו האובייקט, מספיק לשים מאזין אחד על האובייקט והוא כבר ישוגר בכל פעם שאתה מקליק על האובייקטים שהם ילדים שלו. הבמה מכילה את כל האובייקטים הנראים במשחק, אז אתה יכול לשים את המאזין על הבמה, והוא כבר מאזין להכל. האירוע (e:MouseEvent במקרה שלך) שמוחזר בכל שיגור, מכיל פרופרטי בשם target שבעצם אומר על איזה מוביקליפ הקלקת. ככה אתה יכול לדעת על איזה אובייקט השחקן לחץ. כמובן שאתה צריך לשמור על המוביקליפ מידע רלוונטי לגבי האובייקט עליו אתה מדבר במשחק (במידה והמוביקליפ הוא רק ייצוג גרפי של מערכת אובייקטים אחרת). יתרונות: מאזין יחיד, יעילות, לא צריך לדאוג לעשות remove להכל. חסרונות: ה-target המוחזר הוא תמיד המוביקליפ העליון ביותר, והאחרון מבחינת ילדים. כלומר אם לדמות שלך יש עיניים מתגלגלות, שכל עין היא מוביקליפ, אז ה-target יחזיר לך את העין ולא את הדמות. זה יכול להיות מאוד מעצבן. אז או שתדאג שכל המוביקליפים של האובייקט הפנימי יקבלו מידע, או שתעשה אותו בלי מוביקליפים פנימיים, או שתשתמש בדרך אחרת
 

TheGreatNut

New member
עכשיו הבנתי, תודה.

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

TheGreatNut

New member
דרך אגב, במצב כמו שאתה תיארת...

אפשר לשים מעל האובייקטים MC עם ריבוע שקוף, כזה שמכסה את הצורה הויזואלית של כל האובייקט, ולקרוא לו למשל mcHitArea, ואז זו תמיד תהיה השכבה העליונה, ואז תמיד יהיה קל לגשת לאובייקט עצמו דרך PARENTS משום שתדע באיזה עומק ה-TARGET שלך.
 

Brusi

New member
נכון

אבל אני שונא לעבוד ככה.. אני מרגיש כאילו אני שם פלסטר על קוד לא טוב. זה לא אומר שאני לא עובד ככה לפעמים בכל מקרה
 
למעלה