OpenGL - klasa Ckwadrat i klasa Cscena

0

Witam, Mam taki program i problem. Napisałem sobie klasę Cprostokat i zdefiniowałem wszystkie funkcje. Napisałem również klasę Cscena, która tworzy mi obszar na którym będą wyświetlane obiekty itp. Problem w tym, że w ogóle nie mogę tego wywołać, ponieważ co chwilę wyrzuca mi jakiś błąd. Mam też problem z funkcją glutDisplayFunc(display), niby teraz nie wyrzuca już tam problemu, ale nie wiem czy program będzie działał...

 #ifndef _naglowek_h
#define _naglowek_h


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


class Cprostokat
{
public:
	float x;
	float y;
	float a;
	float b;
	float red;
	float green;
	float blue;
	void Rysuj();
	void Przesun(float dx, float dy);
	void Koloruj(float red, float green, float blue);
	Cprostokat();
	Cprostokat(float X, float Y, float A, float B);
	Cprostokat(const Cprostokat &P);
};

class Cscena
{
public:
    Cprostokat* P[10];
	void display(void);
	static void key(unsigned char key, int x_d, int y_d);
	void init();
	int main(int argc, char* argv[]);
	void wyswietl();
};

#endif
 #include "naglowek.h"

Cprostokat prostokat[10];


void Cscena::display(void)
{
	 glClear(GL_COLOR_BUFFER_BIT); 
	 for(int i=0; i<10; i++)
	 {
	 prostokat[i].Rysuj();
	 }
	 glFlush();
}

void wyswietl()
{
	Cscena scena;
	scena.display();
}

int i = 0;

void Cscena::key(unsigned char key, int x_d, int y_d)
{
    switch(key)
	{
	case 'n':
		i++;
		break;
	case 'p':
		i--;
		if(i<0)
		{
			i=10;
		}
		break;
    case 32:
		prostokat[i].Koloruj(1,1,0);
		glutPostRedisplay();
		break;
	case 'a':
		prostokat[i].Przesun(-0.05,0);
		glutPostRedisplay();
		break;
	case 'w':
		prostokat[i].Przesun(0,0.05);
		glutPostRedisplay();
		break;
	case 'd':
		prostokat[i].Przesun(0.05,0);
		glutPostRedisplay();
		break;
	case 's':
		prostokat[i].Przesun(0,-0.05);
		glutPostRedisplay();
		break;
	case 27:
		exit(0);
		break;
	}
}

void Cscena::init()
{
	glClearColor (0, 0, 0, 0.0); 
	glColor3f(1.0, 1.0, 1.0); 
	glMatrixMode (GL_PROJECTION);
	glLoadIdentity ();
	glOrtho(-1, 1, -1, 1, 1, -1);  
}

int Cscena::main(int argc, char* argv[])
{

	glutInit(&argc,argv); 
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);  
	glutInitWindowSize(500,500);  //tworzenia okna 500/500
	glutInitWindowPosition(0,0); //lewy naroznik ekranu 0na0 zawsze zaczyna od lewego gornego naroznika
	glutCreateWindow("Klasy"); //tworzy okno o podanym tytule
	//glutDisplayFunc(wyswietl);  //zostanie wywolana kiedy wymagane jest przerywsowanie okna
	void display();
	glutKeyboardFunc(key);	  //
	init(); // funkcja inicjuje cała scene
	glutMainLoop(); //funkcja przyjmujaca wszytskie komunikaty systemowe mozemy uzywac klawiatury myszki

	return 0;
}
#include "naglowek.h"


Cprostokat::Cprostokat()
{
	x=-0.5;
	y=-0.5;
	a=0.25;
	b=0.25;
	red = 1;
	blue= 1;
	green=1;
}

void Cprostokat::Przesun(float dx, float dy)
{
	x+=dx;
	y+=dy;
}

void Cprostokat::Rysuj()
{
	glColor3f(red,green,blue);
	glBegin(GL_POLYGON);
	 	glVertex2f(x,y);
	 	glVertex2f(x+a,y);
	 	glVertex2f(x+a,y-b);
	 	glVertex2f(x,y-b);
	glEnd();
}

Cprostokat::Cprostokat(const Cprostokat &P)
{
	x=P.x;
	y=P.y;
	a=P.a;
	b=P.b;
	red=P.red;
	blue=P.blue;
	green=P.green;
}

Cprostokat::Cprostokat(float X, float Y, float A, float B)
{
	x=X;
	y=Y;
	a=A;
	b=B;
	red=1;
	green=1;
	blue=1;
}

void Cprostokat::Koloruj(float red, float green, float blue)
{
	red=1;
	green=1;
	blue=1;
} 
 #include "naglowek.h"

int main()
{
	Cscena scena;
	scena.main();
}

0

Cześć,
na dobry początek, zacznij od tego:

  #include "naglowek.h"
 
int main()
{
        Cscena scena;
        scena.main(); // <-- ta funkcja wymaga podania parametrów!!!
}

Pozdrawiam ;)

0

Wiem, ale jak podaje tam parametry to i tak wyrzuca błąd. Nie wiem jak mam wpisać tam te parametry, aby było dobrze:/

Dobra, poradziłem sobie z tym tak. Niby się kompiluje, ale nie wiem czy na pewno dobrze działa. Możliwe, że jest jeszcze błąd w tej funkcji glutDisplayFunc(display). Nie wiem jak sobie z tym poradzić.

#include "naglowek.h"

int main(int argc, char* argv[])
{
Cscena scena;
scena.main(argc,argv);
}
 
0

Może mi ktoś napisać co jest tutaj źle? Chciałbym, aby po naciśnięciu klawisza k na ekranie rysował się kwadrat tylko program się zacina na funkcji rysuj.

#include "naglowek.h"

Cscena scena;
Cprostokat kwadrat[10];

void Cprostokat::rysuj()
{
	glPushMatrix();
	glColor3f(0, 1, 1);
	glBegin(GL_POLYGON);
		glVertex2f(x,y);
		glVertex2f(-x,-y);
		glVertex2f(-x,y);
		glVertex2f(x,-y);
	glEnd();
	glPopMatrix();
}

void Cscena::dodaj_prostokat()
{   
	glClear(GL_COLOR_BUFFER_BIT);
	for(int i=0; i<10; i++)
	{
		scena.P[i]->rysuj();
	}
	glFlush();
}

Cprostokat::Cprostokat()
{
	x=1;
	y=1;
	a=1;
	b=1;
	red = 1;
	green = 1;
	blue = 1;
}

void Cprostokat::przesun(float dx, float dy)
{
	x+=dx;
	y+=dy;
}


void Cprostokat::Koloruj(float red, float green, float blue)
{
	red=1;
	green=1;
	blue=1;
}

int i=0;

void Cscena::key(unsigned char key, int x_d, int y_d)
{
    switch(key)
	{
	case 'k':
		scena.dodaj_prostokat();
		break;
	case 'n':
		i++;
		if(i>10)
		{
			i=1;
		}
		break;
	case 'p':
		i--;
		if(i<0)
		{
			i=10;
		}
		break;
    case 32:
		kwadrat[i].Koloruj(1,1,0);
		glutPostRedisplay();
		break;
	case 'a':
		kwadrat[i].przesun(-0.05,0);
		glutPostRedisplay();
		break;
	case 'w':
		kwadrat[i].przesun(0,0.05);
		glutPostRedisplay();
		break;
	case 'd':
		kwadrat[i].przesun(0.05,0);
		glutPostRedisplay();
		break;
	case 's':
		kwadrat[i].przesun(0,-0.05);
		glutPostRedisplay();
		break;
	case 27:
		exit(0);
		break;
	}
}


void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
	glFlush();
}

void Cscena::inicjuj(int argc, char* argv[])
{
	glutInit(&argc,argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(0,0);
    glutCreateWindow("Klasy");
    glutKeyboardFunc(key);
	glutDisplayFunc(display);
    glClearColor (0, 0, 0, 0.0);
    glColor3f(1.0, 1.0, 1.0);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    glOrtho(-1, 1, -1, 1, 1, -1);
	glutMainLoop();
}



int main(int argc, char* argv[])
{
scena.inicjuj(argc,argv);
} 
 #ifndef _naglowek_h
#define _naglowek_h


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

class Cprostokat
{
    float x;
    float y;
    float a;
    float b;
    float alfa;
    float red;
    float green;
	float blue;
public:
    Cprostokat();
    Cprostokat(float a, float b);
    void rysuj();
    void obroc(float alfa);
    void przesun(float dx, float dy);
    void ukryj();
    void Koloruj(float red, float green, float blue);
    void powieksz();
};

class Cscena
{
	public:
    Cprostokat* P[10];
    int wysokosc;
    int szerokosc;
    int k;
    int id;
    int pr_n;
	void inicjuj(int argc, char* argv[]);
    void wyczysc();
    void wyswietl(void);
    static void key(unsigned char key, int x_d, int y_d);
    void dodaj_prostokat();
    void usun_prostokat();
    void uruchom();

};

#endif

1 użytkowników online, w tym zalogowanych: 0, gości: 1