Dodawanie obiektów

0

Witam, jak zrobić kiedy w switch case chciałbym na przycisk dodawać nowy obiekt i go wyświetlać jako osobny kwadrat. moim sposobem rozmiar vectora zwiększa się, ale wyświetlają się wszystkie w tym samym miejsce, chyba. Pomocy!

class cProstokat
{
	float x, y;
	float a, b;
public:
	friend class cScena;
	cProstokat (); 
	cProstokat (float x1, float y1, float a1, float b1, float kat1, float R1, float G1, float B1); 
};
class cScena
{
	vector <cProstokat> tab;
public:

	void rysuj();
	void init();
	void klawisz(char key, float x, float y);
	void start();

};
void rysuj();
void klawisz(unsigned char k);
 
 
float xz=0, yz=0;
cProstokat a4;
void cScena::klawisz(char key, float x_d, float y_d)
{
	//	cProstokat a4;
	switch (key) {
	case 'n':
		{
			//	cProstokat a4;
			tab.push_back(a4);
			cout<<tab.size()<<endl;
			glutPostRedisplay();
		}	break;
	case '1':
		cout<<"1";
		a4.x+=.1;
		a4.y+=.1;
		glutPostRedisplay();
		break;
	case '2':
		a4.x-=.1;
		a4.y-=.1;
		glutPostRedisplay();
		break;
	case 'x':
	case 'X':
		exit(0);
	}
}

void cScena::init()
{
	glClearColor (0.0, 0.0, 0.0, 0.0);
	glColor3f(1.0, 1.0, 1.0);
	glMatrixMode (GL_PROJECTION);
	glLoadIdentity ();
	glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);  //stawia kamere na scene
	glMatrixMode (GL_MODELVIEW);
	glLoadIdentity ();
}

void cScena::rysuj()
{
	for (auto v=tab.begin(); v!=tab.end(); ++v)
	{
		v->rysuj();
	}
}
void cProstokat::rysuj()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPushMatrix();
	glTranslatef(a4.x,a4.y,0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(-0.5, 0.5);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glPopMatrix();
	glFlush();
	}
1

W metodzie cProstokat::rysuj masz na sztywno glTranslatef(a4.x,a4.y,0);, a powinieneś odnosić się przez this.x i this.y.

0

Mam kolejny problem, wyskakuje mi error: vector iterator is not dereferencable. Nie rozumiem skąd ten błąd?
Macie pomysł na bardziej eleganckie rozwiązanie bez globalnego vectora? :)

vector <cProstokat> vec;
auto w1=vec.begin();
void cScena::klawisz(char key, float x_d, float y_d)
{
	switch (key) {
	case 'n':
		{
			vec.push_back(a4);
			tab.push_back(a4);
			glutPostRedisplay();
		}	break;
	case '+'://przechodzi na kolejny obiekt
		{
			cout<<"+"<<endl;
			w1++;
		}break;
	case '-'://wraca do poprzedniego obiektu
		{
			w1--;
		}break;
	case '1':
		w1->x+=.1;
		w1->y+=.1;
		glutPostRedisplay();
		break;
	case '2':
		w1->x-=.1;
		w1->y-=.1;
		glutPostRedisplay();
		break;
	case 'x':
	case 'X':
		exit(0);

	}
}

 
2

auto w1=vec.begin(); przerzuć to do wnętrza funkcji.
Na moment tworzenia tej zmiennej wektor jest pusty, zatem nie możesz wykonać vec.begin() (no bo nic w nim nie ma).

1

Po kiego tworzysz kopii iteratorów tu: w1--; i tu: w1++; ? Optymizator nie ma prawa tego zoptymalizować. http://4programmers.net/Forum/1101404
Tak się zastanawiam czy ma sens tobie pomagać skoro ignorujesz wszystko co tobie się mówi.

0

Nie wiem czy dobrze zrozumiałem @_13th_Dragon, napisałem takie coś i mam takie errory:
error C2758: 'cScena::tab' : must be initialized in constructor base/member initializer list
error C2758: 'cScena::it' : must be initialized in constructor base/member initializer list
w obu konstruktorach, co zrobiłem źle?

 
class cScena
{
	vector <cProstokat> & tab;
	 vector<cProstokat>::iterator &it ;
public:
	void rysuj();
	void init();
	void klawisz(char key, float x, float y);
	void start();
	cScena(vector<cProstokat>::iterator &it_2);
	cScena();
};
cScena::cScena(vector<cProstokat>::iterator &it_2)
{
	it=it_2;
}
cScena::cScena()
{
	it=tab.begin();
}
 
1
class cScena
{
    vector<cProstokat> &tab;
    vector<cProstokat>::iterator it ;
public:
    void rysuj();
    void init();
    void klawisz(char key, float x, float y);
    void start();
    cScena(vector<cProstokat> &tab):tab(tab) {  it=tab.begin(); }
    //cScena(); // nie da rady mieć składowe referencyjne oraz konstruktor domyślny aby całość zachowało jakikolwiek sens.
};
0

Jak mam tak, to przy deklaracji

  cScena zm;

Mam error o konstruktorze domyślnym:
error C2512: 'cScena' : no appropriate default constructor available

1
vector<cProstokat> tab;
tab.push_back(...);
cScena zm(tab);

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