-
Notifications
You must be signed in to change notification settings - Fork 0
/
dropping_piece.cpp
122 lines (96 loc) · 3.01 KB
/
dropping_piece.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
#include "tetris.h"
const size_t tetris::DroppingPiece::mBaseBlockIndex = 0;
//tetromino block coordinates based on mBlockCord[mBaseBlockIndex]
const vec2<int> tetris::DroppingPiece::TetrominoCords[7][4] =
{
{ {0, 0}, {-1, 0}, {1 , 0}, {2, 0} }, // I-block
{ {0, 0}, {-1, -1}, {-1, 0}, {1, 0} }, // J-block
{ {0, 0}, {-1, 0}, {1 , 0}, {1, -1} }, // L-block
{ {0, 0}, {1 , 0}, {0 , 1}, {1, 1} }, // O-block
{ {0, 0}, {-1, 1}, {0 , 1}, {1, 0} }, // S-block
{ {0, 0}, {-1, 0}, {0 , 1}, {1, 0} }, // T-block
{ {0, 0}, {-1, 0}, {0 , 1}, {1, 1} } // Z- block
};
tetris::DroppingPiece::DroppingPiece(
const uint32_t& timeLimit,
const BlockType& blockType,
const vec2<int>& startingPos,
const uint8_t& colorIndex
) : mTimeLimit(timeLimit), mGridState(colorIndex)
{
mSetType(blockType);
mSetBlockCord(startingPos);
}
void tetris::DroppingPiece::mSetType(const BlockType& t)
{
mBlockType = t;
if(mBlockType == Block_O) mFlipFunc = mGetFlippedBlock_O;
else mFlipFunc = mGetFlippedGeneral;
}
vec2<int> tetris::DroppingPiece::mGetTetrominoPosProcessed(
const size_t& i,
const BlockType& mBlockType,
const vec2<int>& rotation,
const vec2<size_t>& cordOrder
)
{
return
vec2<int>(
TetrominoCords[mBlockType][i][cordOrder.x],
TetrominoCords[mBlockType][i][cordOrder.y])
* rotation;
}
void tetris::DroppingPiece::mFillBlockCord(DPCord& a, const vec2<int>& newPos) const
{
for(size_t i = 0; i < 4; ++i)
{
a[i] = newPos + mGetTetrominoPosProcessed(i, mBlockType, mCordSign, mCordOrder);
}
}
void tetris::DroppingPiece::mFillFlippedBlockCord(DPCord& a) const
{
vec2<int> rotation;
vec2<size_t> cordOrder;
(this->*mFlipFunc)(rotation, cordOrder);
for(size_t i = 0; i < 4; ++i)
{
a[i] = mBlockCord[mBaseBlockIndex] + mGetTetrominoPosProcessed(i, mBlockType, rotation, cordOrder);
}
}
void tetris::DroppingPiece::mSetBlockCord(const vec2<int>& newPos)
{
mFillBlockCord(mBlockCord, newPos);
}
void tetris::DroppingPiece::mSetBlockCord(const DPCord& a)
{
mBlockCord[0] = a[0];
mBlockCord[1] = a[1];
mBlockCord[2] = a[2];
mBlockCord[3] = a[3];
}
const tetris::DroppingPiece::DPCord& tetris::DroppingPiece::mGetCord() const { return mBlockCord; }
void tetris::DroppingPiece::mFlipPiece()
{
(this->*mFlipFunc)(mCordSign, mCordOrder);
}
void tetris::DroppingPiece::mGetFlippedBlock_O(
vec2<int>& rotation,
vec2<size_t>& cordOrder
) const
{
rotation = mCordSign;
cordOrder = mCordOrder;
}
void tetris::DroppingPiece::mGetFlippedGeneral(
vec2<int>& rotation,
vec2<size_t>& cordOrder
) const
{
// x2 = y1, y2 = -x1
cordOrder = vec2<size_t>(1, 1) - mCordOrder;
rotation = vec2<int>(mCordSign.y, -mCordSign.x);
}
vec2<int> tetris::DroppingPiece::mGetBaseBlockPos() const
{
return mBlockCord[mBaseBlockIndex];
}