您的位置:首页 > 其它

自己写“俄罗斯方块”(三).加入消息映射函数,实现游戏交互

2017-10-09 14:29 399 查看
接下来就差我们的信号映射函数了!

首先分别加入左右移动的函数定义,变形的shapeSwitch()
函数定义:

void CMy18TetrisView::GoLeft() { //按下方向键“左”的时候
for (int w = 0; w<4; ++w) {
int i = (shift[w][0] + rowPos) / 2 - 1;
int j = (shift[w][1] + colPos) / 2;
if (GameMap[i][j] == 1) return; //到左边界的话直接返回
}
rowPos -= 2;
Invalidate();
}

void CMy18TetrisView::GoRight() { //按下方向键“右”的时候
for (int w = 0; w<4; ++w) {
int i = (shift[w][0] + rowPos) / 2 + 1;
int j = (shift[w][1] + colPos) / 2;
if (GameMap[i][j] == 1) return; //到右边界的话直接返回
}
rowPos += 2;
Invalidate();
}

void CMy18TetrisView::ShapeSwitch() { //按下方向键“上”的时候,改变形状
int w;
for (w = 0; w<4; ++w) {
int i = (shift[w][1] + rowPos) / 2;
int j = (-shift[w][0] + colPos) / 2;
if (GameMap[i][j] == 1) return; //被卡住了,无法变形了
}
for (w = 0; w<4; ++w) { //逆时针旋转90度,只考虑
shift[w][1] = shift[w][1] + shift[w][0];
shift[w][0] = shift[w][1] - shift[w][0];
shift[w][1] = -(shift[w][1] - shift[w][0]);
}
Invalidate();
}
接下来加入消息映射函数:

头文件:

/*-----------------自己加入的消息映射函数-----------------*/
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); //啊,就是这个函数,控制了这个消息传递啊!!
afx_msg void OnTimer(UINT nIDEvent);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
/*-----------------自己加入的消息映射函数-----------------*/
cpp文件2处:
1:

/*-------------自己加入的消息映射-----------*/
ON_WM_TIMER() //定义timer消息
ON_WM_CREATE()
ON_WM_KEYDOWN() //keydown函数 功能:检查用户是否按了键盘上指定的键
/*-------------自己加入的消息映射-----------*/2,函数定义:
void CMy18TetrisView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) //按键按下的时候。触发该信息
{
// TODO: Add your message handler code here and/or call default
switch (nChar)
{
case VK_NUMPAD0://小数字键盘0
start();
break;
case VK_DOWN: //visual keyboard
GoDown();
break;
case VK_LEFT:
GoLeft();
break;
case VK_RIGHT:
GoRight();
break;
case VK_UP:
ShapeSwitch();
default: break;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
执行效果如图:



Emmmmmm...好像还差了一点什么。。。哦,没有删除最下面那个一行啦!~

加入LineDelete()函数的定义:

void CMy18TetrisView::LineDelete() { //满了一行,把该行上方的全部方块集体往下移
int cnt;
int i = colCount;
while (i) {
cnt = 0;
for (int j = 1; j <= rowCount; ++j)
if (GameMap[j][i] == 1) ++cnt;
if (cnt == rowCount) {
for (int w = i; w > 0; w--)
for (int j = 1; j <= rowCount; ++j)
GameMap[j][w] = GameMap[j][w - 1];  //集体往下移动
}
else i--;
}
Invalidate();
}

然后在OnTimer()函数中调用它,达到每次都查看是否要消除一整行的目的。

大功告成啦!!————这个现在可以玩啦,虽然很简陋!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐