-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEngine.cpp
157 lines (120 loc) · 3.35 KB
/
Engine.cpp
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <iostream>
#include <fstream>
#include <conio.h> //inline 쓰려면 전처리 해줘야 한다.
#include <algorithm>
#include "SDL_mixer.h"
#include "Engine.h"
#include "World.h"
#include "Wall.h"
#include "Player.h"
#include "Goal.h"
#include "Floor.h"
#include "Monster.h"
#include "SDL.h"
#include "ASound.h"
#include "Text.h"
int Engine::KeyCode = 0; //헤더에 선언만 하고 cpp에 초기화 해야한다.
Engine* Engine::Instance = nullptr;
Engine::Engine()
{
Instance = this;
Initialize();
}
Engine::~Engine()
{
Terminate();
}
void Engine::Initialize()
{
bRunning = true;
MyWorld = new World();
if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
SDL_Log("SDL_INIT_ERROR");
}
MyWindow = SDL_CreateWindow("Maze", 100, 100, 800, 600, SDL_WINDOW_OPENGL);
MyRenderer = SDL_CreateRenderer(MyWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
//사운드 초기화
Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048);
TTF_Init();
}
void Engine::Load(string MapFilename)
{
//for (int i = 0; i <= 9; ++i)
//{
// Myworld->MyActors.push_back(new AWall(i, 0, '#', true));// 마이월드에 있는 마이엑터라는 리스트에 새로운 벽으로 추가한다.
// Myworld->MyActors.push_back(new AWall(i, 9, '#', true));
//}
//for (int i = 1; i <= 8; ++i)
//{
// Myworld->MyActors.push_back(new AWall(0, i, '#', true));
// Myworld->MyActors.push_back(new AWall(9, i, '#', true));
//}
//Myworld->MyActors.push_back(new APlayer(1, 1, 'P', true));
//Myworld->MyActors.push_back(new AGoal(8, 8, 'G', true));
ifstream MapFile(MapFilename); // 입력 파일 , 괄호 안에는 파일 이름
int Y = 0;
int MaxX = 0;
while (MapFile.peek() != EOF)//peek==몇번 줄 몇번 칸인지 // EOF =end of file
{
char Buffer[1024] = { 0, };
MapFile.getline(Buffer, 1024); // 한 줄을 읽어와라.
MaxX = strlen(Buffer);
for (size_t X = 0; X < strlen(Buffer); ++X) // 버퍼의 사이즈는 양수이기에 size_t를 사용
{
char Cursor = Buffer[X];
switch (Cursor)
{
case '#':
MyWorld->SpawnActor(new AWall((int)X, Y, '#', true));
break;
case 'P':
MyWorld->SpawnActor(new APlayer((int)X, Y, 'P', false));
break;
case 'G':
MyWorld->SpawnActor(new AGoal((int)X, Y, 'G', false));
break;
case 'M':
MyWorld->SpawnActor(new AMonster((int)X, Y, 'M', false));
break;
}
MyWorld->SpawnActor(new AFloor((int)X, Y, ' ', false)); // 바닥을 그리고 그 위에 액터가 올라가야하기 문
}
Y++;
}
SDL_SetWindowSize(MyWindow, MaxX * 60, Y * 60); //창 사이즈 바꾸기
//그리는 순간의 순서를 변경
sort(MyWorld->MyActors.begin(), MyWorld->MyActors.end(), AActor::Compare);
MapFile.close();
MyWorld->SpawnActor(new ASound(100, 100, "data/bgm.mp3", -1));
MyWorld->SpawnActor(new AText(100, 100, "Hello World", SDL_Color{ 255, 0, 0 }, 40));
}
void Engine::Run()
{
MyWorld->BeginPlay();//run할 때 마이월드의 비긴플레이 실행해
while (bRunning) //1Frame
{
DeltaSeconds = SDL_GetTicks64() - LastTick;
Input();
MyWorld->Tick();
SDL_SetRenderDrawColor(MyRenderer, 0xff, 0x00, 0x00, 0xff);
SDL_RenderClear(MyRenderer);
MyWorld->Render();
/*SDL_RenderFillRect(MyRenderer, new SDL_Rect{ 0, 0, 100, 100 });*/
LastTick = SDL_GetTicks64();
SDL_RenderPresent(MyRenderer);
}
}
void Engine::Terminate()
{
delete MyWorld;
MyWorld = nullptr;
SDL_DestroyRenderer(MyRenderer);
SDL_DestroyWindow(MyWindow);
SDL_Quit();
TTF_Quit();
}
void Engine::Input()
{
SDL_PollEvent(&MyEvent);//input
}