עזרה בעבודה עם גרפיקה ב Visual CPP

Gn0MiCK

New member
עזרה בעבודה עם גרפיקה ב Visual CPP

יש לי את הקוד הזה שתפקידו לצייר עיגול על המסך... הבעיה היא שכשאני מצייר יותר מ10 כדורים הציור לוקח יותר מדי זמן, איך אפשר לייעל? CDC tempDC; tempDC.CreateCompatibleDC(pDC); CPen MyPen(PS_SOLID, 3, m_color ); CBrush Br( m_color); CBitmap tempBM; tempBM.CreateCompatibleBitmap(pDC,500,500); tempDC.SelectObject(&tempBM); tempDC.BitBlt(0,0,500,500,pDC,0,0,SRCCOPY); tempDC.SelectObject(&MyPen); tempDC.SelectObject(&Br); tempDC.Ellipse(m_center.x-m_radius, m_center.y-m_radius, m_center.x+m_radius, m_center.y+m_radius); pDC->BitBlt(0,0,500,500,&tempDC,0,0,SRCCOPY); tempDC.DeleteDC();
 

כאגאי

New member
איפה פה נכנסת העובדה שאתה מצייר 10

כדורים? אני מקווה שאתה לא עושה לולאה 10 פעמים על הקוד ששמת כאן. בגדול, אתה צריך לצייר את זה על DC שנמצא בזיכרון, רק הקטע של ה ELLIPSE לעשות 10 פעמים, ובסוף להעתיק את זה, כפי שעשית בעזרת BITBLT למסך. בנוסף אל תשכח לשחרר את האובייקטים + להחזיר את מה שצריך (בברירת מחדל) ל DC.
 

selalerer

New member
לפי השימוש ב:

m_radius m_center אני מניח שזאת שיטה של מחלקת עיגול ושהוא מריץ את השיטה הזאת 10 פעמים.
 

כאגאי

New member
את זה הבנתי, השאלה איפה פה

הלולאה שעושה את זה 10 פעמים ... האם הוא קורא לפונקציה הזאת 10 פעמים? או שהוא הוציא מהקוד את החלקים הרלוונטיים ללולאה?
 

כאגאי

New member
אופס ../images/Emo163.gif

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

Gn0MiCK

New member
2 דברים:

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

Gn0MiCK

New member
עוד משהו

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

selalerer

New member
2 דברים אחרים:

1. הצורה שבה אתה מצייר, מבנית היא נכונה אבל היא מאוד בזבזנית. כל פעם אתה מקצה אובייקטים DC מחדש ומעתיק חלק מהאובייקט DC הקיים וכו', הרבה פעולות שרובן אינו קשור ישירות לציור העיגול. אתה יכול לשמור לכל עיגול את הPEN שלו כחבר מחלקה ואותו דבר לגבי הBRUSH ואז לא תצטרך ליצור אותם מחדש כל פעם שאתה מצייר עיגול, בנוסף אולי השיטה הזאת יכול לקבל את הCOMPATIBLE DC כפרמטר ותפקידו של הקורא יהיה להעתיק אותו אל הDC של המסך. 2.לפי דעתי בתוך הפונקציה שהראית לנו אתה יוצר אובייקט tempBM ולא משחרר אותו. לגבי המערך זה תלוי איך הקצית אותו, אם בעזרת new שחרר בעזרת delete אם הכרזת סטטית אז אין צורך לשחרר זה משוחרר אוטומאטית, מה שכן תוודא שאם בבנאי (או באחת השיטות האחרות של המחלקה) אתה מקצה אובייקטים דינאמית אז במפרק תדאג לשחרר אותם.
 

the origin

New member
יש שיטה הרבה יותר קלה

תצייר עיגול בצייר , תעלה אותו לsurface ותעשה לו scale בהתאם לרדיוס
 

the origin

New member
אה רגע, עכשיו אני רואה שזה מה שעשית

נזכרתי שפעם בניתי משחק עם directdraw וכל פעם שציירתי יותר מ3 שחקנים הfps ירדו, זה בגלל שאין האצה של הכרטיס מסך , תשתמש בd3d תעלה את זה לtexture ותשתמש בID3DXSprite כדי לצייר אותו.
 
למעלה