stratgame
annotate level/src/level.cc @ 5:2e38715de41b
terrain
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 27 May 2012 07:00:48 +0300 |
parents | 8d95187cb3ee |
children |
rev | line source |
---|---|
nuclear@0 | 1 #include <stdio.h> |
nuclear@0 | 2 #include <string.h> |
nuclear@5 | 3 #include "opengl.h" |
nuclear@0 | 4 #include "level.h" |
nuclear@2 | 5 #include "datapath.h" |
nuclear@5 | 6 #include "terrain.h" |
nuclear@2 | 7 |
nuclear@2 | 8 using namespace tinyxml2; |
nuclear@0 | 9 |
nuclear@0 | 10 Level::Level() |
nuclear@0 | 11 { |
nuclear@0 | 12 } |
nuclear@0 | 13 |
nuclear@0 | 14 Level::~Level() |
nuclear@0 | 15 { |
nuclear@0 | 16 } |
nuclear@0 | 17 |
nuclear@0 | 18 bool Level::load(const char *fname) |
nuclear@0 | 19 { |
nuclear@2 | 20 push_data_path(); |
nuclear@2 | 21 add_data_path(fname); |
nuclear@2 | 22 |
nuclear@2 | 23 if(xml.LoadFile(fname) != 0) { |
nuclear@0 | 24 fprintf(stderr, "failed to load level: %s\n", fname); |
nuclear@2 | 25 pop_data_path(); |
nuclear@0 | 26 return false; |
nuclear@0 | 27 } |
nuclear@0 | 28 |
nuclear@1 | 29 if(strcmp(xml.RootElement()->Name(), "level") != 0) { |
nuclear@0 | 30 fprintf(stderr, "invalid level file: %s\n", fname); |
nuclear@2 | 31 pop_data_path(); |
nuclear@0 | 32 return false; |
nuclear@0 | 33 } |
nuclear@2 | 34 |
nuclear@2 | 35 XMLNode *node = xml.RootElement()->FirstChild(); |
nuclear@2 | 36 do { |
nuclear@2 | 37 XMLElement *elem = node->ToElement(); |
nuclear@5 | 38 if(!elem) { |
nuclear@5 | 39 fprintf(stderr, "ignoring non-element child of <level>\n"); |
nuclear@5 | 40 continue; |
nuclear@5 | 41 } |
nuclear@2 | 42 |
nuclear@5 | 43 if(strcmp(elem->Name(), "terrain") == 0) { |
nuclear@5 | 44 if(terrain) { |
nuclear@5 | 45 fprintf(stderr, "<level> must only have a single terrain child! ignoring\n"); |
nuclear@5 | 46 continue; |
nuclear@5 | 47 } |
nuclear@2 | 48 |
nuclear@5 | 49 terrain = new Terrain; |
nuclear@5 | 50 if(!terrain->load(elem)) { |
nuclear@5 | 51 fprintf(stderr, "failed to load terrain\n"); |
nuclear@5 | 52 pop_data_path(); |
nuclear@5 | 53 return false; |
nuclear@2 | 54 } |
nuclear@5 | 55 |
nuclear@5 | 56 float val; |
nuclear@5 | 57 if(elem->QueryFloatAttribute("size", &val) == 0) { |
nuclear@5 | 58 printf("terrain size: %f\n", val); |
nuclear@5 | 59 terrain->set_size(val); |
nuclear@5 | 60 } |
nuclear@5 | 61 } else { |
nuclear@5 | 62 fprintf(stderr, "ignoring unexpected child of <level>: %s\n", elem->Name()); |
nuclear@5 | 63 continue; |
nuclear@2 | 64 } |
nuclear@5 | 65 |
nuclear@2 | 66 } while((node = node->NextSibling())); |
nuclear@2 | 67 |
nuclear@2 | 68 pop_data_path(); |
nuclear@2 | 69 return true; |
nuclear@2 | 70 } |
nuclear@2 | 71 |
nuclear@3 | 72 void Level::draw() const |
nuclear@3 | 73 { |
nuclear@5 | 74 terrain->draw(); |
nuclear@3 | 75 } |