ConsoleGameEngine

Форк
0
/
Frogger.cpp 
178 строк · 4.7 Кб
1
#define CGE_IMPL
2
#include "ConsoleGameEngine.hpp"
3

4
using namespace std;
5

6
class Frogger : public ConsoleGameEngine
7
{
8
public:
9
	Frogger()
10
	{
11
		sAppName = L"Frogger";
12
	}
13

14
private:
15
	Sprite* sprBus = nullptr;
16
	Sprite* sprCar1 = nullptr;
17
	Sprite* sprCar2 = nullptr;
18
	Sprite* sprFrog = nullptr;
19
	Sprite* sprHome = nullptr;
20
	Sprite* sprLog = nullptr;
21
	Sprite* sprPavement = nullptr;
22
	Sprite* sprWall = nullptr;
23
	Sprite* sprWater = nullptr;
24

25
	vector<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

37
	const int nTileSize = 8;
38

39
	float fFrogX = 8.0f;
40
	float fFrogY = 8.0f;
41

42
	float fGlobalTime = 0.0f;
43

44
public:
45
	virtual bool OnUserCreate() override
46
	{
47
		sprBus = new Sprite(L"frogger_sprites/bus.spr");
48
		sprCar1 = new Sprite(L"frogger_sprites/car1.spr");
49
		sprCar2 = new Sprite(L"frogger_sprites/car2.spr");
50
		sprFrog = new Sprite(L"frogger_sprites/frog.spr");
51
		sprHome = new Sprite(L"frogger_sprites/home.spr");
52
		sprLog = new Sprite(L"frogger_sprites/log.spr");
53
		sprPavement = new Sprite(L"frogger_sprites/pavement.spr");
54
		sprWall = new Sprite(L"frogger_sprites/wall.spr");
55
		sprWater = new Sprite(L"frogger_sprites/water.spr");
56

57
		return true;
58
	}
59

60
	virtual bool OnUserUpdate(float fDeltaTime) override
61
	{
62
		fGlobalTime += fDeltaTime;
63

64
		float fPotentialX = fFrogX;
65
		float fPotentialY = fFrogY;
66

67
		if (GetKey(VK_LEFT).bPressed)	fPotentialX -= 1.0f;
68
		if (GetKey(VK_RIGHT).bPressed)	fPotentialX += 1.0f;
69
		if (GetKey(VK_UP).bPressed)		fPotentialY -= 1.0f;
70
		if (GetKey(VK_DOWN).bPressed)	fPotentialY += 1.0f;
71

72
		int nTileY = (int)fPotentialY;
73
		int nTileX = 0;
74

75
		int nOffset = (int)(vecLines[nTileY].first * fGlobalTime * (float)nTileSize) % (ScreenWidth() * 2);
76

77
		for (auto tile : vecLines[nTileY].second)
78
		{
79
			int x1 = (int)(fPotentialX * (float)nTileSize) + nTileSize;
80
			int y1 = (int)(fPotentialY * (float)nTileSize);
81

82
			int x2 = (nTileX * nTileSize + nOffset) % (ScreenWidth() * 2);
83
			int y2 = nTileY * nTileSize;
84
			if (x2 < 0) x2 = (ScreenWidth() * 2) - (abs(x2) % (ScreenWidth() * 2));
85

86
			if (x1 < x2 + nTileSize && y1 < y2 + nTileSize &&
87
				x2 < x1 + nTileSize && y2 < y1 + nTileSize)
88
			{
89
				if (string("o").find(tile) != string::npos)
90
				{
91
					fPotentialX = fFrogX;
92
					fPotentialY = fFrogY;
93
				}
94
				else if (string("abcdfgkhw").find(tile) != string::npos)
95
				{
96
					fPotentialX = 8.0f;
97
					fPotentialY = 8.0f;
98
				}
99
				else if (string("qst").find(tile) != string::npos)
100
				{
101
					fPotentialX += vecLines[nTileY].first * fDeltaTime;
102
					break;
103
				}
104
			}
105

106
			nTileX++;
107
		}
108

109
		fFrogX = fPotentialX;
110
		fFrogY = fPotentialY;
111

112
		Clear(PIXEL_SOLID, FG_BLACK);
113

114
		int nMapWidth = ScreenWidth() * 2;
115

116
		nTileY = 0;
117
		for (auto& line : vecLines)
118
		{
119
			int nOffset = (int)(line.first * fGlobalTime * (float)nTileSize) % nMapWidth;
120

121
			nTileX = 0;
122
			for (const auto& tile : line.second)
123
			{
124
				int x = (nTileX * nTileSize + nOffset) % nMapWidth;
125
				int y = nTileY * nTileSize;
126

127
				if (x < 0) x = nMapWidth - (abs(x) % nMapWidth);
128
				x -= nTileSize;
129

130
				switch (tile)
131
				{
132
				case 'r': FillRectangle(x, y, nTileSize, nTileSize, PIXEL_SOLID, FG_BLACK); break;
133
				case 'h': DrawSprite(x, y, sprHome);		break;
134
				case 'p': DrawSprite(x, y, sprPavement);	break;
135
				case 'o': DrawSprite(x, y, sprWall);		break;
136
				case 'w': DrawSprite(x, y, sprWater);		break;
137

138
				case 'a': DrawPartialSprite(x, y, 0, 0, 8, 8, sprBus);	break;
139
				case 'b': DrawPartialSprite(x, y, 8, 0, 8, 8, sprBus);	break;
140
				case 'c': DrawPartialSprite(x, y, 16, 0, 8, 8, sprBus); break;
141
				case 'd': DrawPartialSprite(x, y, 24, 0, 8, 8, sprBus); break;
142

143
				case 'e': DrawPartialSprite(x, y, 0, 0, 8, 8, sprCar1); break;
144
				case 'f': DrawPartialSprite(x, y, 8, 0, 8, 8, sprCar1); break;
145

146
				case 'g': DrawPartialSprite(x, y, 0, 0, 8, 8, sprCar2); break;
147
				case 'k': DrawPartialSprite(x, y, 8, 0, 8, 8, sprCar2); break;
148

149
				case 'q': DrawPartialSprite(x, y, 0, 0, 8, 8, sprLog);	break;
150
				case 's': DrawPartialSprite(x, y, 8, 0, 8, 8, sprLog);	break;
151
				case 't': DrawPartialSprite(x, y, 16, 0, 8, 8, sprLog); break;
152
				}
153

154
				nTileX++;
155
			}
156

157
			nTileY++;
158
		}
159

160
		int nFrogX = (int)(fFrogX * (float)nTileSize);
161
		int nFrogY = (int)(fFrogY * (float)nTileSize);
162

163
		DrawSpriteAlpha(nFrogX, nFrogY, sprFrog);
164

165
		return true;
166
	}
167

168
};
169

170
int main()
171
{
172
	Frogger app;
173

174
	if (app.ConstructConsole(128, 72, 8, 8) == rcode::OK)
175
		app.Run();
176

177
	return 0;
178
}
179

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.