ConsoleGameEngine
178 строк · 4.7 Кб
1#define CGE_IMPL
2#include "ConsoleGameEngine.hpp"
3
4using namespace std;
5
6class Frogger : public ConsoleGameEngine
7{
8public:
9Frogger()
10{
11sAppName = L"Frogger";
12}
13
14private:
15Sprite* sprBus = nullptr;
16Sprite* sprCar1 = nullptr;
17Sprite* sprCar2 = nullptr;
18Sprite* sprFrog = nullptr;
19Sprite* sprHome = nullptr;
20Sprite* sprLog = nullptr;
21Sprite* sprPavement = nullptr;
22Sprite* sprWall = nullptr;
23Sprite* sprWater = nullptr;
24
25vector<pair<float, string>> vecLines = {
26{ 0.0f, "oohhooohhooohhoo""oohhooohhooohhoo" },
27{ -4.0f, "wwqstwwwwwqstwww""wwqstwwwwwqstwww" },
28{ 3.5f, "wqstwwwqstwwqstw""wqstwwwqstwwqstw" },
29{ -4.5f, "wwwqstwwwqstwwww""wwwqstwwwqstwwww" },
30{ 0.0f, "pppppppppppppppp""pppppppppppppppp" },
31{ 3.5f, "rabcdrrrrefrrrrr""rabcdrrrrefrrrrr" },
32{ -3.5f, "rrrrrgkrrrrrrrrr""rrrrrgkrrrrrrrrr" },
33{ 3.5f, "rrefrrrrrabcdrrr""rrefrrrrrabcdrrr" },
34{ 0.0f, "pppppppppppppppp""pppppppppppppppp" }
35};
36
37const int nTileSize = 8;
38
39float fFrogX = 8.0f;
40float fFrogY = 8.0f;
41
42float fGlobalTime = 0.0f;
43
44public:
45virtual bool OnUserCreate() override
46{
47sprBus = new Sprite(L"frogger_sprites/bus.spr");
48sprCar1 = new Sprite(L"frogger_sprites/car1.spr");
49sprCar2 = new Sprite(L"frogger_sprites/car2.spr");
50sprFrog = new Sprite(L"frogger_sprites/frog.spr");
51sprHome = new Sprite(L"frogger_sprites/home.spr");
52sprLog = new Sprite(L"frogger_sprites/log.spr");
53sprPavement = new Sprite(L"frogger_sprites/pavement.spr");
54sprWall = new Sprite(L"frogger_sprites/wall.spr");
55sprWater = new Sprite(L"frogger_sprites/water.spr");
56
57return true;
58}
59
60virtual bool OnUserUpdate(float fDeltaTime) override
61{
62fGlobalTime += fDeltaTime;
63
64float fPotentialX = fFrogX;
65float fPotentialY = fFrogY;
66
67if (GetKey(VK_LEFT).bPressed) fPotentialX -= 1.0f;
68if (GetKey(VK_RIGHT).bPressed) fPotentialX += 1.0f;
69if (GetKey(VK_UP).bPressed) fPotentialY -= 1.0f;
70if (GetKey(VK_DOWN).bPressed) fPotentialY += 1.0f;
71
72int nTileY = (int)fPotentialY;
73int nTileX = 0;
74
75int nOffset = (int)(vecLines[nTileY].first * fGlobalTime * (float)nTileSize) % (ScreenWidth() * 2);
76
77for (auto tile : vecLines[nTileY].second)
78{
79int x1 = (int)(fPotentialX * (float)nTileSize) + nTileSize;
80int y1 = (int)(fPotentialY * (float)nTileSize);
81
82int x2 = (nTileX * nTileSize + nOffset) % (ScreenWidth() * 2);
83int y2 = nTileY * nTileSize;
84if (x2 < 0) x2 = (ScreenWidth() * 2) - (abs(x2) % (ScreenWidth() * 2));
85
86if (x1 < x2 + nTileSize && y1 < y2 + nTileSize &&
87x2 < x1 + nTileSize && y2 < y1 + nTileSize)
88{
89if (string("o").find(tile) != string::npos)
90{
91fPotentialX = fFrogX;
92fPotentialY = fFrogY;
93}
94else if (string("abcdfgkhw").find(tile) != string::npos)
95{
96fPotentialX = 8.0f;
97fPotentialY = 8.0f;
98}
99else if (string("qst").find(tile) != string::npos)
100{
101fPotentialX += vecLines[nTileY].first * fDeltaTime;
102break;
103}
104}
105
106nTileX++;
107}
108
109fFrogX = fPotentialX;
110fFrogY = fPotentialY;
111
112Clear(PIXEL_SOLID, FG_BLACK);
113
114int nMapWidth = ScreenWidth() * 2;
115
116nTileY = 0;
117for (auto& line : vecLines)
118{
119int nOffset = (int)(line.first * fGlobalTime * (float)nTileSize) % nMapWidth;
120
121nTileX = 0;
122for (const auto& tile : line.second)
123{
124int x = (nTileX * nTileSize + nOffset) % nMapWidth;
125int y = nTileY * nTileSize;
126
127if (x < 0) x = nMapWidth - (abs(x) % nMapWidth);
128x -= nTileSize;
129
130switch (tile)
131{
132case 'r': FillRectangle(x, y, nTileSize, nTileSize, PIXEL_SOLID, FG_BLACK); break;
133case 'h': DrawSprite(x, y, sprHome); break;
134case 'p': DrawSprite(x, y, sprPavement); break;
135case 'o': DrawSprite(x, y, sprWall); break;
136case 'w': DrawSprite(x, y, sprWater); break;
137
138case 'a': DrawPartialSprite(x, y, 0, 0, 8, 8, sprBus); break;
139case 'b': DrawPartialSprite(x, y, 8, 0, 8, 8, sprBus); break;
140case 'c': DrawPartialSprite(x, y, 16, 0, 8, 8, sprBus); break;
141case 'd': DrawPartialSprite(x, y, 24, 0, 8, 8, sprBus); break;
142
143case 'e': DrawPartialSprite(x, y, 0, 0, 8, 8, sprCar1); break;
144case 'f': DrawPartialSprite(x, y, 8, 0, 8, 8, sprCar1); break;
145
146case 'g': DrawPartialSprite(x, y, 0, 0, 8, 8, sprCar2); break;
147case 'k': DrawPartialSprite(x, y, 8, 0, 8, 8, sprCar2); break;
148
149case 'q': DrawPartialSprite(x, y, 0, 0, 8, 8, sprLog); break;
150case 's': DrawPartialSprite(x, y, 8, 0, 8, 8, sprLog); break;
151case 't': DrawPartialSprite(x, y, 16, 0, 8, 8, sprLog); break;
152}
153
154nTileX++;
155}
156
157nTileY++;
158}
159
160int nFrogX = (int)(fFrogX * (float)nTileSize);
161int nFrogY = (int)(fFrogY * (float)nTileSize);
162
163DrawSpriteAlpha(nFrogX, nFrogY, sprFrog);
164
165return true;
166}
167
168};
169
170int main()
171{
172Frogger app;
173
174if (app.ConstructConsole(128, 72, 8, 8) == rcode::OK)
175app.Run();
176
177return 0;
178}
179