Arch Game Engine  0.2
level.cpp
1 #include "level.h"
2 
3 Level::Level() {
4  screen.setPos(0, 0, 1000, 1000);
5  precise = false;
6  mainEntitySet = false;
7  activeCam = activeLens = 0;
8 }
9 Level::~Level() {}
10 
11 void Level::create() {
12  setScale(stage.getTileset().getTileset()[stage.getMap().getMap()[0][0]].getPosW(), stage.getTileset().getTileset()[stage.getMap().getMap()[0][0]].getPosH());
13 }
14 
15 void Level::setScale(int w, int h) {
16  tilewidth = w;
17  tileheight = h;
18  tiles.empty(); tiles.clear();
19  vector<Tile> row;
20  for(int r=0; r<stage.getMap().getMap().size(); r++) {
21  row.empty(); row.clear();
22  for(int c=0; c<stage.getMap().getMap()[r].size(); c++) {
23  if(stage.getMap().getMap()[r][c] != 0) {
24  Tile tmp = stage.getTileset().getTileset()[stage.getMap().getMap()[r][c]];
25  tmp.setValue(stage.getMap().getMap()[r][c]);
26  tmp.setFrame(stage.getTileset().getFrame(tmp.getValue()));
27  tmp.setPos(c*w, r*h, w, h);
28  tmp.setDestSize(w, h);
29  tmp.setCoord(c, r);
30  row.push_back(tmp);
31  }
32  }
33  tiles.push_back(row);
34  }
35  setCoord(stage.getMap().getX(), stage.getMap().getY());
36  if(precise) setCoord(stage.getMap().getX()*tilewidth, stage.getMap().getY()*tileheight);
37 }
38 
39 void Level::move(int mx, int my) {
40  if(mainEntitySet) {
41  Object splicedScreen = screen;
42  if(activeCam & col.outOfBoundsOf(entities[mainEntityID], camera)) {
43  bool none=true;
44  cout << "out" << endl;
45  if(activeCam && col.isAbove(entities[mainEntityID], camera) && my>0) { setCoord(getX()+mx, getY()-my); none=false; }
46  if(activeCam && col.isBelow(entities[mainEntityID], camera) && my<0) { setCoord(getX()+mx, getY()-my); none=false; }
47  if(activeCam && col.isRightOf(entities[mainEntityID], camera) && mx>0) { setCoord(getX()+mx, getY()-my); none=false; }
48  if(activeCam && col.isLeftOf(entities[mainEntityID], camera) && mx<0) { setCoord(getX()+mx, getY()-my); none=false; }
49  if(none) moveEntity(mainEntityID, mx, my);
50  if(!none) camera.setPosCoord(camera.getPosX()+mx, camera.getPosY()-my);
51  } else {
52  moveEntity(mainEntityID, mx, my);
53  }
54  } else {
55  setCoord(getX()+mx, getY()-my);
56  }
57 }
58 
59 void Level::moveEntity(int id, int mx, int my) {
60  entities[id].setPosCoord(entities[id].getPosX()+mx, entities[id].getPosY()-my);
61  vector<Tile> tilesToCol = getTilesToRender();
62  for(int i=0; i<tilesToCol.size(); i++) {
63  if(tilesToCol[i].isSolid()) {
64  if(col.isTouching(entities[id], tilesToCol[i])) {
65  entities[id].setPosCoord(entities[id].getPosX()-mx, entities[id].getPosY()+my);
66  camera.setPosCoord(camera.getPosX()+mx, camera.getPosY()-my);
67  setCoord(getX()+mx, getY()-my);
68  }
69  }
70  }
71 }
72 
73 vector<Tile> Level::getTilesToRender() {
74  vector<Tile> tilesToRender;
75  for(int r=0; r<tiles.size(); r++) {
76  for(int c=0; c<tiles[r].size(); c++) {
77  if(col.isTouching(screen, tiles[r][c])) {
78  tiles[r][c].setDisplayable(true);
79  tiles[r][c].setDestCoord(tiles[r][c].getPosX()-screen.getPosX(), tiles[r][c].getPosY()-screen.getPosY());
80  tilesToRender.push_back(tiles[r][c]);
81  } else {
82  tiles[r][c].setDisplayable(false);
83  }
84  }
85  }
86  return tilesToRender;
87 }
88 
89 vector<Object> Level::getObjectsToRender() {
90  vector<Object> objectsToRender;
91  for(int i=0; i<objects.size(); i++) {
92  if(col.isTouching(screen, objects[i])) {
93  objects[i].setDisplayable(true);
94  objects[i].setDestCoord(objects[i].getPosX()-screen.getPosX(), objects[i].getPosY()-screen.getPosY());
95  objectsToRender.push_back(objects[i]);
96  } else {
97  objects[i].setDisplayable(false);
98  }
99  }
100  return objectsToRender;
101 }
102 
103 vector<Entity> Level::getEntitiesToRender() {
104  vector<Entity> entitiesToRender;
105  for(int i=0; i<entities.size(); i++) {
106  if(col.isTouching(screen, entities[i])) {
107  entities[i].setDisplayable(true);
108  entities[i].setDestCoord(entities[i].getPosX()-screen.getPosX(), entities[i].getPosY()-screen.getPosY());
109  entitiesToRender.push_back(entities[i]);
110  } else {
111  entities[i].setDisplayable(false);
112  }
113  }
114  return entitiesToRender;
115 }
116 
118  objects.push_back(o);
119 }
120 void Level::addObject(vector<Object> o) {
121  objects.insert(objects.end(), o.begin(), o.end());
122 }
123 
125  entities.push_back(e);
126  return entities.size()-1;
127 }
128 void Level::addEntity(vector<Entity> e) {
129  entities.insert(entities.end(), e.begin(), e.end());
130 }
131 
133  return setMainEntity(addEntity(e));
134 }
136  mainEntityID = m;
137  mainEntitySet = true;
138  return m;
139 }
140 
141 void Level::setCameraMargin(int wm, int hm) {
142  camera.setPos(wm, hm, screen.getPosW()-wm-wm, screen.getPosH()-hm-hm);
143  activeCam = true;
144 }
145 void Level::centerCamera(int percentage) {
146  int wsize = ((percentage/2)*screen.getPosW())/100;
147  int hsize = ((percentage/2)*screen.getPosH())/100;
148  setCameraMargin(wsize, hsize);
149 }
150 Object Level::getCamera() {
151  return camera;
152 }
153 void Level::setLensMargin(int wm, int hm) {
154  lens.setPos(camera.getPosX()+wm, camera.getPosY()+hm, camera.getPosW()-wm-wm, camera.getPosH()-hm-hm);
155  activeLens = true;
156 }
157 void Level::centerLens(int percentage) {
158  int wsize = ((percentage/2)*camera.getPosW())/100;
159  int hsize = ((percentage/2)*camera.getPosH())/100;
160  setLensMargin(wsize, hsize);
161 }
162 Object Level::getLens() {
163  return lens;
164 }
This class stores information for an Object in the game.
Definition: object.h:12
bool isAbove(Object a, Object b)
Check if the first object is above the second object.
Definition: collision.cpp:47
void create()
Create the Level based on the given stage.
Definition: level.cpp:11
bool isRightOf(Object a, Object b)
Check if the first object is to the right of the second object.
Definition: collision.cpp:63
int setMainEntity(Entity e)
Set main Entity.
Definition: level.cpp:132
bool outOfBoundsOf(Object a, Object b)
Check if two object are not touching.
Definition: collision.cpp:37
Map getMap() const
Get the Map.
Definition: stage.h:27
vector< Object > getObjectsToRender()
Return the Objects that are currently on the screen.
Definition: level.cpp:89
double getY() const
Get the y coordinate.
Definition: level.h:58
double getX() const
Get the x coordinate.
Definition: level.h:56
void setValue(int v)
Set value of the tile. This is used when reading from a map file, etc.
Definition: tile.cpp:5
int addEntity(Entity e)
Add Entity to Level.
Definition: level.cpp:124
vector< vector< int > > getMap() const
Get the vector of integers found in the file.
Definition: map.h:24
void setFrame(SDL_Rect i)
Set the frame with a given SDL_Rect.
Definition: object.h:72
vector< Entity > getEntitiesToRender()
Return the Entities that are currently on the screen.
Definition: level.cpp:103
void setCoord(double x, double y)
Set the coordinate of the Object with a given x and y.
Definition: object.h:38
vector< Tile > getTilesToRender()
Return the Tiles that are currently on the screen.
Definition: level.cpp:73
bool isBelow(Object a, Object b)
Check if the first object is below the second object.
Definition: collision.cpp:55
void setCoord(double x, double y)
Set the coordinate for the screen with a given x and y.
Definition: level.h:50
int getY() const
Get the start y coordinate found in the file.
Definition: map.h:22
void addObject(Object o)
Add Object to Level.
Definition: level.cpp:117
Class for storing health, emotion, team, etc. of an Object.
Definition: entity.h:9
Tileset getTileset() const
Get the Tileset.
Definition: stage.h:35
void setScale(int w, int h)
Scale the Level by giving it the width and height to scale by.
Definition: level.cpp:15
An Object class that stores the a tile value and name.
Definition: tile.h:7
void move(int mx, int my)
Move the screen by passing in how much to move on the x and y coordinates.
Definition: level.cpp:39
int getValue() const
Get the value of the Tile.
Definition: tile.h:17
bool isLeftOf(Object a, Object b)
Check if the first object is to the left of the second object.
Definition: collision.cpp:71
int getX() const
Get the start x coordinate found in the file.
Definition: map.h:20
void setPos(SDL_Rect i)
Set the position with a given SDL_Rect.
Definition: object.h:76
bool isTouching(Object a, Object b)
Check if two objects are touching.
Definition: collision.cpp:7