الشبكة العربية لمطوري الألعاب

مبتدئ  info_si مشاركة 1

السلام عليكم
لدي مشكلة مع فيجوال سي++6 أضفت قائمة جديدة(menu individu) ووضعت هدا الكود بهدف تشغيل الفأرة




void OpenGLView::OnLButtonDown(UINT nFlags,CPoint point)
InvalidateRect(NULL);
COpenGLView::OnCreer();
Cview::OnLButtonDown(nFlags,point);
}

بحيث الدالة OnCreer هي التي تقوم برسم الشخص
لكن عند تنفيد المشروع ألاحظ أن المشهد كله ينزاح إلى اليمين وكأنني ناديت دالة الإزاحة  glTranslateمن فضلكم أريد حلا لهده المشكلة في أقرب وقت ممكن
شكرا

azqs

خبير  سعيد بسيوني مشاركة 2

السلام عليكم
 
ظاهر الكود مفيش أي أمور ممكن تتسبب بالمشكلة اللي تكلمت عنها
 
سؤال: هل الإزاحة تحدث دائما ولا بس عندما تضغط الزر الأيسر للفأرة؟

مبتدئ  info_si مشاركة 3

السلام عليكم
شكرا على المساعدة.

 عندما قمت بالتنفيد لاحظت أنه ينتقل فقط عندما أضغط على الزر الايسر للفأرة أو عند الضغط على القائمة الجزئية (creer) الموجودة في القائمة (individu) مع العلم أن الكود الخاص برسم الشخص هو

void COpenGLView::OnCreer()
{
	UINT nFlags;
	CPoint point;
	OnLButtonDown(MK_LBUTTON, point)
	glBegin(GL_TRIANGLES);
	glVertex3f(point.x,point.y,0.0);
	glVertex3f(point.x+25,point.y+25,0.0);
	glVertex3f(point.x+50,point.y+50,0.0);
	glEnd();
}

azqs

خبير مدير وسام البهنسي مشاركة 4

هناك شيء غريب في الكود:


في 19 مايو 2009 04:37 ص، قال info_si بهدوء وتؤدة:

void OpenGLView::OnLButtonDown(UINT nFlags,CPoint point)
{
  InvalidateRect(NULL);
  COpenGLView::OnCreer(); // نداء
  Cview::OnLButtonDown(nFlags,point);
}

في 20 مايو 2009 06:21 ص، عقد info_si حاجبيه بتفكير وقال:

void COpenGLView::OnCreer()
{
  UINT nFlags;
  CPoint point;
  OnLButtonDown(MK_LBUTTON, point) // نداء عودي
  glBegin(GL_TRIANGLES);
  glVertex3f(point.x,point.y,0.0);
  glVertex3f(point.x+25,point.y+25,0.0);
  glVertex3f(point.x+50,point.y+50,0.0);
  glEnd();
}

هل ما أراه هو حلقة تنفيذية مفرغة؟ لو كان فهمي صحيحاً لهذا الكود فهذا يعني أنك ستواجه خطأ طفوح في المكدس (stack overflow) بسبب النداءات المتداخلة اللانهائية... 😖   هناك فرق طفيف بحرف C واحد فقط في اسم الصنف في الكود الأول OpenGLView والكود الثاني COpenGLView، فهل هذا خطأ مطبعي أم أن الكود هو فعلاً هكذا؟

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  info_si مشاركة 5

السلام عليكم
أعلم أنني كتبت حلقة تنفيدية مفرغة عندما ناديت OnCreerفي CLButtonDown وناديت CLButtonDown في كود OnCreer لكن المشكلة ليست هناك
لأنني عندما أنزع OnCreer من OnLButtonDown أو العكس يبقى نفس الخطأ, أما فيما يخص COpenGLView واضح أن الخطأ مطبعي لأنه لو كان غير دلك لما رأيت التنفيد

azqs

خبير مدير وسام البهنسي مشاركة 6

وفي 21 مايو 2009 04:31 ص، قال info_si متحمساً:

عندما أنزع OnCreer من OnLButtonDown أو العكس يبقى نفس الخطأ, أما فيما يخص COpenGLView واضح أن الخطأ مطبعي لأنه لو كان غير دلك لما رأيت التنفيد

حسناً، لقد كان اختلاف اسم الصنف هو المبرّر الوحيد الذي يُخرج الكود من الحلقة المفرغة، لكن يبدو أنكِ تعمدتي ذلك لسبب ما. 😒
على كل حال، واضح أن هناك حسبة ما هي المسؤولة عن الإزاحة في الرسم (طبعاً لا نستطيع معرفة ما هي دون رؤية كود الرسم) وهي مرتبطة بشكل أو بآخر بالرسم عند الضغط على زر الفأرة الأيسر.
 
تذكري، عند فتح قائمة فرعية فإنكِ ستفقدين السيطرة على حلقة معالجة الرسائل في برنامجك، وسيدخل البرنامج في حلقة فرعية داخلية حتى مغادرة القائمة. في هذه الفترة لن يتم تنفيذ كود الرسم لو كنتِ تقومين به في الوقت الفائض من حلقة التنفيذ.  هذا يعني أنك لو فتحت قائمة ما بالضغط على زر الفأرة الأيسر وتسبب هذا برسم المشهد ومن ثم الدخول في حلقة القائمة الداخلية، فإنكِ لن ترين سوى المشهد الذي تم رسمه آخر مرة (والذي يحتوي على الإزاحة بسبب ضغط زر الفأرة الأيسر).
 
قد يكون تحليلي هذا خاطئاً، لكن هذا أقصى ما أستطيع تخيله في ضوء المعلومات التي ذكرتـِها أنت.  كخطوة عملية، أنصح بمراجعة كود الرسم وتحديد ما يربط الحسابات بضغطة زر الفأرة. يمكنكِ أيضاً طرح الكود هنا كي نستطيع المساعدة في ذلك ☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز