-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWorld.cpp
More file actions
112 lines (96 loc) · 2.9 KB
/
World.cpp
File metadata and controls
112 lines (96 loc) · 2.9 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
107
108
109
110
111
112
//World.cpp - double buffer version of World class
//updated 2016/05/06
//Good Day Fishing written by Jean Park
#include <iostream>
#include "World.hpp"
using std::cout;
using std::endl;
using namespace WorldConstant;
// Constructors ===========================================
World::World()
: mt_engine_(random_seed_())
, inclusive_stage_x_distribution_(STAGE_FIRST_X + 1, STAGE_LAST_X - 1)
, inclusive_bool_distribution_(0, 1)
, isEbb_(false)
, ebbDelay_(6)
, frames_(0)
, backBuffer_(0) {
drawBorders();
}
// Initiators =============================================
void World::drawBorders() {
//initializes frame for all buffers
for (int i = 0; i < NUM_BUFFERS; i++) {
//draw top and bottom borders
for (int k = 0; k < FRAME_WIDTH; k++) {
buffers_[i][0][k] = BORDER_CHAR;
buffers_[i][FRAME_HEIGHT - 1][k] = BORDER_CHAR;
}
//null-terminate top and bottom borders
buffers_[i][0][FRAME_WIDTH] = NULL_CHAR;
buffers_[i][FRAME_HEIGHT - 1][FRAME_WIDTH] = NULL_CHAR;
//draw side borders and null-terminator
for (int j = 1; j < FRAME_HEIGHT - BORDER_WIDTH; j++) {
buffers_[i][j][0] = BORDER_CHAR;
buffers_[i][j][FRAME_WIDTH - 1] = BORDER_CHAR;
buffers_[i][j][FRAME_WIDTH] = NULL_CHAR;
}
}
}
// Update =================================================
void World::update() {
++frames_;
if (frames_ >= ebbDelay_) {
ebb();
frames_ = 0;
}
}
// Draw ===================================================
void World::draw() {
clearStage();
drawWater();
drawDock();
}
void World::clearStage() {
for (int y = STAGE_FIRST_X; y <= STAGE_LAST_Y; y++) {
for (int x = STAGE_FIRST_X; x <= STAGE_LAST_X; x++) {
buffers_[backBuffer()][y][x] = ' ';
}
}
}
void World::drawWater() {
for (int i = STAGE_FIRST_X + !isEbb_; i < DOCK_X; i += 2) {
buffers_[backBuffer()][WATER_Y][i] = '~';
}
for (int i = STAGE_FIRST_X + isEbb_; i < DOCK_X; i += 2) {
buffers_[backBuffer()][WATER_Y][i] = '-';
}
}
void World::drawDock() {
//draw surface
for (int i = DOCK_X; i <= STAGE_LAST_X; i++) {
buffers_[backBuffer()][WATER_Y - 1][i] = '_';
}
//draw pillars
for (int i = DOCK_X; i <= STAGE_LAST_X; i++) {
buffers_[backBuffer()][WATER_Y][i] = '|';
}
//erase pillar
for (int i = DOCK_X + 2; i <= STAGE_LAST_X; i += 3) {
buffers_[backBuffer()][WATER_Y][i] = ' ';
}
}
// Render =================================================
void World::render() {
gotoxy(0, 0);
int front = frontBuffer();
for (int y = 0; y < FRAME_HEIGHT; y++) {
cout << buffers_[front][y] << endl;
}
}
BOOL gotoxy(const WORD x, const WORD y) {
COORD xy;
xy.X = x;
xy.Y = y;
return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), xy);
}