@@ -117,42 +117,75 @@ void DrawingGameVisitor::visit(Player& player) {
117117
118118}
119119
120+ void drawTexturedCircle (std::pair<float , float > texCenter, float texRadius, std::pair<float , float > screenCenter, float screenRadius, int articulation = 20 ) {
121+ glBegin (GL_TRIANGLE_FAN);
122+ texCoordPair (texCenter);
123+ glVertex2f (screenCenter.first , screenCenter.second );
124+ for (int i = 0 ; i < articulation + 1 ; i++) {
125+ double angle = ((double ) i) * (2 . * M_PI) / (double )articulation;
126+ double tangle = ((double ) -i) * (2 . * M_PI) / (double )articulation;
127+ texCoordPair ({texCenter.first + texRadius * std::cos (tangle), texCenter.second + texRadius * std::sin (tangle)});
128+ glVertex2d (screenCenter.first + (screenRadius * std::cos (angle)), screenCenter.second + (screenRadius * std::sin (angle)));
129+ }
130+ glEnd ();
131+ }
132+
120133void DrawingGameVisitor::visit (ResourceTile& tile) {
121134 Coordinate coord = tile.getLocation ();
122- static GLuint tileTextures = loadImageAsTexture (" resources/tiles .bmp" );
135+ static const GLuint tileTextures = loadImageAsTexture (" resources/catan_sprite_sheet .bmp" );
123136 glBindTexture (GL_TEXTURE_2D, tileTextures);
124- typedef std::vector<pair<float , float > > texCoordList;
125- static const std::map<resourceType, texCoordList> resourceTexCoords = {
126- make_pair (WHEAT, texCoordList { make_pair (377 , 73 ), make_pair (500 , 285 ),
127- make_pair (380 , 502 ), make_pair (136 , 503 ), make_pair (10 , 288 ), make_pair (134 , 74 )}),
128- make_pair (SHEEP, texCoordList { make_pair (959 , 75 ), make_pair (1076 , 288 ),
129- make_pair (955 , 503 ), make_pair (712 , 501 ), make_pair (586 , 289 ), make_pair (708 , 73 )}),
130- make_pair (WOOD, texCoordList { make_pair (1491 , 60 ), make_pair (1618 , 269 ),
131- make_pair (1479 , 490 ), make_pair (1260 , 493 ), make_pair (1126 , 283 ), make_pair (1246 , 65 )}),
132- make_pair (STONE, texCoordList { make_pair (382 , 689 ), make_pair (506 , 898 ),
133- make_pair (386 , 1118 ), make_pair (142 , 1120 ), make_pair (17 , 905 ), make_pair (138 , 691 )}),
134- make_pair (BRICK, texCoordList { make_pair (1496 , 690 ), make_pair (1617 , 908 ),
135- make_pair (1490 , 1120 ), make_pair (1248 , 1118 ), make_pair (1124 , 898 ), make_pair (1250 , 688 )}),
136- make_pair (DESERT, texCoordList { make_pair (1496 , 690 ), make_pair (1617 , 908 ),
137- make_pair (1490 , 1120 ), make_pair (1248 , 1118 ), make_pair (1124 , 898 ), make_pair (1250 , 688 )}),
137+ static const std::map<resourceType, pair<float , float >> topRightPoints = {
138+ make_pair (WOOD, make_pair (260 .f , 17 .f )),
139+ make_pair (BRICK, make_pair (629 .f , 17 .f )),
140+ make_pair (STONE, make_pair (262 .f , 282 .f )),
141+ make_pair (SHEEP, make_pair (621 .f , 286 .f )),
142+ make_pair (WHEAT, make_pair (267 .f , 554 .f )),
143+ make_pair (DESERT, make_pair (620 .f , 555 .f ))
138144 };
145+ static const std::vector<pair<float , float >> resourceTexOffsets = {
146+ make_pair (0 .f , 0 .f ),
147+ make_pair (87 .f , 130 .f ),
148+ make_pair (0 .f , 261 .f ),
149+ make_pair (-174 .f , 261 .f ),
150+ make_pair (-260 .f , 130 .f ),
151+ make_pair (-175 , -1 )
152+ };
153+ static const std::map<int , pair<float , float >> numberTexPoints = {
154+ make_pair (2 , make_pair (1238 .5f , 70 .5f )),
155+ make_pair (3 , make_pair (1365 .5f , 70 .5f )),
156+ make_pair (4 , make_pair (1238 .5f , 178 .5f )),
157+ make_pair (5 , make_pair (1365 .5f , 178 .5f )),
158+ make_pair (6 , make_pair (1238 .5f , 286 .5f )),
159+ make_pair (8 , make_pair (1365 .5f , 286 .5f )),
160+ make_pair (9 , make_pair (1238 .5f , 404 .5f )),
161+ make_pair (10 , make_pair (1365 .5f , 404 .5f )),
162+ make_pair (11 , make_pair (1238 .5f , 515 .5f )),
163+ make_pair (12 , make_pair (1365 .5f , 515 .5f ))
164+ };
165+ static const float radius = 59 .5f ;
139166 static Coordinate adjacentCoordDiffs[] = {Coordinate (0 , 1 ), Coordinate (1 , 0 ), Coordinate (1 , -1 ), Coordinate (0 , -1 ), Coordinate (-1 , 0 ), Coordinate (-1 , 1 )};
140- if (resourceTexCoords.find (tile.resource ) == resourceTexCoords.end ()) {
167+ auto topRightPoint = topRightPoints.find (tile.getType ());
168+ if (topRightPoint == topRightPoints.end ()) {
141169 throw runtime_error (" Cannot draw this tile; it is invalid." );
142170 }
143- const texCoordList& texCoords = resourceTexCoords.find (tile.resource )->second ;
144171 glColor3d (1.0 , 1.0 , 1.0 );
172+
145173 glBegin (GL_TRIANGLE_FAN);
146- texCoordPair (averagePoint (texCoords));
174+ auto average = averagePoint (resourceTexOffsets);
175+ texCoordPair ({average.first + topRightPoint->second .first , average.second + topRightPoint->second .second });
147176 vertexPair (coord);
148- for (unsigned int i = 0 ; i < texCoords .size (); i++) {
149- texCoordPair (texCoords [i]);
177+ for (unsigned int i = 0 ; i < resourceTexOffsets .size (); i++) {
178+ texCoordPair (std::make_pair (resourceTexOffsets [i]. first + topRightPoint-> second . first , resourceTexOffsets[i]. second + topRightPoint-> second . second ) );
150179 Coordinate diff = adjacentCoordDiffs[i];
151180 vertexPair (Coordinate (coord.first + diff.first , coord.second + diff.second ));
152181 }
153- texCoordPair (texCoords[ 0 ] );
182+ texCoordPair (topRightPoint-> second );
154183 vertexPair (Coordinate (coord.first + adjacentCoordDiffs[0 ].first , coord.second + adjacentCoordDiffs[0 ].second ));
155184 glEnd ();
185+
186+ if (tile.getDiceValue () != 0 ) {
187+ drawTexturedCircle (numberTexPoints.find (tile.getDiceValue ())->second , radius, coordToScreen (coord), 0.04 );
188+ }
156189 glBindTexture (GL_TEXTURE_2D, 0 );
157190}
158191
0 commit comments