الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية إنشاء Sprite في OpenGL

مغلق
بدأه Abdullah.Alshammeri في 26 أغسطس 2006 · 4 رد · 1,021 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم :

حبيت أسأل يا اخوان ..

هل يعرف احد الطريقة السليمة لانشاء Sprite في opengl ..

انا حاولت تطبيق ذلك .. لكن النجاح صار نص كم .

مثلا لو عندي sprite فيه 4 صور بالعرض و 4 صور بالطول .. اعتمدت على شيء شبيه بالتالي :

 
const float  A =0.25;

	glBegin(GL_QUADS);

		glTexCoord2d(0+x,0+y);
		glVertex3f(-100, 100,0);

		glTexCoord2d(A+x,0+y);
		glVertex3f( 100, 100,0);

		glTexCoord2d(A+x,A+y);
		glVertex3f( 100,-100,0);

		glTexCoord2d(0+x,A+y);
		glVertex3f(-100,-100,0);


	  glEnd();



...........

		case WM_KEYDOWN:
		{
			if(keyup==true)
			{

			if( wParam ==VK_ESCAPE )
			 	PostQuitMessage(0);			 
			if( wParam ==VK_LEFT )
 				 	 x-=A;

			if( wParam ==VK_RIGHT )
 				 x+=A;

			if( wParam ==VK_UP )
 				  y+=A;

			if( wParam ==VK_DOWN )

				  y-=A;

				keyup=false;
			}




		}
		break;



		  case WM_KEYUP:
		{
			keyup=true;
		}
		break;

هذا حل سليم .. لكن المشكلة لو صارت الصورة ليست 4×4 ماتنقع هذي الطريقة

هل احد يملك مثال او معلومة بهذا الشأن . . .

تم تعديل هذه المشاركة بواسطة الشمري في 26 أغسطس 2006 في 20:52

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

السلام عليكم

الحل من وجهة نظري يجب قسمة الرقم 1 على عدد الاطارات الافقية و تخزينها في متغير

و قسمة الرقم 1 على عدد الاطارات الرأسية و تخزينها في متغير

float  FrameX  = 1 \  5;

float  FrameY  = 1 \  3;

على افتراض ان الصورة تحتوي خمسة عشر اطارا موزعة على خمسة اطارات افقية و ثلاثة رأسية

آسف لعدم ارفاق مثال لانني قمت باعادة تنصيب النظام و لذلك جهازي حاليا لا يحتوي على بيئة فيجول ستديو للتأكد من عمل المثال

لكنني كنت جربته قبل فترة و نجحت بشكل ممتاز

تحياتي

#3

لا املك كمبيوتر حاليا والاتصال من المقهى فممكن أتأخر في تجريب الكود وثم الرد.

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

الحمدلله .. النتيجة مرضية .

مشكور يا اخي " الكون" وأكثر الله من أمثالك .

كانت مشكلتي الاساسية طوال هذه المدة هي

static float  A =(float)1/4;

كنت اكتبها كذا

static float  A =1/4;

فتصبح قيمة A صفر .. لا أعلم ماهو السبب !!!

نحتاج للسؤال في منتدى السي .

على العموم الكود كامل بالمرفقات

والكود التالي هو الجزئية المهمة منه .

static float  A =(float)1/4;
static float  B =0;
long c =0;


/**************** Important *********************/ 

void Render()
{
	long a =GetTickCount();

	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 	glLoadIdentity();

	/// Alpha
	glDisable(GL_DEPTH_TEST);
	glEnable(GL_BLEND);
 	glBlendFunc(GL_DST_ALPHA,GL_SRC_ALPHA);
	glColor4f(1,1,1,0.999);
	glEnable(GL_DEPTH_TEST);
	////





	glTranslatef(0,0,-12);
 	glBindTexture(GL_TEXTURE_2D,ID); 

 	glBegin(GL_QUADS);
		glTexCoord2f(B, 0); 
		glVertex3f(-1, -1,0);

		glTexCoord2f(A,0);
		glVertex3f( 1 , -1,0);

		glTexCoord2f(A,1);
		glVertex3f( 1, 1,0);

		glTexCoord2f(B,1);
		glVertex3f(-1, 1,0);
	  glEnd();

   long b =GetTickCount();

   // Timer 
   c+=b-a;
   if(c>100)
   {
	A+=(float)1/4;
	B+=(float)1/4;
	c=0;
   }

	if(A>1)
	{
	A=(float)1/4;
	B=0;
	}

}

GL_SPRITE.zip

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

يبدو أن الخطأ كان بسبب ال cast.

1 / 4 تعتبر قسمة بين أعداد طبيعية أي أن النتيجة 0، لذلك من الأفضل التأكيد على نوع القيمة من أجل المحافطة على الأجزاء بعد الفاصلة بإستخدام 1.0 مثلا.

هذا الموضوع مغلق.

مواضيع مشابهة