33
44using namespace std ;
55
6- GameManager::GameManager (GLuint program ) {
7- shaderProgram = program ;
8- sceneGraph = new SceneGraph (program );
9- viewMode = 1 ;
6+ GameManager::GameManager (GLuint* objectShader, GLuint* lightShader ) {
7+ objectProgram = objectShader ;
8+ sceneGraph = new SceneGraph (objectShader, lightShader );
9+ text = new Text2D ( " Holstein.DDS " ) ;
1010
11+ viewMode = 1 ;
1112 isGameEnd = false ;
1213 score = 0 ;
1314 firenum = 0 ;
@@ -17,28 +18,24 @@ GameManager::GameManager(GLuint program) {
1718
1819 groundMaxX = 1000 ;
1920 isHole = false ;
21+ lightAngle = 0 ;
2022}
2123
2224// ###### Draw ######
2325
2426void GameManager::draw () {
27+ glUseProgram (*objectProgram);
2528 sceneGraph->draw ();
26-
27- string scoreText = " score: " + to_string (score);
28- showText (300 , glutGet (GLUT_WINDOW_HEIGHT) - 300 , scoreText);
29- if (isGameEnd) {
30- showText (300 , glutGet (GLUT_WINDOW_HEIGHT) - 300 , " The Game End" );
31- }
3229}
3330
34- void GameManager::showText (float x, float y, std::string string) {
35- glColor3f (1.0 , 1.0 , 1.0 );
36- glRasterPos3f (x, y, 0 );
37- const char * str = string.c_str ();
31+ void GameManager::drawText () {
32+ glUseProgram (text->getProgramID ());
33+ string scoreText = " score: " + to_string (score);
34+ text->printText2D (scoreText.c_str (), 20 , 60 , 20 );
35+ if (isGameEnd)
36+ text->printText2D (" Game Over" , 20 , 20 , 20 );
3837
39- for (const char * c = str; *c != ' \0 ' ; c++) {
40- glutBitmapCharacter (GLUT_BITMAP_TIMES_ROMAN_24, *c);
41- }
38+ glUseProgram (0 );
4239}
4340
4441// ###### Update ######
@@ -48,6 +45,7 @@ void GameManager::move(void(*t)(int)) {
4845 SceneNode* fireGroup = sceneGraph->findGroup (typeid (Fire));
4946 SceneNode* starGroup = sceneGraph->findGroup (typeid (Star));
5047 SceneNode* mushGroup = sceneGraph->findGroup (typeid (Mush));
48+ SceneNode* lightGroup = sceneGraph->findGroup (typeid (PointLight));
5149
5250 // 1. Character move
5351 Character* character = dynamic_cast <Character*>(sceneGraph->findNode (typeid (Character))->getEntity ());
@@ -142,6 +140,20 @@ void GameManager::move(void(*t)(int)) {
142140 }
143141 }
144142
143+ // 6. Point Light
144+ PointLight* light = dynamic_cast <PointLight*>(sceneGraph->findNode (typeid (PointLight))->getEntity ());
145+
146+ lightAngle += 0.05 ;
147+ if (lightAngle >= 360 )
148+ lightAngle -= 360 ;
149+
150+ vec3 characterPos = character->getPosition ();
151+ light->rotate (characterPos, lightAngle);
152+ vec4 lightPos = vec4 (light->getPosition (), 1 .0f );
153+
154+ GLuint pointLightLoc = glGetUniformLocation (*objectProgram, " lightPosition" );
155+ glUniform4fv (pointLightLoc, 1 , &lightPos[0 ]);
156+
145157 if (isGameEnd) {
146158 character->sink ();
147159 glutPostRedisplay ();
@@ -225,7 +237,7 @@ void GameManager::firemaker(void(*t)(int)) {
225237 firenum--;
226238 }
227239 if (firenum < MAXFIRE) {
228- Fire* newFire = new Fire (glutGet (GLUT_WINDOW_WIDTH), pos, sceneGraph->materials ->getModel (FIRE), shaderProgram );
240+ Fire* newFire = new Fire (glutGet (GLUT_WINDOW_WIDTH), pos, sceneGraph->materials ->getModel (FILENAME:: FIRE), objectProgram );
229241 SceneNode* fireNode = new SceneNode (newFire);
230242 sceneGraph->addChild (fireGroup, fireNode);
231243 firenum++;
@@ -248,7 +260,7 @@ void GameManager::starmaker(void(*t)(int)) {
248260 starnum--;
249261 }
250262 if (starnum < MAXSTAR) {
251- Star* newStar = new Star (glutGet (GLUT_WINDOW_WIDTH), pos, sceneGraph->materials ->getModel (STAR), shaderProgram );
263+ Star* newStar = new Star (glutGet (GLUT_WINDOW_WIDTH), pos, sceneGraph->materials ->getModel (FILENAME:: STAR), objectProgram );
252264 SceneNode* starNode = new SceneNode (newStar);
253265 sceneGraph->addChild (starGroup, starNode);
254266 starnum++;
@@ -273,7 +285,7 @@ void GameManager::groundmaker(void(*t)(int)) {
273285 }
274286 if (groundnum < MAXGROUND) {
275287 for (int i = 0 ; i < height[random]; i++) {
276- Ground* newGround = new Ground (groundMaxX, i, sceneGraph->materials ->getModel (GROUND), shaderProgram );
288+ Ground* newGround = new Ground (groundMaxX, i, sceneGraph->materials ->getModel (FILENAME:: GROUND), objectProgram );
277289 SceneNode* groundNode = new SceneNode (newGround);
278290
279291 sceneGraph->addChild (groundGroup, groundNode);
@@ -299,7 +311,7 @@ void GameManager::mushmaker(void(*t)(int)) {
299311 mushnum--;
300312 }
301313 if (mushnum < MAXMUSH) {
302- Mush* newMush = new Mush (sceneGraph->materials ->getModel (MUSHROOM), shaderProgram );
314+ Mush* newMush = new Mush (sceneGraph->materials ->getModel (FILENAME:: MUSHROOM), objectProgram );
303315 SceneNode* mushNode = new SceneNode (newMush);
304316 sceneGraph->addChild (mushGroup, mushNode);
305317
0 commit comments