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

( المشروع مكتمل ) ورشة عمل للعبة السفينة

مثبّترائج
بدأه sayedf1 في 31 يوليو 2008 · 376 رد · 58,146 مشاهدة · في ورش العمل والتطوير , والمشاريع والألعاب
مشاركة: واتساب X فيسبوك تيليجرام
#101

السلام عليكم

إذا كنت قد درست AI فتستطيع عمل AI لأي سفينه (ما عدا سفينة اللاعب) عن طريق إستخدام fuzzy logic بدمجها مع states

لعمل ذكاء جميل جدا

عيوبها إنها صعبه أيضا تستخدم حسابات كثيره

إذ كنت لم تدرسه بعد فأسهل طريقه بستخدام states فقط

عيوبها أنها

بدائيه جدا

غير دقيقه في بعض الحالات

وأضا التصرفات تكون واضحه أنها مستطنعا

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

إذا كان state هي escape

فإنا تنفيدها يكون كالتالي

إذا كان هناك مكان واحد وثابت للهروب له

فتستطيع إستخدام A Star

كأفضل الحلول

أما إذا كان هناك أكثر من مكان للهروب له

فتستخدم خوارزمية Dijkstra

أو إذا تريد أبسط حل فتستطيع إستخدام

خوارزمية الهروب و المطارده المعروفه لكن النتائج ستكون غير جميله

أعتدر على الإختصار فالموضوع كبير جدا

أيضا لاتنسوا أنه AI أصعب من Graphic

لذلك يجب أن تعطوه حقه

بالتوفيق

#102

اخي العزيز الai الذي تتكلم عنه صعب و معقد بطريقة لا يفهمها عقلي انا درست الai و لكن هل تتصور اني اعمل ai في هذه اللعبة مثلا اعمل للسفينة الاشياء التالية :

logical AI

pattern recognition

inference

هذا مستحيل هذه اخي ليست لعبة halo 3 او transformers دا احنا بنشتغل على اد ما ربنا يقدرنا ان اعمل ذكاء اصطناعي بسيط بالبرمجة العادية ليه ادخل في اوامر الsearch & pattern recognition إن شاء الله بعد عشر سنين ابقى اخلص الكود

#103

السلام عليكم

لقد أوضحت عدة طرق وبعدة مستويات فإختاروا ما يناسبكم

بالتوفيق

#104

نحتاج الى فريق برمجة اكبر

المهم -

هل وضعت الخريطة التي تشبه الردار ؟

-------------------

فكرة :

هل اللعبة ستحتوي على miltiplayer

اظن بتكون اكثر من للاعب حلوة

واذا كانت في النت بيصير يكونوا افرقة و ...

----------------------

فكرة :

يتم انشاء عدة اسلحة في السفن وتحتاج الى تطوير وتطوير يستهلك عدة اشياء

يعني نقدر نجعل اللاعب عنده مال التطوير لصاروخ الوحد من النوعية (..) يستهلك مال معين

-----

لا اعلم ان الفكرة اعجبتكم لو لا

-----------

اخي سيد انت من اين جبت الصور ؟

اذكر من قبل بحثت لكن ما حصلت !!

انت عندي 3d max على الجهاز وبتعرف شوي اليه ؟

startingprogremmer.jpg
#105
mafia_alex كتب:
لنفرض ان القرصان هو الاحمر و الاسود هوالصديق ماذا تريدني ان افعل عندما يري هذا القرصان السفينة الصديقة بالضبط ام انت تريدني ان احمل بالكود للسفينة الصديقة اي اجعلها عندما تري سفينة العدو تهرب فقط

شوف الصورة التوضيحية هنا

اريد من القرصان أن يهرب لأن سفينته فيها شفرة دخول الجزيرة و اللاعب يريد هذه الشفرة

و طبعاً عليه أن يحدد مساره جيداً حتى لا يصطدم بصخرة و لا تدركه سفينة اللاعب

نريد أن يكون الذكاء الإصطناعي مستويات

بمعني أن يكون هناك عدة مستويات للعبة .. صعب و متوسط و سهل مثلاً

و في حالة السهل تكون سفينة القراصنة غبية فأحياناص تغفل و تصطدم بصخرة فتدركها سفينة اللاعب و أحياناً آخرى تستطيع الهروب و لكنها لم تحسب حساباً بأن سفينة اللاعب ستدور حول الصخرة و تأتي لها من الناحية الآخرى

طبعاً هذا فقط في البداية

لدينا العديد من عمليات الذكاء الإصطناعي بعد ذلك في عندما يدخل اللاعب إلى السفينة ليأخذ الشفرة و يقاتل القراصنة الذين بالداخل و كيف سيتصرف القراصنة

و عندما يدخل إلى الجزيرة و يقابل الحيوانات (ربما نعمل دوال للغباء الإصطناعي) و يقابل سكان الجزيرة و يقاتلهم

#106

هذه الدوال لتحميل الصور

struct Image { unsigned long sizeX; unsigned long sizeY; char *data; };
GLuint texture[1], maya, rock;
typedef struct Image Image;
void ImageLoad(char *filename, Image *image)
{	FILE *file;
	unsigned long size, i;
	unsigned short int planes, bpp;
	char temp;
	file = fopen(filename, "rb");	
	fseek(file, 18, SEEK_CUR);
	fread(&image->sizeX, 4, 1, file);
	fread(&image->sizeY, 4, 1, file);
	size = image->sizeX * image->sizeY * 3;
	fread(&planes, 2, 1, file);
	fread(&bpp, 2, 1, file);
	fseek(file, 24, SEEK_CUR);
	image->data = (char *) malloc(size);
	fread(image->data, size, 1, file);
	for (i=0;i<size;i+=3)
	{	temp = image->data;
		image->data = image->data[i+2];
		image->data[i+2] = temp;		}		}
void LoadGLTextures()
{	Image *image1,*mimage, *rimage;
	image1 = (Image *) malloc(sizeof(Image));
	ImageLoad("safina.bmp", image1);
	glGenTextures(1, &texture[0]);
	glBindTexture(GL_TEXTURE_2D, texture[0]);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data);
	mimage = (Image *) malloc(sizeof(Image));
	ImageLoad("maya.bmp", mimage);
	glGenTextures(1, &maya);
	glBindTexture(GL_TEXTURE_2D, maya);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, 3, mimage->sizeX, mimage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, mimage->data);
	rimage = (Image *) malloc(sizeof(Image));
	ImageLoad("sa5ra.bmp", rimage);
	glGenTextures(1, &rock);
	glBindTexture(GL_TEXTURE_2D, rock);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, 3, rimage->sizeX, rimage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, rimage->data);		}

طبعاً دالة imageload نقلتها من موقع GameDev

أجريت عدة محولات لعمل دالة لتحميل الصور من الصفر و لكن فشلت

سأكمل هذا الأمر عندما أفرغ من اللعبة

هذا كلاس الصخور

class Rock
{	public:	float sz,x,z,theta;
			Rock(float S ,float X, float Z, float T);
			void DrawRock();			};
Rock::Rock(float S, float X, float Z,float T)
{	x = X;
	z = Z;
	sz = S;
	theta = T;	}
void Rock::DrawRock()
{	glBindTexture(GL_TEXTURE_2D, rock);
	glBegin(GL_QUADS);
		glTexCoord2f(0.0f, 0.0f); glVertex2f(Zoom*(x+sz*cos(-2.35619449+theta)), Zoom*(z+sz*sin(-2.35619449+theta)));
		glTexCoord2f(1.0f, 0.0f); glVertex2f(Zoom*(x+sz*cos(-0.7853981634+theta)), Zoom*(z+sz*sin(-0.7853981634+theta)));
		glTexCoord2f(1.0f, 1.0f); glVertex2f(Zoom*(x+sz*cos(0.7853981634+theta)), Zoom*(z+sz*sin(0.7853981634+theta)));
		glTexCoord2f(0.0f, 1.0f); glVertex2f(Zoom*(x+sz*cos(2.35619449+theta)), Zoom*(z+sz*sin(2.35619449+theta)));
	glEnd();		}

و هذا كلاس السفن

class Ship
{	public:	float theta, theta2, omega, alfa, acceleration, speed, x, z;
			int type, health;
			Ship(int ty, float X, float Z);
			void DrawShip();
			void MoveShip();
			void	MoveForward();
			void MoveBackward();
			void TurnLeft();
			void TurnRight();
			void Break();		};
Ship::Ship(int ty, float X, float Z)
{	x = X;
	z = Z;
	type = ty;
	theta = omega = alfa = acceleration = speed = 0;
	health = 100;	}
void Ship::DrawShip()
{	glBindTexture(GL_TEXTURE_2D, texture[0]);
	glBegin(GL_QUADS);
		glTexCoord2f(0.0f, 0.0f); glVertex2f(Zoom*(x+0.3*cos(-2.35619449+theta)), Zoom*(z+0.3*sin(-2.35619449+theta)));
		glTexCoord2f(1.0f, 0.0f); glVertex2f(Zoom*(x+0.3*cos(-0.7853981634+theta)), Zoom*(z+0.3*sin(-0.7853981634+theta)));
		glTexCoord2f(1.0f, 1.0f); glVertex2f(Zoom*(x+0.3*cos(0.7853981634+theta)),Zoom*( z+0.3*sin(0.7853981634+theta)));
		glTexCoord2f(0.0f, 1.0f); glVertex2f(Zoom*(x+0.3*cos(2.35619449+theta)), Zoom*(z+0.3*sin(2.35619449+theta)));
	glEnd();							}
void Ship::MoveShip()
{	z += speed*sin(theta2+1.570796325);
	x += speed*cos(theta2+1.570796325);
	speed += acceleration;
	if (speed > 0.04)
		speed = 0.04;
	else if (speed < -0.04)
		speed = -0.04;
	theta2 = theta += omega;
	if (theta > 3.141592654) theta -= 2*3.141592654;
	else if (theta < 0) theta += 2*3.141592654;	}
void Ship::MoveForward()
{	acceleration = 0.0005;	}
void Ship::MoveBackward()
{	acceleration = -0.0005;	}
void Ship::TurnLeft()
{	if (!omega)
		omega = 0.05;
	else if (omega < 0)
		omega = 0;
	else omega = 0.05;	}
void Ship::TurnRight()
{	if (!omega)
		omega = -0.05;
	else if (omega > 0)
		omega = 0;
	else omega = -0.05;	}
void Ship::Break()
{	acceleration = 0; 
	if (speed > 0.01)
		speed -= 0.01;
	else if (speed < -0.01)
		speed += 0.01;
	else	 speed = 0;
		omega *= 0.5;	}

و هنا قمت بتعريف كائن من فئة السفينة على أن تكون هذه هي سفينة اللاعب

Ship S(0,0,0);

و هذه دالة رسم المياه

void DrawWater()
{	glBindTexture(GL_TEXTURE_2D, maya);
	glBegin(GL_QUADS);
		for (int i = -100; i < 100; i++)
		for (int j = -100; j < 100; j++)
		{	glTexCoord2f(0.0f, 0.0f); glVertex2f(i*Zoom,Zoom*(j-1));
			glTexCoord2f(1.0f, 0.0f); glVertex2f(Zoom*(i+1),Zoom*(j-1));
			glTexCoord2f(1.0f, 1.0f); glVertex2f(Zoom*(i+1),Zoom*j);
			glTexCoord2f(0.0f, 1.0f); glVertex2f(Zoom*i,Zoom*j);		}
	glEnd();							}

و هنا تم تعريف بعض السفن و بعض الصخور

Ship A[5] = {Ship(1,1,1),Ship(1,-1,0.7),Ship(1,2,-1),Ship(1,0.4,-1.5),Ship(1,0.3,3)};
Rock R[10] = {Rock(0.5,23,3,0.5),Rock(0.4,3,3,1.52),Rock(0.4,-4,-3,2.3),Rock(0.5,1,-2,0),Rock(0.5,0,3,1.9),
			Rock(0.4,-13,3,3.6),Rock(0.5,-23,-3,4.6),Rock(0.6,-6,1,6.0),Rock(0.5,-3,-1,4.1),Rock(0.4,0,-5,3.5)};

و هذه الدالة الرئيسية التي فيها كل ما يحدث في اللعبة

void display()
{	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	S.MoveShip();
	DrawWater();
	for (int i = 0; i < 5; i++)
		{	A.MoveShip();
			TasadomSS(&S,&A);
			A.DrawShip();	}
	for (int i = 0; i < 10; i++)
		{	R.DrawRock();
			TasadomSR(&S,R);
			for (int j = 0; j < 5; j++)
				TasadomSR(&A[j],R);	}
	glLoadIdentity();
	glTranslated(-S.x*Zoom,-S.z*Zoom,0);
	S.DrawShip();
	glFlush();
	glutSwapBuffers();			}

طبعاً قمت بإستدعاء لدوال التصادم هنا و لكني لم أذكرها لأني حالياً أقوم ببعض التعديلات عليها لتكون أكثر دقة

بالنسبة للتصادم قمت بعمل هذه الدوال

الدالة الآولى أمرر لها خطان و تقول لي هل هما متقاطعان أم لا

الدالة الثانية أمرر لها مضلعان و تقول لي هل هما متقاطعان أم لا

typedef struct {float X1,X2,Y1,Y2;} line;
int Takato3(float X1,float X2, float X3, float X4, float Y1, float Y2, float Y3, float Y4)
{	float M,M2,B,B2,NX,NY;
	if (X1 == X2)
		X1 += 0.00001;
	 if (X3 == X4)
		X3 += 0.00001;
	M = (float)(Y2-Y1)/(X2-X1);
	M2 = (float)(Y4-Y3)/(X4-X3);
	B = Y2 - X2*M;
	B2 = Y4 - X4*M2;
	NX = (float)(B2-B)/(M-M2);
	NY = M2*NX+B2;
	if ((float)(sqrt((Y2-NY)*(Y2-NY)+(X2-NX)*(X2-NX))+sqrt((NY-Y1)*(NY-Y1)+(NX-X1)*(NX-X1))) == (float)sqrt((Y2-Y1)*(Y2-Y1)+(X2-X1)*(X2-X1)) &&
		(float)(sqrt((Y4-NY)*(Y4-NY)+(X4-NX)*(X4-NX))+sqrt((NY-Y3)*(NY-Y3)+(NX-X3)*(NX-X3))) == (float)sqrt((Y4-Y3)*(Y4-Y3)+(X4-X3)*(X4-X3))	)
		return 1; else return 0;		}
int Modala3(line A[], line B[], int As, int Bs)
{	for (int i = 0; i < As; i++)
	for (int j = 0; j < Bs; j++)
	if (Takato3(A.X1,A.X2,B[j].X1,B[j].X2,A.Y1,A.Y2,B[j].Y1,B[j].Y2))
		return 1;
	return 0;						}

أما دالة تصادم السفن قمت بعمل شئ مثل هذا و سأقوم ببعض التعديلات عليه ليكون أكثر دقة

void TasadomSS(Ship *SHIP, Ship *SHIP2)
{	line SH[14],SH2[14];
	float S1 = SHIP->speed ,S2 = SHIP2->speed;
	float O1 = SHIP->omega, O2 = SHIP2->omega;
		SH[13].X2 = SH[0].X1 = 0.146751*cos(0.463648+SHIP->theta)+SHIP->x;
		SH[13].Y2 = SH[0].Y1 = 0.146751*sin(0.463648+SHIP->theta)+SHIP->z;
		SH[0].X2 = SH[1].X1 = 0.189634*cos(0.156602+SHIP->theta)+SHIP->x;
		SH[0].Y2 = SH[1].Y1 = 0.189634*sin(0.156602+SHIP->theta)+SHIP->z;
		SH[1].X2 = SH[2].X1 = 0.143735*cos(0.361441+SHIP->theta)+SHIP->x;
		SH[1].Y2 = SH[2].Y1 = 0.143735*sin(0.361441+SHIP->theta)+SHIP->z;
		SH[2].X2 = SH[3].X1 = 0.090606*cos(0.683191+SHIP->theta)+SHIP->x;
		SH[2].Y2 = SH[3].Y1 = 0.090606*sin(0.683191+SHIP->theta)+SHIP->z;
		SH[3].X2 = SH[4].X1 = 0.095793*cos(1.030377+SHIP->theta)+SHIP->x;
		SH[3].Y2 = SH[4].Y1 = 0.095793*sin(1.030377+SHIP->theta)+SHIP->z;
		SH[4].X2 = SH[5].X1 = 0.084586*cos(-1.590402+SHIP->theta)+SHIP->x;
		SH[4].Y2 = SH[5].Y1 = 0.084586*sin(-1.590402+SHIP->theta)+SHIP->z;
		SH[5].X2 = SH[6].X1 = 0.092645*cos(-2.669815+SHIP->theta)+SHIP->x;
		SH[5].Y2 = SH[6].Y1 = 0.092645*sin(-2.669815+SHIP->theta)+SHIP->z;
		SH[6].X2 = SH[7].X1 = 0.131260*cos(-2.706509+SHIP->theta)+SHIP->x;
		SH[6].Y2 = SH[7].Y1 = 0.131260*sin(-2.706509+SHIP->theta)+SHIP->z;
		SH[7].X2 = SH[8].X1 = 0.194065*cos(-3.003350+SHIP->theta)+SHIP->x;
		SH[7].Y2 = SH[8].Y1 = 0.194065*sin(-3.003350+SHIP->theta)+SHIP->z;
		SH[8].X2 = SH[9].X1 = 0.142459*cos(2.625362+SHIP->theta)+SHIP->x;
		SH[8].Y2 = SH[9].Y1 = 0.142459*sin(2.625362+SHIP->theta)+SHIP->z;
		SH[9].X2 = SH[10].X1 = 0.059869*cos(2.276365+SHIP->theta)+SHIP->x;
		SH[9].Y2 = SH[10].Y1 = 0.059869*sin(2.276365+SHIP->theta)+SHIP->z;
		SH[10].X2 = SH[11].X1 = 0.101758*cos(1.668842+SHIP->theta)+SHIP->x;
		SH[10].Y2 = SH[11].Y1 = 0.101758*sin(1.668842+SHIP->theta)+SHIP->z;
		SH[11].X2 = SH[12].X1 = 0.116400*cos(1.069192+SHIP->theta)+SHIP->x;
		SH[11].Y2 = SH[12].Y1 = 0.116400*sin(1.069192+SHIP->theta)+SHIP->z;
		SH[12].X2 = SH[13].X1 = 0.090667*cos(0.528074+SHIP->theta)+SHIP->x;
		SH[12].Y2 = SH[13].Y1 = 0.090667*sin(0.528074+SHIP->theta)+SHIP->z;
		SH2[13].X2 = SH2[0].X1 = 0.146751*cos(0.463648+SHIP2->theta)+SHIP2->x;
		SH2[13].Y2 = SH2[0].Y1 = 0.146751*sin(0.463648+SHIP2->theta)+SHIP2->z;
		SH2[0].X2 = SH2[1].X1 = 0.189634*cos(0.156602+SHIP2->theta)+SHIP2->x;
		SH2[0].Y2 = SH2[1].Y1 = 0.189634*sin(0.156602+SHIP2->theta)+SHIP2->z;
		SH2[1].X2 = SH2[2].X1 = 0.143735*cos(0.361441+SHIP2->theta)+SHIP2->x;
		SH2[1].Y2 = SH2[2].Y1 = 0.143735*sin(0.361441+SHIP2->theta)+SHIP2->z;
		SH2[2].X2 = SH2[3].X1 = 0.090606*cos(0.683191+SHIP2->theta)+SHIP2->x;
		SH2[2].Y2 = SH2[3].Y1 = 0.090606*sin(0.683191+SHIP2->theta)+SHIP2->z;
		SH2[3].X2 = SH2[4].X1 = 0.095793*cos(1.030377+SHIP2->theta)+SHIP2->x;
		SH2[3].Y2 = SH2[4].Y1 = 0.095793*sin(1.030377+SHIP2->theta)+SHIP2->z;
		SH2[4].X2 = SH2[5].X1 = 0.084586*cos(-1.590402+SHIP2->theta)+SHIP2->x;
		SH2[4].Y2 = SH2[5].Y1 = 0.084586*sin(-1.590402+SHIP2->theta)+SHIP2->z;
		SH2[5].X2 = SH2[6].X1 = 0.092645*cos(-2.669815+SHIP2->theta)+SHIP2->x;
		SH2[5].Y2 = SH2[6].Y1 = 0.092645*sin(-2.669815+SHIP2->theta)+SHIP2->z;
		SH2[6].X2 = SH2[7].X1 = 0.131260*cos(-2.706509+SHIP2->theta)+SHIP2->x;
		SH2[6].Y2 = SH2[7].Y1 = 0.131260*sin(-2.706509+SHIP2->theta)+SHIP2->z;
		SH2[7].X2 = SH2[8].X1 = 0.194065*cos(-3.003350+SHIP2->theta)+SHIP2->x;
		SH2[7].Y2 = SH2[8].Y1 = 0.194065*sin(-3.003350+SHIP2->theta)+SHIP2->z;
		SH2[8].X2 = SH2[9].X1 = 0.142459*cos(2.625362+SHIP2->theta)+SHIP2->x;
		SH2[8].Y2 = SH2[9].Y1 = 0.142459*sin(2.625362+SHIP2->theta)+SHIP2->z;
		SH2[9].X2 = SH2[10].X1 = 0.059869*cos(2.276365+SHIP2->theta)+SHIP2->x;
		SH2[9].Y2 = SH2[10].Y1 = 0.059869*sin(2.276365+SHIP2->theta)+SHIP2->z;
		SH2[10].X2 = SH2[11].X1 = 0.101758*cos(1.668842+SHIP2->theta)+SHIP2->x;
		SH2[10].Y2 = SH2[11].Y1 = 0.101758*sin(1.668842+SHIP2->theta)+SHIP2->z;
		SH2[11].X2 = SH2[12].X1 = 0.116400*cos(1.069192+SHIP2->theta)+SHIP2->x;
		SH2[11].Y2 = SH2[12].Y1 = 0.116400*sin(1.069192+SHIP2->theta)+SHIP2->z;
		SH2[12].X2 = SH2[13].X1 = 0.090667*cos(0.528074+SHIP2->theta)+SHIP2->x;
		SH2[12].Y2 = SH2[13].Y1 = 0.090667*sin(0.528074+SHIP2->theta)+SHIP2->z;
	if (Modala3(SH2,SH,14,14))
	{	SHIP->acceleration = -SHIP->acceleration;
		SHIP->speed = -SHIP->speed;
		SHIP->omega = -SHIP->omega;
		SHIP->MoveShip();
		SHIP->speed = SHIP->omega = SHIP->acceleration = 0;
		SHIP->health -= 5;	
		SHIP2->acceleration = -SHIP2->acceleration;
		SHIP2->speed = -SHIP2->speed;
		SHIP2->omega = -SHIP2->omega;
		SHIP2->MoveShip();
		SHIP2->speed = SHIP2->omega = SHIP2->acceleration = 0;
		SHIP2->health -= 5;	}
}

هنا قمت بتحديد الصورة بمضلع و مررت هذا المضلع إلى دالة تصادم المضلعات

و كان نتيجة التصادم أن يعود كل منهما من حيث آتى

فنعكس العجلة و السرعة و سرعة الدوران ثم يتوقف كل شئ

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

سأقوم بوضع ملف تنفيذي و الكود كاملاً لويندوز و آخر للينوكس قريباً إن شاء الله اليوم

#107

السلام عليكم

انا متابع الموضوع من بدايته .... و كنت اشاهد فقط .... اما بعد مشاركة اخى عمر الاخيرة الرائعة بصراحة لا يوجد رد كافى لمجهوده الجبار هذا

وفقكم الله اخوتى جميعا

ان شاء الله لما مستواى يتقدم شوية فى C++ سوف اشترك معكم باذن الله

#108

الكود كاملاً + الملف التنفيذي

لينوكس

التحريك: الزر w للأمام و s للخلف و a الإستدارة لليسار و d الإستدارة لليمين و q للفرامل أي لبتطيء السفينة كي تتوقف و الزر "+" للإنخفاض بمستوى النظر و الزر "-" للإرتفاع بمستوى النظر

تم عمل كل شئ في التصادم بدقة

نرجوا إختبار التصادم

إنتظروا بضع دقائق كي أقوم بنسخة ويندوز

Safina_Linux.zip

تم تعديل هذه المشاركة بواسطة omar_cplusplus في 16 أغسطس 2008 في 13:02

#110

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

#111
mafia_alex كتب:
ياريت نتكلم على الياهو علشان انا عايز اعرف التفاصيل مثلا احداثيات الجزيرة لكي اجعل القرصان يذهب لتلك الاحداثيات الخطوط المرتبطة بالتصادم لكي يتفاداها القرصان و انا الان اكتب الكود و الله المستعان

ربما هذه الصورة توضح الأمر

post-112912-1218890770_thumb.jpg

#112

السلام عليكم ورحمة الله

التصادم جيد لكن هناك اخطاء :

ازرار الحركة تعمل اما البعد لا

--------------------

امام : w - f8

خلف : f4 - s

يمين : 4 - d

يسار : 1 - a

فرامل : F2 - q

كاميرا (الابتعاد) : insert !!!!!

كاميرا (التقرب) : لا يوجد !!!!!

هذه المشاكل واجهتني طبعا نسخة ويندوز

وانا وندوزي xp

- نحتاج الى power الى السفينة

- الرادار

- السرعة (مو ضروري)

------------------------------

اللاحظ ان :

الخريطة تكون في اللعبة من الاعلى

اما السفينة فلا

يجب ان تكون من فوق

يعني خطا في الجرافيكس

startingprogremmer.jpg
#113
اقتباس
ازرار الحركة تعمل اما البعد لا

--------------------

امام : w - f8

خلف : f4 - s

يمين : 4 - d

يسار : 1 - a

فرامل : F2 - q

كاميرا (الابتعاد) : insert !!!!!

كاميرا (التقرب) : لا يوجد !!!!!

هذه المشاكل واجهتني طبعا نسخة ويندوز

وانا وندوزي xp

نسخة ويندوز قمت بها في خلال 7 دقائق أو أكثر قليلاً

قمت بنسخ الدوال التي في اللينوكس كما هي و قمت في دالة

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
						  WPARAM wParam, LPARAM lParam)

حيث قمت بكتابة هذا السطر

keyboard(wParam);

و هذه هي دالة keyboard

void keyboard(char k)
{	if (k == 'w' || k == 'W')
		S.MoveForward();
	else if (k == 's' || k == 'S')
		S.MoveBackward();
	else if (k == 'a' || k == 'A')
		S.TurnLeft();
	else if (k == 'd' || k == 'D')
		S.TurnRight();
	else if (k == 'q' || k == 'Q')
		S.Break();
	else if (k == '-')
		Zoom *= 0.99;
	else if (k == '+')
		Zoom *= 1.01;	}

نسخة ويندوز لم أراجعها جيداً مثل نسخة لينوكس

لأني ظننت أنهما متماثلان

ٍسأراجعها ...

اقتباس
اللاحظ ان :

الخريطة تكون في اللعبة من الاعلى

اما السفينة فلا

يجب ان تكون من فوق

يعني خطا في الجرافيكس

أي خطأ في الجرافكس ؟؟

#114

السلام عليكم

قبل كل شيء

أرجوا أن يأخد ردي على أنه إنتقاد بناء

سأبدء بوضع بعض الأشياء التي لم تعجبني كلاعب للعبه

1- حركت السفينه هي أكثر شيء لم يعجبني

فحركتها غير طبيعيه مثل :

الوقوف شبه المفاجئ

الحركه إلى الخلف

الدوران في دائره ثابته

الدوران حول مركزها

أيضا الدوران حول مركزها دون توقف

أيضا بالنسبه لي كلاعب

من الطبيعي أن أريد التحكم بسرعت السفينه بدقه أكبر

بالنسبه إلى كشف الصادم فهو جيد ولكن

حصل هناك خطأ تسبب في توقق السفينه إنظر في الصوره

أما بالنسبه لي كمبرمج

أعتقد أنه من الأفضل لو تقلل من إستخدام الدوال المثلثيه لأنها تستهلك قدرة المعالج

أيضا بالنسبه إلى الكود فهو غير قابل للتطوير من قبل الآخرين مثل دوال التصادم

أرجوا أن تأخد ردي على أنه نقد بنَاء

بالتوفيق

post-66921-1218893808_thumb.jpg

#115

جربت الكود

عمل موفق اخواني

الى الامام

#116

دا تحليلي شويه عشان نقدر نعمل حركه سفن القراصنه

اللعبه :

السفينه تتحرك في البحر بشكل عشوائي الى ان يتحقق شرط معين :

لما تبقى السفينه المقابله في مجال سفينه القراصنه

ويكون حسب انواع سفن القراصنه :

---------

المستوى الاول :

المجال : 3 اميال

المستوى الثاني:

المجال : 6 اميال

المستوى الثالث:

المجال: 10 اميال

---------

عندما تقع السفينه في مجال سفن القراصنه :

تتحرك نحوها حسب الاتي:

فنكشن هاتحسب اسرع طريقه للوصول

- الفنكشن هاتشوف موقع السفينه x,y وتشوف الطريق الى النقطه دي

- تتاكد ان مفيش صخور او سفن في المنتصف لان ساعتها لازم تغير الطريق

وسوف تفضل الفنكشن تبحث عن افضل طريقه للوصول مع الحركه الى ان يحصل احد الامرين

- توصل للسفينه

- تخرج خارج مجال الرؤيه

- ممكن نزود في حاله وصول السفينه الى مجال اطلاق النار

#117
اقتباس
1- حركت السفينه هي أكثر شيء لم يعجبني

فحركتها غير طبيعيه مثل :

الوقوف شبه المفاجئ

الحركه إلى الخلف

الدوران في دائره ثابته

الدوران حول مركزها

أيضا الدوران حول مركزها دون توقف

بالنسبة للدوران حول مركزها .. لا أدري هل هذا يحدث في الواقع أم لا

إن كان لا يحدث سألغيه و أجعل الدوران فقط في حالة الحركة

أما الرجوع إلى الوراء .. أيضاً لا أدري هل يحدث في الواقع أم لا ..

إن كان لا يحدث سألغيه ..

ما الذي تقترحه في موضوع الدوران ؟؟ هل تقصد أنه يحدث دون توقف بسبب الإحتكاك ؟؟ أم المشكلة في الدوران نفسه ؟؟

بالنسبة للوقوف سوف أقوم إن شاء الله بجعل التوقيف أقل من هذا ...

اقتباس
من الطبيعي أن أريد التحكم بسرعت السفينه بدقه أكبر

ماذا تريد أن تكون صورة تحديد السرعة ؟؟ هل مثلاً أضغط على زر كي تزيد السرعة ثم تقل نوعاً ما كلما سرت ثم أقوم بالضغط مرة آخرى فتزيد السرعة ؟؟ أم ماذا تقصد ؟؟

اقتباس
حصل هناك خطأ تسبب في توقق السفينه إنظر في الصوره

موضوع إنحشار السفينة لاحظته و لكن كان بعد أن رفعت التعديل الأخير

و جاري تعديله إن شاء الله

اقتباس
أعتقد أنه من الأفضل لو تقلل من إستخدام الدوال المثلثيه لأنها تستهلك قدرة المعالج

لا غنى لأي لعبة عن الدوال المثلثية ... و طالما أن اللعبة إلى الآن تعمل بصورة جيدة و ليس هناك بطء فلا بأس بها

اقتباس
أيضا بالنسبه إلى الكود فهو غير قابل للتطوير من قبل الآخرين مثل دوال التصادم

لاحقاً إن شاء الله سأضع شرح لهذه الدوال ...

rewsh كتب:
دا تحليلي شويه عشان نقدر نعمل حركه سفن القراصنه

اللعبه :

السفينه تتحرك في البحر بشكل عشوائي الى ان يتحقق شرط معين :

لما تبقى السفينه المقابله في مجال سفينه القراصنه

ويكون حسب انواع سفن القراصنه :

سفينة القراصنة ستقوم بالهروب و ليس بالمطاردة

لذلك إذا كانت سفينة اللاعب في مجال سفينة القراصنة فإنها ستقوم بتحديد طريق جيد للهروب

#118

تمام إن شاء الله الكود حيكون جاهز في اقرب وقت ولكن في سؤال هل اخلى السفينة بعد ما تدخل في احداثيات ما بعد الاورجن تذهب على االصخرة دي علطول

تم تعديل هذه المشاركة بواسطة mafia_alex في 16 أغسطس 2008 في 17:16

#119
اقتباس
ما الذي تقترحه في موضوع الدوران ؟؟ هل تقصد أنه يحدث دون توقف بسبب الإحتكاك ؟؟ أم المشكلة في الدوران نفسه ؟؟

نعم الدواران بسبب الإحتكاك

اقتباس
ماذا تريد أن تكون صورة تحديد السرعة ؟؟ هل مثلاً أضغط على زر كي تزيد السرعة ثم تقل نوعاً ما كلما سرت ثم أقوم بالضغط مرة آخرى فتزيد السرعة ؟؟ أم ماذا تقصد ؟؟

أو تستطيع أن تجعلها تزيد بدون نقصان

يعني مثلا كل مره أضغط ال W تزيد سرعتها 10 متر لكل ثانيه

#120

تمام اخي عمر

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

163374357.gif

#121

بعرف اني متأخر كتير

ولكن الظروف منعتني في الاسبوعين الماضيين من الدخول !!! :(

هل يمكن أن أجد عملا الآن في الغرافيكس ؟؟؟

MAAAAAAAAAAAAAAAAAAAAAAAC

#122
hunterxhunter كتب:
نعم الدواران بسبب الإحتكاك

أو تستطيع أن تجعلها تزيد بدون نقصان

يعني مثلا كل مره أضغط ال W تزيد سرعتها 10 متر لكل ثانيه

في الأصل السرعة تزيد تدريجياً في حالة سيرها دون تدخل مني

و ليس هناك إحتكاك في حالة السير لأن هناك acceleration و ليس سرعة فقط

و يمكنني التحكم بالسرعة عن طريق الفرامل لتقليلها مع إطفاء الacceleration و عن طريق إرجاعها للوراء و جعلها تتقدم للأمام

هذا الذي يتحكم بالسرعة

أما بالنسبة للدوران فقد ألغيت الalfa و أصبحت السفينة تدور بالomega فقط فسرعة الدوران ثابتة

و سوف أضع لها إحتكاك إن شاء الله

اقتباس
تمام إن شاء الله الكود حيكون جاهز في اقرب وقت ولكن في سؤال هل اخلى السفينة بعد ما تدخل في احداثيات ما بعد الاورجن تذهب على االصخرة دي علطول

سفينة القراصنة عندما تدخل في مجال سفينة اللاعب فإنها تفر و تهرب

و إذا وجدت صخرة تبعد عنها بقيمة 0.3 ستلف من حولها حتى لا تصطدم بها

طبعاً ستفر حتى تخرج عن المجال

اقتباس
هل يمكن أن أجد عملا الآن في الغرافيكس ؟؟؟

لقد قمت بالجرافكس

هل تستعمل OpenAL ؟؟

#123
The Tornado كتب:
بعرف اني متأخر كتير

ولكن الظروف منعتني في الاسبوعين الماضيين من الدخول !!! :(

هل يمكن أن أجد عملا الآن في الغرافيكس ؟؟؟

ابدأ العمل من الأن

163374357.gif

#124

القراصنه التهرب

اوك مش مشكل بس مش مقتنع بيها قوي

--------------

هانعتمد بردو على نوع السفينه

وهانعتمد على مجال الرؤيه كعامل اساسي

--------------

عندما تدخل السفينه في مجال رؤيه القراصنه

تبحث عن احسن طريق للهرب ومن بعدها تقدر تمشي بشكل عشوائي

---------------

احسن طريق للهرب هايعتمد على الاتي :

احداثيات الخريطه

- التاكد اني مش في نهايه الخريطه ولا في البدايه بحيث ماطلعش بره الخريطه

- ان كانت السفينه اعلى سفنيه القراصنه

تتجه الى اسفل

- ان كانت الى اسفل تتجه الى اعلى

- انا كانت يمين تتجه شمال وهكذا

---------------

المفروض ايضا تتاكد من عدم وجود صخور في طريقها

وان صادف ان في مجال حركتها صخور تتجه بزاوير

المفروض الان ماهو المفروض نعمل عليه برمجيا؟

#125

-البحر يجب ان يتحرك (اظن مو وقته الان)

- اول ما تتحرك السفينة تكون بطيئة (تشغيل المحركات :))

- من اترك زر الدوران تتوقف السفينة عن الدوران

- لا اظن بانه يوجد (الرجوع الى الخلف)

-صورة السفينة يجب ان تكون من الاعلي (صحيح انها الان من الاعلى لكن يوجد انحراف في زاوية)

-------------------------------------------

view

من الاعلى فقط لا يعجبني

يعني تعمل الزر v لوضعية الكاميرا

startingprogremmer.jpg

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