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

أريد تحريك هذه الرسمة عن طريق الكيبورد (بالاسهم)

بدأه مدمن ++C في 12 يونيو 2009 · 6 رد · 1,898 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

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

يعني لما اضغط يسار تتحرك الرسمة لليسااار

وتظل تتحرك حتى ارفع اصبعي عن الزر

وهذا هو الكود

 

# pragma comment (lib, "opengl32.lib")   
# pragma comment (lib, "glu32.lib")	  //المكتبات
# pragma comment (lib, "glaux.lib")

#include <windows.h> 
#include <stdio.h>
#include <gl\gl.h>   //استدعاء المكتبات
#include <gl\glu.h>	
#include <gl\glaux.h> 
#include "in.h"
#include <glut.h>

void moraba3(float x1, float y1, float x2, float y2)//النقاط
{
 glBegin(GL_QUADS);
 glVertex2f(x1,y1);
 glVertex2f(x2,y1);		 //تحديد النقاط
 glVertex2f(x2,y2);
 glVertex2f(x1,y2);
 glEnd();
}

int DrawGLScene(GLvoid)
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();
 glTranslatef(0.0f,0.0f,-1.0f);
 glColor3f(0.1f,2.0f,1.1f);			//لون المربع
 moraba3(-0.1f,-0.1f,0.1f,0.1f); //رسم المربع
 return TRUE;
}
									   //الدالة الرئيسية
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
 char NAME_WINDOW[]="";
 int X_WINDOW=640,Y_WINDOW=480,T=16;
 MSG  msg;
 BOOL done=FALSE;
//if(MessageBox(NULL,"FULL?","SBR",MB_YESNO|MB_ICONQUESTION)==IDNO)
// {
  fullscreen=FALSE;
// }
 if (!CreateGLWindow(NAME_WINDOW,X_WINDOW,Y_WINDOW,T,fullscreen))
 {
  return 0;
 }
 while(!done)
 {
  if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  {
   if (msg.message==WM_QUIT)
   {
	done=TRUE;
   }
   else
   {
	TranslateMessage(&msg);
	DispatchMessage(&msg);
   }
  }
  else		
  {
  if ((active && !DrawGLScene()) || keys[VK_ESCAPE]) 
   {
	done=TRUE;
   }
   else 
   {
	SwapBuffers(hDC);
   }
   if (keys[VK_F1])
   {
	keys[VK_F1]=FALSE; 
	KillGLWindow(); 
	fullscreen=!fullscreen;  
 if (!CreateGLWindow(NAME_WINDOW,X_WINDOW,Y_WINDOW,T,fullscreen))
	{
	 return 0;
	}
   }
  }
 }
 KillGLWindow();
 return (msg.wParam);
}

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

لو سمحتم اتمنى احد يشرح الخطوات لو امكن

ملاحظة: لا تتعجبوا من كتابتي لبعض الملاحظات في الكود حتى اعرف فائدة كل وااحد منها

#2

الامر بسيط .. ضع متغيرين x و y بحيث يتغير هذين المتغيرين بالزيادة أو النقصان .. يمكنك اسناد المتغيرين الى الدالة glTranslate كأسهل الطرق

float x = 0.0f;
float y = 0.0f;

   if (keys[VK_LEFT])
   {
//	keys[VK_LEFT]=FALSE;
	 x-= 0.1f; // يمكنك تحسين السرعة بأخذ معامل الوقت في الحسبان .. يعني سرعة المعالجة

   }
   if (keys[VK_RIGHT])
   {
//	keys[VK_RIGHT]=FALSE;
	 x+= 0.1f; // يمكنك تحسين السرعة بأخذ معامل الوقت في الحسبان .. يعني سرعة المعالجة

   }


.
.
.
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(x,y,-1.0f);
glColor3f(0.1f,2.0f,1.1f);			//لون المربع
moraba3(-0.1f,-0.1f,0.1f,0.1f); //رسم المربع
return TRUE;
}

طبعا غير مقدار الزيادة والنقصان كما تحب

تم تعديل هذه المشاركة بواسطة الشمري في 12 يونيو 2009 في 03:54

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

اخي الشمري... مع اني حاولت عدة مراات

عن طريق switch ولكنها لم تنجح

وخطأي الوحيد هو اني نسيت شي اسمه if

خخخخخخخخخخخخخ

جزااك الله الف خير وعاافية يا الغالي

وشرحك وااضح جداً

ولكن للاسف... ظهرت اخطاء

1>------ Build started: Project: morba3, Configuration: Debug Win32 ------
1>Compiling...
1>moraba3.cpp
1>c:\users\peace\documents\visual studio 2008\projects\morba3\morba3\moraba3.cpp(26) : error C2059: syntax error : 'if'
1>c:\users\peace\documents\visual studio 2008\projects\morba3\morba3\moraba3.cpp(27) : error C2143: syntax error : missing ';' before '{'
1>c:\users\peace\documents\visual studio 2008\projects\morba3\morba3\moraba3.cpp(27) : error C2447: '{' : missing function header (old-style formal list?)
1>c:\users\peace\documents\visual studio 2008\projects\morba3\morba3\moraba3.cpp(32) : error C2059: syntax error : 'if'
1>c:\users\peace\documents\visual studio 2008\projects\morba3\morba3\moraba3.cpp(33) : error C2143: syntax error : missing ';' before '{'
1>c:\users\peace\documents\visual studio 2008\projects\morba3\morba3\moraba3.cpp(33) : error C2447: '{' : missing function header (old-style formal list?)
1>Build log was saved at "file://c:\Users\PEACE\Documents\Visual Studio 2008\Projects\morba3\morba3\Debug\BuildLog.htm"
1>morba3 - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

انا عديت بعضها... ولكني ما فهمت من بعضها><

اتمنى تشووف وتقول لي سبب بارك الله فيك

وهذا هو الكود

# pragma comment (lib, "opengl32.lib")   
# pragma comment (lib, "glu32.lib")	  //المكتبات
# pragma comment (lib, "glaux.lib")

#include <windows.h>	
#include <stdio.h>
#include <gl\gl.h>		 //استدعاء المكتبات
#include <gl\glu.h>			 
#include <gl\glaux.h>	
#include "in.h"
#include <glut.h>

void moraba3(float x1, float y1, float x2, float y2)//النقاط
{
	glBegin(GL_QUADS);
	glVertex2f(x1,y1);
	glVertex2f(x2,y1);		 //تحديد النقاط
	glVertex2f(x2,y2);
	glVertex2f(x1,y2);
	glEnd();
}

float x = 0.0f;
float y = 0.0f;

   if (keys[VK_LEFT])
   {
//	keys[VK_LEFT]=FALSE;
	 x-= 0.1f; // يمكنك تحسين السرعة بأخذ معامل الوقت في الحسبان .. يعني سرعة المعالجة

   }
   if (keys[VK_RIGHT])
   {
//	keys[VK_RIGHT]=FALSE;
	 x+= 0.1f; // يمكنك تحسين السرعة بأخذ معامل الوقت في الحسبان .. يعني سرعة المعالجة

   }

int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(x,y,-1.0f);
glColor3f(0.1f,2.0f,1.1f);			//لون المربع
moraba3(-0.1f,-0.1f,0.1f,0.1f); //رسم المربع
return TRUE;
}
									   //الدالة الرئيسية
int WINAPI WinMain(	HINSTANCE	hInstance,HINSTANCE	hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	char NAME_WINDOW[]="";
	int X_WINDOW=640,Y_WINDOW=480,T=16;
	MSG		msg;
	BOOL	done=FALSE;
//if(MessageBox(NULL,"FULL?","SBR",MB_YESNO|MB_ICONQUESTION)==IDNO)
//	{
		fullscreen=FALSE;
//	}
	if (!CreateGLWindow(NAME_WINDOW,X_WINDOW,Y_WINDOW,T,fullscreen))
	{
		return 0;
	}
	while(!done)
	{
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
			if (msg.message==WM_QUIT)
			{
				done=TRUE;
			}
			else
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}
		else								
		{
		if ((active && !DrawGLScene()) || keys[VK_ESCAPE])	
			{
				done=TRUE;
			}
			else	
			{
				SwapBuffers(hDC);
			}
			if (keys[VK_F1])
			{
				keys[VK_F1]=FALSE;	
				KillGLWindow();	
				fullscreen=!fullscreen;		
	if (!CreateGLWindow(NAME_WINDOW,X_WINDOW,Y_WINDOW,T,fullscreen))
				{
					return 0;
				}
			}
		}
	}
	KillGLWindow();
	return (msg.wParam);
}

تم تعديل هذه المشاركة بواسطة مدمن ++C في 12 يونيو 2009 في 14:01

#5

أخوي .. عندك غلط .. لازم تكون جملة If داخل دالة .. function .. يجب أن تعرف أساسيات اللغة قبل برمجة الالعاب :huh:

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

المصيبة يا اخي الشمري... أن الكلية أخذت كل وقتي ولم استطع البرمجة إلا بعد خمسة او ست شهور><

فنسيت كل شي...

والمصيبة الثانية أن البرمجة على Visual C++ 2008 تختلف قليلاً عن البرمجة على Visual C++ 6

وأنا ما عندي غير الدروس الي على فيجوال6

============

المهم انا جعلته يتحرك لما وضعت جملة if في دالة DrawGLScene(GLvoid)

لكن المصيبة أنه يزيح حتى رقم 0.1F فقط بدون أن يتاابع التحرك

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

# pragma comment (lib, "opengl32.lib")   
# pragma comment (lib, "glu32.lib")	  //المكتبات
# pragma comment (lib, "glaux.lib")

#include <windows.h>	
#include <stdio.h>
#include <gl\gl.h>		 //استدعاء المكتبات
#include <gl\glu.h>			 
#include <gl\glaux.h>	
#include "in.h"
#include <glut.h>


void moraba3(float x1, float y1, float x2, float y2)//النقاط
{
	glBegin(GL_QUADS);
	glVertex2f(x1,y1);
	glVertex2f(x2,y1);		 //تحديد النقاط
	glVertex2f(x2,y2);
	glVertex2f(x1,y2);
	glEnd();
}

int DrawGLScene(GLvoid)
{
	float x = 0.0f;
	if (keys[VK_LEFT])
	{
		x-= .1;
	}
	if (keys[VK_RIGHT])
	{
		x+= .1;
	}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(x,0.0f,-1.0f);
glColor3f(0.1f,2.0f,1.1f);			//لون المربع
moraba3(-0.1f,-0.1f,0.1f,0.1f); //رسم المربع
return TRUE;
}
									  //الدالة الرئيسية
int WINAPI WinMain(	HINSTANCE	hInstance,HINSTANCE	hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	char NAME_WINDOW[]="";
	int X_WINDOW=640,Y_WINDOW=480,T=16;
	MSG		msg;
	BOOL	done=FALSE;
//if(MessageBox(NULL,"FULL?","SBR",MB_YESNO|MB_ICONQUESTION)==IDNO)
//	{
		fullscreen=FALSE;
//	}
	if (!CreateGLWindow(NAME_WINDOW,X_WINDOW,Y_WINDOW,T,fullscreen))
	{
		return 0;
	}
	while(!done)
	{
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
			if (msg.message==WM_QUIT)
			{
				done=TRUE;
			}
			else
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}
		else								
		{
		if ((active && !DrawGLScene()) || keys[VK_ESCAPE])	
			{
				done=TRUE;
			}
			else	
			{
				SwapBuffers(hDC);
			}
			if (keys[VK_F1])
			{
				keys[VK_F1]=FALSE;	
				KillGLWindow();	
				fullscreen=!fullscreen;		
	if (!CreateGLWindow(NAME_WINDOW,X_WINDOW,Y_WINDOW,T,fullscreen))
				{
					return 0;
				}
			}
		}
	}
	KillGLWindow();
	return (msg.wParam);
}

تم تعديل هذه المشاركة بواسطة مدمن ++C في 14 يونيو 2009 في 14:18

#7

شكرا اخي

حليت المشكلة

سمعت بنصيحتك ورجعت لتعلم المزيد عن السي++

وكان المفروض منك تكتب

static float x = 0.0f

خخخخخخخخ^^"

المهم انحلت وجاري التحرك إلى الخطوة الثانية

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…