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

كيف أحرك دائره بإستخدام الماوس

بدأه وريف في 13 أبريل 2008 · 7 رد · 1,990 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أنا رسمت كوره ولكن عجزت إني أحرك هذه الكوره

mouse function بإستخدام

بحيث إني إذا ظغط الزر اليسار في مكان معين

تتحرك الكوره لهذا المكان

وهكذا إذا ظغط في أي مكان

وشكرا

أرجوا المساعدة

#2

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

تختلف احداثيات OpenGL الثلاثية الابعاد عن احداثيات الماوس .. وهذا شيء طبيعي .. ظهرت عدة حلول .. أسهلها استخدام أحد دوال OpenGL .. وهي :

gluUnProject

بالامكان الاستفادة من هذه الروابط ./

http://pyopengl.sourceforge.net/documentat...Project.3G.html

http://www.gamedev.net/community/forums/to...?topic_id=65558

يوجد مثال بلغة البايثون ... أعتقد أنكم تبرمجون بلغة السي ...

اذا لم أنسَ .. سأضيف مثال هنا ..

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

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

وهي تنحل بإستخدام

mouse function

ولكني لا أعرف كيف أقرأ نقطة x,y إذا نقرت بالزر اليسار للماوس على هذه النقطه حتى تتحرك الكره إلى هذه النقطه

#4
اقتباس
شكرا لك أخي ولكني في برنامجي لم أستخدم ثلاثة أبعاد وإنما بعدين فقط

اذا المشكلة صارت أسهل ..

اقتباس
ولكني لا أعرف كيف أقرأ نقطة x,y إذا نقرت بالزر اليسار للماوس على هذه النقطه حتى تتحرك الكره إلى هذه النقطه

مثال :

void mouse(int button, int state, int x, int y)
{
	if (button == GLUT_RIGHT_BUTTON)
	{
 if (state == GLUT_DOWN)
	 cout << "Right button pressed"
	 << endl;
 else
	 cout << "Right button lifted "
	 << "at (" << x << "," << y
	 << ")" << endl;
	}
}

في الmain

glutMouseFunc(mouse);

شرحت هذه الدوال في هذا الموضوع :

دروس حول المكتبة glut

لكن تبقى مشكلة التحويل من والى نظام احداثيات OpenGL .

هناك حلين :

1- أن تجعلي احداثيات OpenGL مثل احداثيات أي نافذة في الويندوز .

2- ان تعملي معادلة بسيطة للتحويل من والى OpenGL .

مرة ثانية ..اذا رجعت للبيت عملت المثال ..( ان شاء الله ما أنسى هذه المرة :) ) .. حاليا في الجامعة ولا اظنهم مثبتين OpenGL ....

لكن اذا كان ممكن .. اضيفي الجزء الخاص بالمنفذ .. مثال :

glViewport(.......); // ماهي القيم الموجودة هنا

glOrtho(...........);// ماهي القيم الموجودة هنا

حتى نعطيك من الاخر .

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

شكرا جزيلا لك على مجهودك

ولكني مبتدئه في open gl

فأرجوا أنك تحملني شوي

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

	 #include <GL/glut.h>
#include <math.h>


const float PI = 3.14159;

void init (void)
{
glClearColor (1.0, 1.0, 1.0, 0.0);
glMatrixMode (GL_PROJECTION);
gluOrtho2D (0.0, 400.0, 0.0, 300.0);
}
void displayiFcn (void)
{
glClear (GL_COLOR_BUFFER_BIT); // Clear display window.

glColor3f (1.0, 0.0, 0.0);

float theta;
float x , y;

glBegin (GL_POLYGON); // For a solid circle


for (theta = 0; theta < (2 * PI); theta += 2 * PI / 10000)
{
x = 200 + 50 * cos(theta);
y = 150 + 50 * sin(theta);
glVertex2f (x,y);
}
glEnd ( );
glFlush ( ); 
}

void displayFcn (void)
{
glClear (GL_COLOR_BUFFER_BIT); // Clear display window.

glColor3f (1.0, 0.0, 0.0); 

float theta;
float x , y;

for (int i = 240; i >= 50; i--)
{

glBegin (GL_POLYGON);

for (theta = 0; theta < (2 * PI); theta += 2 * PI / 10000)
{
glVertex2f (x,y);
y = i + 50 * cos(theta);
x =i + 50 * sin(theta);

}

glEnd ( );
glFlush ( );
glClear (GL_COLOR_BUFFER_BIT); // Clear display window.
}


}
void mouse(int button, int state, int x, int y) 
{

switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)

glutIdleFunc (displayFcn);
break;

case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
//glutIdleFunc(NULL);
break;
default:
break;
}
}

int main (int argc, char** argv)
{
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition (100, 100);
glutInitWindowSize (400, 300);
glutCreateWindow ("Moving Circle");

init ( );
glutDisplayFunc (displayiFcn);

glutMouseFunc(mouse);

glutMainLoop ( );
return 0;
}

هذا الذي أنجزته حتى الآن

أعرف أن الكود يدل عدم الخبره

ولكن منكم نستفيد

تم تعديل هذه المشاركة بواسطة وريف في 20 أبريل 2008 في 23:11

#6

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

أخي الشمري لقد أستطعت حل مشكلتي ولله الحمد

وجزاك الله خيرا على إهتمامك وجهودك

بارك الله فيك وزادك علما وعزا

#7

بس ما بهو شي الكود يعني 75%

#8

عذرا أختي الكريمة على تأخري في الرد .. والله كنت مجهز الكود من حوالي الاسبوع .. لكن طروف حالة دون اضافته ,

عموما الكود بالمرفقات .. وهو قريب مما طلبتيه .. لعل شخص اخر يستفيد منه .

OpenGL_Test.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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