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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2010, 17:39   #11
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Хм... По-моему, прежде чем изучать OpenGL, вам неплохо бы как следует проштудировать какую-нибудь хорошую книжку по C++.
Во-первых, я вам давал только фрагменты кода, иллюстрирующие аспекты, имеющие прямое отношение к проблеме. Так что не надо просто копировать то, что я написал со строками типа
Код:
//...
В классах желательно бы еще прописать как минимум конструктор (один или несколько) и деструктор (даже если пустой, можно его все равно объявить и определить), плюс в конкретной задаче кучу разных функций и данных.
Во-вторых, в классах по умолчанию функции и члены определены как private, поэтому необходимо указывать нужные как public
Код:
class Asteroid
{
public:
Asteroid();
Asteroid(/*тут всякие параметры*/);
~Asteroid();
void Draw();
//Плюс куча разных функций
private:
//Разнообразные данные
private:
};
В-третьих, у вас в тексте два раза функция main - одна ваша, вторая - с моими кусками кода.
В общем, в коде у вас абсолютный хаос и прежде чем исправлять ошибки, вам необходимо серьезно подтянуть теорию, а затем хоть как-то структурировать логику программы.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 27.07.2010, 17:46   #12
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Более менее разобрался спасибо.
Вот только не компилится.
Выдаёт ошибку
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
{
Vec3D A, B, C, D;
float Vx, Vy;
public:
void Draw();
};



//------------------------------------------------------------------------------------
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(); 
}
//------------------------------------------------------------------------------------


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[])
{
Asteroid* AstArr;   //Массив астероидов
int N;   //Число астероидов в массиве
for (int i = 0; i < N; i++)
 {
 AstArr[i].Draw();
 }

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

    glutCreateWindow("FrOsT");

    glutReshapeFunc(resize);    
    glutDisplayFunc(display);
    glutMainLoop();

	return 0;
}

Последний раз редактировалось revaldo666; 28.07.2010 в 12:20.
revaldo666 вне форума Ответить с цитированием
Старый 28.07.2010, 22:43   #13
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Наконецто разобрался...
Подскажите теперь как реализовать здесь движение этих многоугольникв
Код:
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <glut.h>
 
#define PI 3.1415926535898
 
#pragma comment (lib, "glut32.lib")
 
struct Vector {float x, y;};  
Vector v1, v2, v3,v4; 
Vector pos;
float angle;
struct Vec3D {float X, Y, Z;};
class Asteroid
{
public:
void Init(int N)
{
  int i = N / 4;
  int j = N % 4;
  A.X = -1+i/3;
  A.Y = -1+j/3;
  A.Z = 0;
  B.X = i/3;
  B.Y = -1+j/3;
  B.Z = 0;
  C.X = -1+i/3;
  C.Y = j/3;
  C.Z = 0;
  D.X = i/3;
  D.Y = j/3;
  D.Z = 0;
} 
 
Vec3D A, B, C, D;
float Vx, Vy;
public:
void Draw();
};
 
int N = 10; 
Asteroid AstArr[10];   //Массив астероидов
 
 
 
//------------------------------------------------------------------------------------
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_QUADS);
        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(); 
}
//------------------------------------------------------------------------------------
 
 
void display(void)
{
 
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 
glLoadIdentity();
 
for (int i = 0; i < N; i++)
 {
 AstArr[i].Draw();
 }
 
 
 
 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[])
{
 
 
for (int i = 0; i < N; i++)
 {
 AstArr[i].Init(i);
 AstArr[i].Draw();
 }
 
 
 
  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