ConsoleGameEngine
187 строк · 4.7 Кб
1#define CGE_IMPL
2#include "ConsoleGameEngine.hpp"
3
4using namespace std;
5
6constexpr int aGlyphs[4] = { PIXEL_SOLID, PIXEL_QUARTER, PIXEL_HALF, PIXEL_THREEQUARTERS };
7
8class Example : public ConsoleGameEngine
9{
10public:
11Example() {}
12
13inline static wstring s_sFileName;
14static int s_nWidth;
15static int s_nHeight;
16
17Sprite* sprCanvas = nullptr;
18
19int nGlyph = 0;
20int nColour = FG_WHITE;
21
22protected:
23bool OnUserCreate() override
24{
25if (s_nWidth == 0 || s_nHeight == 0)
26{
27if (s_sFileName.empty())
28{
29// Create a canvas without a size
30sprCanvas = new Sprite();
31
32// Set a default filename
33s_sFileName = L"untitled.spr";
34}
35else
36{
37// Create the canvas and set load its content from a file
38sprCanvas = new Sprite(s_sFileName);
39}
40}
41else
42{
43// Create the canvas with a size
44sprCanvas = new Sprite(s_nWidth, s_nHeight);
45}
46
47sAppName = s_sFileName;
48
49return true;
50}
51
52bool OnUserUpdate(float fDeltaTime) override
53{
54if (GetKey(VK_ESCAPE).bPressed)
55return false;
56
57if (GetKey(L'S').bPressed)
58sprCanvas->Save(s_sFileName);
59
60if (GetKey(VK_UP).bPressed) nColour--;
61if (GetKey(VK_DOWN).bPressed) nColour++;
62
63if (GetKey(VK_LEFT).bPressed) nGlyph--;
64if (GetKey(VK_RIGHT).bPressed) nGlyph++;
65
66if (nColour < 0x0) nColour = 0xF;
67if (nColour > 0xF) nColour = 0x0;
68
69if (nGlyph < 0) nGlyph = 3;
70if (nGlyph > 3) nGlyph = 0;
71
72int nCanvasStartX = ScreenWidth() * 0.3f;
73int nCanvasStartY = ScreenHeight() * 0.3f;
74
75int nCanvasEndX = nCanvasStartX + sprCanvas->nWidth;
76int nCanvasEndY = nCanvasStartY + sprCanvas->nHeight;
77
78int nMouseX = MouseX();
79int nMouseY = MouseY();
80
81int nNormalisedX = nMouseX - nCanvasStartX;
82int nNormalisedY = nMouseY - nCanvasStartY;
83
84if (nNormalisedX >= 0 && nNormalisedY >= 0 && nNormalisedX < sprCanvas->nWidth && nNormalisedY < sprCanvas->nHeight)
85{
86if (GetMouse(0).bHeld)
87{
88sprCanvas->SetGlyph(nNormalisedX, nNormalisedY, aGlyphs[nGlyph]);
89sprCanvas->SetColour(nNormalisedX, nNormalisedY, nColour);
90}
91
92if (GetMouse(1).bHeld)
93{
94sprCanvas->SetGlyph(nNormalisedX, nNormalisedY, PIXEL_SOLID);
95sprCanvas->SetColour(nNormalisedX, nNormalisedY, FG_BLACK);
96}
97}
98
99Clear(PIXEL_SOLID, FG_BLACK);
100
101// Draw an outline
102DrawLine(nCanvasStartX - 1, nCanvasStartY - 1, nCanvasEndX, nCanvasStartY - 1, PIXEL_SOLID, FG_RED | BG_RED);
103DrawLine(nCanvasStartX - 1, nCanvasEndY, nCanvasEndX, nCanvasEndY, PIXEL_SOLID, FG_RED | BG_RED);
104DrawLine(nCanvasStartX - 1, nCanvasStartY - 1, nCanvasStartX - 1, nCanvasEndY, PIXEL_SOLID, FG_RED | BG_RED);
105DrawLine(nCanvasEndX, nCanvasStartY - 1, nCanvasEndX, nCanvasEndY, PIXEL_SOLID, FG_RED | BG_RED);
106
107// Draw the canvas
108DrawSprite(nCanvasStartX, nCanvasStartY, sprCanvas);
109
110int y = 0;
111
112// Display info about a current state of the program
113DrawString(0, y++, L"Brush: ", FG_WHITE); Draw(8, y - 1, aGlyphs[nGlyph], nColour);
114DrawString(0, y++, L"Mouse: " + to_wstring(nNormalisedX) + L", " + to_wstring(nNormalisedY), FG_WHITE);
115
116y++;
117
118// Display controls
119DrawString(0, y++, L"Change brush glyph: ←, →", FG_WHITE);
120DrawString(0, y++, L"Change brush colour: ↑, ↓", FG_WHITE);
121DrawString(0, y++, L"Save: S", FG_WHITE);
122DrawString(0, y++, L"Exit: ESC", FG_WHITE);
123
124y++;
125
126// Display a glyph table
127DrawString(0, y++, L"Glyphs:");
128DrawString(0, y++, L"PIXEL_SOLID = 9608");
129DrawString(0, y++, L"PIXEL_QUARTER = 9617");
130DrawString(0, y++, L"PIXEL_HALF = 9618");
131DrawString(0, y++, L"PIXEL_THREEQUARTERS = 9619");
132
133y++;
134
135// Display a colour table
136DrawString(0, y++, L"Colours:");
137DrawString(0, y++, L"FG_BLACK = 0");
138DrawString(0, y++, L"FG_DARK_BLUE = 1");
139DrawString(0, y++, L"FG_DARK_GREEN = 2");
140DrawString(0, y++, L"FG_DARK_CYAN = 3");
141DrawString(0, y++, L"FG_DARK_RED = 4");
142DrawString(0, y++, L"FG_DARK_MAGENTA = 5");
143DrawString(0, y++, L"FG_DARK_YELLOW = 6");
144DrawString(0, y++, L"FG_GREY = 7");
145DrawString(0, y++, L"FG_DARK_GREY = 8");
146DrawString(0, y++, L"FG_BLUE = 9");
147DrawString(0, y++, L"FG_GREEN = 10");
148DrawString(0, y++, L"FG_CYAN = 11");
149DrawString(0, y++, L"FG_RED = 12");
150DrawString(0, y++, L"FG_MAGENTA = 13");
151DrawString(0, y++, L"FG_YELLOW = 14");
152DrawString(0, y++, L"FG_WHITE = 15");
153
154return true;
155}
156};
157
158int Example::s_nWidth = 0;
159int Example::s_nHeight = 0;
160
161int main(int argc, char** argv)
162{
163Example demo;
164
165if (argc >= 2)
166{
167Example::s_sFileName.resize(strlen(argv[1]));
168mbstowcs(Example::s_sFileName.data(), argv[1], Example::s_sFileName.size());
169
170if (argc == 3)
171{
172int nWidth = atoi(argv[2]);
173Example::s_nWidth = Example::s_nHeight = nWidth;
174}
175
176if (argc == 4)
177{
178Example::s_nWidth = atoi(argv[2]);
179Example::s_nHeight = atoi(argv[3]);
180}
181}
182
183if (demo.ConstructConsole(80, 80, 10, 10) == rcode::OK)
184demo.Run();
185
186return 0;
187}
188