לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 07-06-2007, 20:48
  משתמש זכר eXtruct eXtruct אינו מחובר  
 
חבר מתאריך: 27.10.05
הודעות: 1,067
מחלקה שמשתמשת במחלקה אחרת. הררכיה של מחלקות במנוע גרפי?

ערב טוב.
יש לי שאלה אחת שמפריע לי בפיתוח המנוע הגרפי שלי.
יש לציין כי אני משתמש בספרייה SDL (לא שזה חשוב) לגרפיקה ובשפת C++.

בוא נניח כי יש לי מחלקה CObject. מחלקה אשר מכילה מידע על אובייקט מסויים (כמו מכמה נקודות הוא מורכב, קורדינטה של כל נקודה) ויש לה מתודות (פונקציות) לטיפול במידע שהיא מכילה לדוגמא קביעת קורדינטה חדשה, הוספה/הסרה של נקודות וציור של הובייקט למסך.
נכון להיום הציור עובד פשוט מאוד:
הוא מקבל פוינטר לאוסף פיקסלים (המסך) שאליו הוא רוצה לצייר, משתמש בפונקציה בנויה בתוך ספריית ה SDL שמציירת על אותו מסך.
עד פה אין בעיה.
אבל אני רוצה ליעל את כל זה. אני רוצה ליצור מחלקה שתקרא CGraphics אשר תכיל מתודות הקשורות לגרפיקה וביניהן גם ציור. במקרה הזה האובייקט הנ"ל לא יכול להישתמש בפונקציה של הציור כי היא מתודה של אובייקט אחר ה CGraphics.

בשביל להקל על כל התהליך אני אנסה להסביר את זה בשפה:
בוא נניח שקיימת פונקציה ב SDL שנקראה ככה:
קוד:
void Draw_Line(SDL_Surface *surface, int x1, int y1, int x2, int y2, int color);


וככה נראת הפונקציה
Draw
של המחלקה
CObject
קוד:
void CObject::Draw(SDL_Surface *surface, int x1, int y1, int x2, int y2, int color) { Draw_Line(surface, x1, y1, x2, y2, color); }

(הדוגמאות רק להמחשה)
עכשיו אני רוצה ליצור אובייקט
CGraphics
אשר יכיל מתודה
Draw
קוד:
void CGraphics::Draw(int x1, int y1, int x2, int y2, int color) { Draw_Line(this->surface, x1, y1, x2, y2, color); }

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

נערך לאחרונה ע"י eXtruct בתאריך 07-06-2007 בשעה 20:54. סיבה: שגיאות כתיב =\
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 07-06-2007, 21:06
  סאשה הסוס סאשה הסוס אינו מחובר  
 
חבר מתאריך: 13.07.06
הודעות: 1,070
כמה דברים:
בתגובה להודעה מספר 1 שנכתבה על ידי eXtruct שמתחילה ב "מחלקה שמשתמשת במחלקה אחרת. הררכיה של מחלקות במנוע גרפי?"

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

ולשאלה שלך, אין שום בעיה בקוד נוסח:
קוד PHP:
 GraphicsDevice gd(mySDLSrrface);
Rectangle rct(x,y,length,height);
DrawableRectangle drct(rct,gd);
drct.draw(); 
כש-DrawableRectangle::draw הוא:
קוד PHP:
 void DrawableRectangle::draw() {
    
m_gd.drawRect(x,y,length,height);


כש-GraphicsDevice::drawRect היא בעצמה משהו כמו:
קוד PHP:
 void GraphicsDevice::drawRect(x,y,length,height) {
    
Draw_Line(m_SDLSurface,x,y,x+length,y,cBlack);
    
Draw_Line(m_SDLSurface,x,y+height,x+length,y+heigh  t,cBlack);
    
Draw_Line(m_SDLSurface,x,y,x,y+height,cBlack);
    
Draw_Line(m_SDLSurface,x,y+height,x+length,y+heigh  t,cBlack);


כן. יש כאן כמה level of indirection, אבל זה לא כל כך רציני, ו-optimizing compiler טוב
עשוי לטפל אפילו בבעיות הקטנות שנוצרות. אם הפונקציות וירטואליות, כמובן, הן וירטואליות,
ולא יעזור כלום. ועדיין, עוד פקודה עד שתי פקודות אסמבלי בכל קריאה לפונקציה וירטואלית.
אפשר לשרוד את זה.

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

_____________________________________
סאשה הסוס, סוכן אוסינט.‏

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 18:07

הדף נוצר ב 0.09 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר