glut, C++ - dobry interfejs klasy

0

Piszę sobie w glucie grę i chce mieć interfejs dla klasy "Game". W glutcie muszę przekazać funkcję renderującą, ale chciałbym, żeby była ona niewidoczna z zewnątrz. Jak to zrobić?
Myślałem o tym, żeby utworzyć kolejną klasę, gdzie funkcje będą publiczne i będzie można przekazać je do funkcji z glut, ale może jest jakiś lepszy sposób?

1

A glut przyjmuje wskaźnik na funkcję? Bo wiesz, wskaźnik na funkcję, a na metodę to dwa typy. Poza tym, metoda bez kontekstu jest bezużyteczna, chyba że to metoda statyczna, ale wtedy linkowana jest jak zwykła funkcja. ;)

0

Dzięki za odpowiedź, ale nie mam pojęcia o czym mówisz xD.

Opiszę mój problem bardziej szczegółowo:

Chodzi o funkcję:
void glutDisplayFunc(), której muszę przekazać funkcję rysującą.

Klasa "Game" nie upublicznia funkcji rysującej, więc gdzie powinna się znajdować funkcja rysująca? Jak to zorganizować?
Wie może ktoś?

0
Azrael_Valedhel napisał(a)

A glut przyjmuje wskaźnik na funkcję? Bo wiesz, wskaźnik na funkcję, a na metodę to dwa typy. Poza tym, metoda bez kontekstu jest bezużyteczna, chyba że to metoda statyczna, ale wtedy linkowana jest jak zwykła funkcja. ;)

Dobra, a więc jak zadeklarować taką funkcję? Da się to zrobić w klasie?

1

No wnosząc po prototypie funkcji z gluta: http://www.opengl.org/resources/libraries/glut/spec3/node46.html

void glutDisplayFunc(void (*func)(void));

to:

struct A {
    static void foo() { ... }
};

albo

void foo() { ... }

Metody prywatnej tam nie przekażesz (co nie miałoby i tak sensu, trzeba by przekazać też obiekt).

Chociaż... Czy tam nie trzeba by extern "C"? Ja się grami nie zajmuję, więc i z glutem nie mam do czynienia. Potrzebujemy więc rady kogoś kto się na tym zna. ;)

0

No więc można użyć wywołania zwrotnego (callback) w tym przypadku, ale funkcja rysująca musiała by być publiczna, więc i tak potrzebowałbym dodatkowej klasy, żeby ukryć ją.

0

Kiedyś coś w tym pisałem i rozwiązałem to w trochę inny sposób, sama funkcja renderująca była funkcją globalną, ale jedyne co robiła to wywoływała metodę odpowiedzialną za rendering klasy, której instancje były kolekcjami obiektów do narysowania. Wszystkie takie obiekty(ściana, potworek, whatever) mały wspólną klasę bazową m.in. z wirtualną funkcją render. I po prostu metoda render z tej kolekcji leciała po wszystkich obiektach do narysowania i wywoływała ich metody render.

Dzięki temu uniezależniasz się od implementacji renderingu poszczególnych obiektów czy też całej sceny.

//Chyba napisałem to dość jasno, jeszcze śpię, ale kawa już zrobiona :D

0

No więc mam klasę Renderer i jak mam teraz wywołać z niej metodę render() w funkcji globalnej, jeśli instancję Renderer mam zadeklarowaną jako prywatne pole w klasie Game?

0

Niestety, glut jest wybitnie nieobiektowy. Może istnieje jakaś podobna biblioteka, bardziej OOP-friendly?

1
marcos3131 napisał(a)

No więc mam klasę Renderer i jak mam teraz wywołać z niej metodę render() w funkcji globalnej, jeśli instancję Renderer mam zadeklarowaną jako prywatne pole w klasie Game?

Stwórz w klasie game publiczną metodę render i w niej wywołuj render z klasy Renderer.

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