Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2010, 18:56   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию Opengl

Народ подскажите как сделать чтоб многоугольник (астероид) двигался поокну программы рендомно по оси X и Y,
и как создать одновременно n ое количество многоугольников (астероидов)
Код:
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <glut.h>
#define PI 3.1415926535898

struct Vector 
{ 
float x, y;
};

Vector v1, v2, v3,v4; 
Vector pos;
float angle;





//------------------------------------------------------------------------------------
void resize(int width,int height)
{
   glViewport(0,0,width,height);
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho(-5,5, -5,5, 2,12);
   gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
   glMatrixMode( GL_MODELVIEW );

}

//------------------------------------------------------------------------------------

Vector Rotate(Vector v,float a) // функция вращения вектора на угол а.
{

Vector r;


a = a * (PI/180.0);
r.x = (v.x*cos(a)) + (v.y*sin(a));
r.y = (v.x*-sin(a)) + (v.y*cos(a));




return r;

}

//------------------------------------------------------------------------------------

void init() // Задаем установки прогы
{
v1.x = 0.3; v1.y = 0.3; // записываем статичиские кординаты фигуры
v2.x =-0.08; v2.y = 0.08;
v4.x = 0.08; v4.y =-0.08;

}
//------------------------------------------------------------------------------------


void display(void)
{

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glLoadIdentity();



 if(GetAsyncKeyState(VK_LEFT))  angle -= 0.7; // Кнопки Влево и вправо крутят фигуру! 
 if(GetAsyncKeyState(VK_RIGHT)) angle += 0.7;

 if(GetAsyncKeyState(VK_UP)) { 
	 Vector tmp; tmp.x = 0.004; tmp.y = 0.004;
	 tmp = Rotate(tmp, angle);
	 
	 pos.x += tmp.x; pos.y += tmp.y;
	 if(pos.x > 5.1) pos.x = -5.1;
	 if(pos.x < - 5.1) pos.x = 5.1;

	 if(pos.y > 5.1) pos.y = -5.1;
	 if(pos.y < - 5.1) pos.y = 5.1;
 
 }  // Кнопки вверх и вниз меняют позицию фигуру! 
 if(GetAsyncKeyState(VK_DOWN)) {
	 Vector tmp; tmp.x = -0.003; tmp.y = -0.003;
	 tmp = Rotate(tmp, angle);
	 pos.x += tmp.x; pos.y += tmp.y;

	 pos.x += tmp.x; pos.y += tmp.y;
	 if(pos.x > 5.1) pos.x = -5.1;
	 if(pos.x < - 5.1) pos.x = 5.1;

	 if(pos.y > 5.1) pos.y = -5.1;
	 if(pos.y < - 5.1) pos.y = 5.1;
 
 }


 Vector tv1 = Rotate(v1,angle); // создаем временой вектор  для создания глобальних кординат
 Vector tv2 = Rotate(v2,angle);
 Vector tv3 = Rotate(v4,angle);

 
 glBegin(GL_TRIANGLES);
 
     glColor3ub(255,255,0);
    glVertex2d(tv1.x + pos.x, tv1.y + pos.y); // рисуем фигуру и добовляем позицию
	 
    glVertex2d(tv2.x + pos.x, tv2.y + pos.y);
    glVertex2d(tv3.x + pos.x, tv3.y + pos.y);
	glEnd();
	glTranslatef(-3.0f,2.0f,0.0f);
	 glBegin(GL_POLYGON);
		 glColor3ub(255,255,255);
                glVertex3f(-0.2f, 0.3f, 0.0f);  // Слева вверху
                glVertex3f( 0.0f, 0.3f, 0.0f);  // Справа вверху
                glVertex3f( 0.2f,-0.5f, 0.0f);  // Справа внизу
                glVertex3f(-0.3f,-0.2f, 0.0f);  // Слева внизу
				glVertex3f(0.4f, 0.3f, 0.0f);
				glVertex3f(-0.4f, -0.3f, 0.0f);

				glEnd(); 

glutSwapBuffers();
glutPostRedisplay();


}


//------------------------------------------------------------------------------------
int main(int argc, char *argv[])
{

  init();
    glutInit(&argc, argv);             
    glutInitWindowSize(800, 700);        
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 

    glutCreateWindow("FrOsT");

    glutReshapeFunc(resize);    
    glutDisplayFunc(display);

    glutMainLoop();

	return 0;
}
красным выделен многоугольник
revaldo666 вне форума Ответить с цитированием
Старый 25.07.2010, 19:27   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
как сделать чтоб многоугольник (астероид) двигался поокну программы рендомно по оси X и Y
Примерно в таком духе:
Код:
int Vx, Vy;
while(true)
 {
 Vx = random(100);
 Vy = random(100);
 X += Vx; Y += Vy;
 }
Цитата:
как создать одновременно n ое количество многоугольников (астероидов)
С OpenGL не знаком, но стандартно - создаете несколько объектов, отвечающих за ваш астероид (в массиве или контейнере), потом над каждым из них проделываете нужные операции
Код:
struct Vec3D {float x, y, z;};

class Asteroid
{
//...
void Draw();
//...
Vec3D A, B, C, D;
//...
};

void Asteroid::Draw()
{
	glBegin(GL_POLYGON);
	glColor3ub(255,255,255);
            glVertex3f(A.X, A.Y, A.Z);   // Слева вверху
            glVertex3f(B.X, B.Y, B.Z);   // Справа вверху
            glVertex3f(C.X, C.Y, C.Z);   // Справа внизу
            glVertex3f(D.X, D.Y, D.Z);   // Слева внизу
	glVertex3f(0.4f, 0.3f, 0.0f);   //А кто эти двое - понятия не имею
	glVertex3f(-0.4f, -0.3f, 0.0f);
	glEnd(); 
}

//...

int main()
{
//...
Asteroid* AstArr;   //Массив астероидов
int N;   //Число астероидов в массиве
//...
for (int i = 0; i < N; i++)
 {
 //...
 AstArr[i].Draw();
 //...
 }
}
За правильность абсолютно не ручаюсь, т.к., как уже сказал, с OpenGL не знаком. Но суть примерно такая.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 25.07.2010, 20:15   #3
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

ага...суть немного уловил но толком так особо не понял..
мнебы по конкретней примерчик...былбы очень благодарен...
revaldo666 вне форума Ответить с цитированием
Старый 26.07.2010, 20:38   #4
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Может ктото описать по шагово как зделать рендомное движение астероида.
или покажите на примере моего кода если не сложно чтоб потом было легче разобратся.что за что отвечает и что тозначает
revaldo666 вне форума Ответить с цитированием
Старый 26.07.2010, 21:16   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

В общих чертах:
Есть у нас тип астероида
Код:
class Asteroid
{
//...
private:
const Vec3D A, B, C, D;   //Координаты вершин астероида в системе отсчета, связанной с центром масс (т.е. их смещение относительно центра)
float X, Y, Z;          //Координаты центра масс
float Vx, Vy, Vz;     //Скорость центра масс, предполагаем, что астероид не вращается
//...
};
Можно координаты и скорость ЦМ тоже сделать Vec3D.
Все движение астероида (считаем, что только поступательное, вращательного нет) заключено в центре масс и его скорости. Координаты вершин - это (X + A.X, Y + A.Y, Z + A.Z) и т.п.
Как, собственно, происходит движение. Есть у нас игровой цикл (по таймеру или, например, в while с какой-нибудь задержкой), и в каждой его итерации астероид рандомно меняет свое положение (а можно - время от времени, в случайным моменты времени). Тогда у нас есть скорость, которая в один прекрасный момент меняется, а есть координаты, которые меняются каждую итерацию игрового цикла: X += Vx и т.п.
Код:
//...
Asteroid* AstArr;
int ArrSize;
//...
ИГРОВОЙ_ЦИКЛ
{
//...
for (int i = 0; i < ArrSize; i++)
 {
 if (random(10) >= 8)   //в среднем 2 из 10 итераций скорость меняется
  {
  Asteroid[i].Vx = 0.01 * random(100);
  Asteroid[i].Vy = 0.01 * random(100);
  Asteroid[i].Vz = 0.01 * random(100);
  }
 Asteroid[i].X += Asteroid[i].Vx;
 Asteroid[i].Y += Asteroid[i].Vy;
 Asteroid[i].Z += Asteroid[i].Vz;
 }
//...
}
Можно, конечно, выделить простые операции типа {X += Vx; Y += Vy; Z += Vz;} в отдельные функции-члены класса Asteroid, равно как и рандомную генерацию всех проекций скоростей.
В целом с движением все обстоит примерно так. После того, как все астероиды вы передвинули, начинаете в игровом цикле проверять столкновения, делать реакцию на них, потом наконец все рисуете.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 26.07.2010, 21:28   #6
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

у меня вот только вопрос. как правельно обьявить функцию random?
revaldo666 вне форума Ответить с цитированием
Старый 26.07.2010, 22:38   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Не надо ее объявлять, она уже есть. Возможно, придется подключить какой-нибудь header, посмотрите в справке, что инклюдить. Функция random(n) возвращает случайное значение в интервале от 0 до (n - 1). В качестве альтернативы (random вроде все-таки не везде есть) то же самое:
Код:
int x = rand() % n;
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 26.07.2010, 23:14   #8
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

всё я с рендомом разобрался...но непойму чёт...никак не получается нефига...или руки кривые или мозги затухли уже.
revaldo666 вне форума Ответить с цитированием
Старый 26.07.2010, 23:26   #9
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Народ помогите плиз вышенаписаное реализовать в моём коде, ато у меня чтото ничего не получается(
revaldo666 вне форума Ответить с цитированием
Старый 27.07.2010, 16:33   #10
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Вот я собрал это всё в однот но выдаёт ошибки
error C2248: Asteroid::Draw: невозможно обратиться к private член, объявленному в классе "Asteroid"
error C2731: main: функция не может быть перегружена
error C2059: синтаксическая ошибка: while
error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)
Код:
#include <windows.h> 
#include <stdio.h> 
#include <math.h> 
#include <glut.h> 
#define PI 3.1415926535898 

struct Vector 
{ 
float x, y; 
}; 

Vector v1, v2, v3,v4; 
Vector pos; 
float angle; 
struct Vec3D {float x, y, z;};

class Asteroid
{
void Draw();
Vec3D A, B, C, D;
};
//------------------------------------------------------------------------------------
void resize(int width,int height) 
{ 
glViewport(0,0,width,height); 
glMatrixMode( GL_PROJECTION ); 
glLoadIdentity(); 
glOrtho(-5,5, -5,5, 2,12); 
gluLookAt( 0,0,5, 0,0,0, 0,1,0 ); 
glMatrixMode( GL_MODELVIEW ); 

} 

//------------------------------------------------------------------------------------

Vector Rotate(Vector v,float a) // функция вращения вектора на угол а. 
{ 

Vector r; 

a = a * (PI/180.0); 
r.x = (v.x*cos(a)) + (v.y*sin(a)); 
r.y = (v.x*-sin(a)) + (v.y*cos(a)); 

return r; 

} 

//------------------------------------------------------------------------------------

void init() // Задаем установки прогы 
{ 
v1.x = 0.3; v1.y = 0.3; // записываем статичиские кординаты фигуры 
v2.x =-0.08; v2.y = 0.08; 
v4.x = 0.08; v4.y =-0.08; 

} 
void Asteroid::Draw()
{
	glBegin(GL_POLYGON);
	glColor3ub(255,255,255);
            glVertex3f(A.x, A.y, A.z);   // Слева вверху
            glVertex3f(B.x, B.y, B.z);   // Справа вверху
            glVertex3f(C.x, C.y, C.z);   // Справа внизу
            glVertex3f(D.x, D.y, D.z);   // Слева внизу
	
	glEnd(); 
}

int main()
{
//...
Asteroid* AstArr;   //Массив астероидов
int N;   //Число астероидов в массиве
//...
for (int i = 0; i < N; i++)
 {
 //...
 AstArr[i].Draw();
 //...
 }
}
int Vx, Vy;
while(true);
 {
 Vx = random(100);
 Vy = random(100);
 x += Vx; y += Vy;
 }
//------------------------------------------------------------------------------------

void display(void) 
{ 

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 

glLoadIdentity(); 

if(GetAsyncKeyState(VK_LEFT)) angle -= 0.7; // Кнопки Влево и вправо крутят фигуру! 
if(GetAsyncKeyState(VK_RIGHT)) angle += 0.7; 

if(GetAsyncKeyState(VK_UP)) { 
Vector tmp; tmp.x = 0.004; tmp.y = 0.004; 
tmp = Rotate(tmp, angle); 

pos.x += tmp.x; pos.y += tmp.y; 
if(pos.x > 5.1) pos.x = -5.1; 
if(pos.x < - 5.1) pos.x = 5.1; 

if(pos.y > 5.1) pos.y = -5.1; 
if(pos.y < - 5.1) pos.y = 5.1; 

} // Кнопки вверх и вниз меняют позицию фигуру! 
if(GetAsyncKeyState(VK_DOWN)) { 
Vector tmp; tmp.x = -0.003; tmp.y = -0.003; 
tmp = Rotate(tmp, angle); 
pos.x += tmp.x; pos.y += tmp.y; 

pos.x += tmp.x; pos.y += tmp.y; 
if(pos.x > 5.1) pos.x = -5.1; 
if(pos.x < - 5.1) pos.x = 5.1; 

if(pos.y > 5.1) pos.y = -5.1; 
if(pos.y < - 5.1) pos.y = 5.1; 

} 

Vector tv1 = Rotate(v1,angle); // создаем временой вектор для создания глобальних кординат 
Vector tv2 = Rotate(v2,angle); 
Vector tv3 = Rotate(v4,angle); 

glBegin(GL_TRIANGLES); 

glColor3ub(255,255,0); 
glVertex2d(tv1.x + pos.x, tv1.y + pos.y); // рисуем фигуру и добовляем позицию 

glVertex2d(tv2.x + pos.x, tv2.y + pos.y); 
glVertex2d(tv3.x + pos.x, tv3.y + pos.y); 
glEnd(); 


glutSwapBuffers(); 
glutPostRedisplay(); 

} 

//------------------------------------------------------------------------------------
int main(int argc, char *argv[]) 
{ 

init(); 
glutInit(&argc, argv); 
glutInitWindowSize(800, 700); 
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 

glutCreateWindow("FrOsT"); 

glutReshapeFunc(resize); 
glutDisplayFunc(display); 

glutMainLoop(); 

return 0; 
}
revaldo666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
opengl alhon Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 10.10.2013 15:02
OpenGl macintoshka12 Общие вопросы C/C++ 2 21.04.2010 12:59
OpenGL Paul_AG C++ Builder 20 14.09.2009 19:07
OpenGl Freer Помощь студентам 1 25.05.2009 17:57
OpenGL Witaliy Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 01.05.2008 21:05