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

عقبة ..اوقفتني عن اكمال 2d engine

مغلق
بدأه Abdullah.Alshammeri في 5 يوليو 2005 · 4 رد · 565 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

الان اطور محرك 2D .. يعتمد على OPENGL والحمدلله الامور ماشية تمام .

لكن المشكلة :

سويت كلاس خاص بالاكساء ..

والوضع سليم

لكن هناك مشيكلة : )

احاول تصميم دالتين :

الاولى تحمل الصورة ولها بارمترين الاول رح يكون اسم الصورة الثاني رح يكون متغير اما نصي او رقمي حى اخزن فيه هذه الصورة ..

كذا

LOADTEXTURE(char*image,char*name_of_texture);

الدالة الثانية :

تعين الاكساء اللي اختاره على المجسم الذي اختاره :

مثلا

SetTexture(char *name_of_texture,char*name_of_object);

انا اللي استطعت اني انجح فيه هو اني استطيع ان اختار اسم المجسم الذي اريد تطبيق الاكساء عليه..

لكن لم استطع اختيار الصورة اللي اريد ..

يعني لو حملت عشر صور ..

مثلا :

loadtexture("image1.bmp,"texture1");
حيث texture1 هو الاسم الذي اخترته لهذا الاكساء ..

loadtexture("image2.bmp,"texture2");

loadtexture("image3.bmp,"texture3");

loadtexture("image4.bmp,"texture4");

لان انا اريد ان انشئ شكل مربع مثلا وهذا سهل

drawSquare("sq1");

حيث sq1 هو الاسم الذي اخترته لهذا الشكل..

الان اريد ان اطب الاكساء

SetTexture("texture3,"sq1);

يعني اخترت نوع الاكساء والمجسم الذي اريد اكسائه ..

المشكلة :

استطيع ان اختار المجسم الذي اريد اكساء لو كان عندي 1000 مجسم ..

لكن لا استطيع ان اختار الاكساء الذي اريده حتى لو كتبت اسمه .. انما الذي يحدث انه سيختار اخر اكساء تم تحميله ...

السؤال :

اريد نصيحة او توجيه .. او فكرة عامة لاتمكن من عمل كائن الاكساء بالشكل السابق ..

اعرف انه من الصعب الحصول على الجواب السليم .. لكن لو على الاقل فكرة .. او تلميحة اتمكن من خلالها اجتياز هذه العقبة ..

يعني المسألة ليست اتقان ومعرفة لمكتبة opengl انما معرفة بـOOP وذكاء ...

وان شاء الله .. القى احد يعرف الجواب ..

لان المسألة غامضة شوي .. لكن قلت ممكن اجد جوابا ..

"

للمعلومية الفكرة السابقة اخذتها من احد المحركات .. لاحظوا ..

	LoadTexRet=pScene->LoadTexture ("..\\..\\..\\Media\\texture.bmp", -1, -1, "TeapotTexture");

ثم 
	pTeapot->CreateTeapot ();
ثم 
	pTeapot->SetTexture (pGlobals->GetTex("TeapotTexture"),-1);

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

لست متأكدا اذا كنت قد عرفت طلبك ام لا..

انت تريد تحمل صورة مثلا و تعطيها اسم, بحيث من الان فصاعدا تتعامل الصورة بالاسم فقط .. بحيث لما تذكر اسمها فانت تقصد الصورة اللتي اعطيتها الاسم. صح؟

تستطيع استخدم std::map

حيث هو container ( مثل list) لكنه Pair Associative Container

مهمته هي بالظبط اللي تريده: تخزن شيء من نوع معين و تصل اليه بشيء ثاني.

ما اعرف شلون اشرحها .. يعني يعمل association او ربط بين الشيء الأول و الشيء الثاني (و اللي هو الـ key)

لنفرض ان الصورة هي من نوع Texture, فنحن نريد ربطها بـ char * فقد نقوم بشيء مثل:

#include <map>
using namespace std;

....

map< char*, Texture* > textureMap;

Texture * t = new Texture("C:\file.bmp");

// لتخزين الصور مع اعطائها اسم معين
textureMap["picture1"] = t;
textureMap["picture2"] = new Texture("C:\file2.jpg");

...
// للحصول على الصور عن طريق الاسماء اللتي اعطيناها اياها
Texture * t = textureMap["picture1"];

لاحظ السطر:

map< char*, Texture* > textureMap;

حيث textureMap هو اسم المتغير, بينما

map< char*, Texture* >

هو النوع, و لاحظ هنا استخدام template و اذ ما تعرفهة مو مشكلة, المهم ان اول شي هو الـ key و في هذه الحالة هو كلمة string يعني.

و الشي الثاني هو الشي اللي نريد تخزينه, و في هذه الحالة نتعامل مع مؤشرات لكلاس افتراضي هو Texture (أقول افتراضي لانه شي اخترعته للتو و ليس جزء من مكتبة معينة)

بإمكانك قراءة هذه الصفحة (بالانجليزي)

http://www.cprogramming.com/tutorial/stl/stlmap.html

بس احذر لا تسوي شي مثل:

void loadTexture( char * fileName, char * textureName )
{
    Texture t( fileName ); // this object will be on the stack
    textureMap[ textureName ] = &t;  //address of an object on the stack
}

لانه بنهاية الدالة سيختفي الـ t هذا, و سيصبح عندك مؤشر لكائن غير موجود.

#3

لست متأكدا اذا كنت قد عرفت طلبك ام لا..

انت تريد تحمل صورة مثلا و تعطيها اسم, بحيث من الان فصاعدا تتعامل الصورة بالاسم فقط .. بحيث لما تذكر اسمها فانت تقصد الصورة اللتي اعطيتها الاسم. صح؟

===

صح هذا ما اريده ..

بالنسبة لل map هذا اول مرة اعرفه : )

اتابع الرابط الان وارد عليك ..

لكن للمعلومية ..

المستخدم هو من يحدد اسم الصورة + الصورة.. وممكن يخزن حتى 100 صورة او اكثر .. هل map ثقيلة على الرام .. : ) ما اعرف عنها شي .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

لا اعتقد ان الـ map نفسها ستسبب مشكلة من ناحية الرام ..

لكن الصور نفسها .. ممكن .. لا اعرف.

ممكن يساعدك ان استخدم المؤشرات, لكي تنشيء الكائنات مرة واحد و تتعامل مع عناوينها فقط, بدل من انشاء نسخة جديدة كلما اردت استخدامها.

#5

لم افهم مشكلتك بالتحديد

بافتراض هذا كلاس الخامات

class CTexture
{
public:
CTexture();
~CTexture();
BOOL LoadTexture(char *FileName);
CTexture* GetTexture(); // هذا يرجع لك كائن الخامه ! ! 
private:
protected:

};
class CObject
{
CObject();
~CObject();
BOOL SetTexture(CTexture* Texture);
};

BOOL CObject::SetTexture(CTexture*Texture)
{
// set texture here
return TRUE;
}
Example : 

CTexture g_Texture;
CObject  g_Object;
g_Texture.LoadTexture("ahmed.jpg");
g_Object.SetTexture(&g_Texture);

تم تعديل هذه المشاركة بواسطة احمد صالح في 8 يوليو 2005 في 19:14

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

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

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