自己写“俄罗斯方块”(三).加入消息映射函数,实现游戏交互
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();
}
接下来加入消息映射函数:
头文件:
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()函数的定义:
然后在OnTimer()函数中调用它,达到每次都查看是否要消除一整行的目的。
大功告成啦!!————这个现在可以玩啦,虽然很简陋!
首先分别加入左右移动的函数定义,变形的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()函数中调用它,达到每次都查看是否要消除一整行的目的。
大功告成啦!!————这个现在可以玩啦,虽然很简陋!
相关文章推荐
- 自己写“扫雷”(三).加入消息映射函数,实现交互
- 通过Flash和c++的交互来实现自己的桌面游戏
- 通过Flash和c++的交互来实现自己的桌面游戏
- 自己写“俄罗斯方块”(二).加入OnTimer()函数,实现落地效果
- Pushlet实现定点推送消息与浏览器参数交互详解
- Python_猜数字游戏_初次尝试(遗留问题:猜错后程序自动循环执行未实现)---加入循环搞定
- 从腾讯QQ升级游戏之“快速加入游戏”功能的实现缺陷看C/S之间如何正确分配相关协作
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- css实现两端对齐的方法(先借鉴别人的,后期再加入自己的理解)
- Android已有的原生Camera框架中加入自己的API的实现方案。
- (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画
- canvas标签应用 简单俄罗斯方块游戏的实现
- 自己写“俄罗斯方块”(一).实现基本业务逻辑和绘图
- arkit-tictactoe:ARKit 外加简单交互,实现 AR 场景的三连棋游戏演
- 从腾讯QQ升级游戏之“快速加入游戏”功能的实现缺陷看C/S之间如何正确分配相关协作
- 自己动手实现一个《倒水解密》游戏
- html 与 java 交互实现数据库连接登陆并在html网页上发送消息
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 动态弹球的实现 加入了多线程技术--javaSE游戏准备工作
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!