-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMap.cpp
More file actions
106 lines (106 loc) · 3.08 KB
/
Map.cpp
File metadata and controls
106 lines (106 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include"Headers/Map.h"
#include"Headers/Global.h"
#include"Headers/Mario.h"
#include"Headers/Geezer.h"
#include"Headers/Turtle.h"
#include"Headers/Treasure.h"
#include<fstream>
#include<algorithm>
Map::Map(RenderWindow& window,Mario& mario):window(window),mario(mario){
ifstream ifs("MapResource/l4.txt");
brick.loadFromFile("Resource/brick.png");
sprite.setTexture(brick);
vector<vector<int>> tem;
int a,b,c,d,e;
int siz=0;
while(!ifs.eof()){
siz=max(a,siz);
ifs>>a>>b>>c>>d>>e;
tem.push_back({a,b,c,d,e});
}
ifs.close();
m.resize(siz+1,vector<Point>(ScreenHeight/CellSize));
//初始化地图
for(auto &it:tem){
if((Type)it[4]==Brick_){
m[it[0]][it[1]]=Point(it[2],it[3],Brick_);
}else if((Type)it[4]==Geezer_){
shared_ptr<Geezer> ptr(new Geezer());
ptr->setTexturePos(it[2],it[3]);
ptr->setPos(it[0],it[1]);
ptr->type=Geezer_;
enemies.push_back(ptr);
}else if((Type)it[4]==Turtle_){
shared_ptr<Turtle> ptr(new Turtle());
ptr->setTexturePos(it[2],it[3]);
ptr->setPos(it[0],it[1]);
ptr->type=Turtle_;
enemies.push_back(ptr);
}else if((Type)it[4]==Coin){
shared_ptr<Treasure> ptr(new Treasure());
ptr->setTexturePos(it[2],it[3]);
ptr->setPos(it[0],it[1]);
ptr->type=Coin;
treasures.push_back(ptr);
}
}
}
void Map::init(){
for(int i=0;i<m.size();i++){
for(int j=0;j<ScreenHeight/CellSize;j++){
if(m[i][j].type!=Empty){//每个砖块都是一个对象
m[i][j].entity=shared_ptr<Entity>(EntityFactory::getEntity(m[i][j].type,&mario,this,&window));
m[i][j].entity->setPos(i,j);
m[i][j].entity->setTexturePos(m[i][j].x,m[i][j].y);
}//初始化地图里面的对象
}
}
for(auto& it:enemies){
it->setProperty(&mario,this,&window);
}
for(auto& it:treasures){
it->setProperty(&mario,this,&window);
}
}
void Map::draw(){
for(int i=0;i<m.size();i++){
for(int j=0;j<ScreenHeight/CellSize;j++){
if(m[i][j].type!=Empty){
m[i][j].entity->draw();//把绘图写到entity中
}
}
}
for(auto& it:enemies){
it->draw();
}
for(auto& it:treasures){
it->draw();
}
}
void Map::update(){
for(int i=0;i<m.size();i++){
for(int j=0;j<ScreenHeight/CellSize;j++){
if(m[i][j].type!=Empty){
m[i][j].entity->update();
if(mario.dx!=0||mario.dy!=0){
mario.pos.x+=mario.dx;
mario.pos.y+=mario.dy;
}
}
}
}
for(auto& it:enemies){
it->update();
}
for(auto& it:treasures){
it->update();
}
//移除死掉的敌人
for(auto iter=enemies.begin();iter!=enemies.end();){
if((*iter)->state==Dead){
iter=enemies.erase(iter);
}else{
iter++;
}
}
}