经过几天努力,终于做好了我的俄罗斯方块,这是我用MFC做的第一个游戏,也是第一个像样的东西。下面都是个人感受,也不知道对不对,不对的话大家不要笑我哦,希望能帮我指出错误来。
感觉做这个游戏需要先理解MFC和win32的运行机制,windows运行是靠消息的传递。我的游戏运行效果图是这样的:
具体开始制作了,首先要准备一张背景图,在视类里读取,然后在OnDraw()里显示,这样,当程序最小化恢复的时候就可以保证画面不会丢失。
做完背景,就可以正式开始制作方块的主要部分。
在这里,方块类要包括:初始化,生成新方块,方块的下落过程,向左,右,下移动,方块变形,将方块画到屏幕上,记录消除行数和等级,消除一行这些方面。
- const int BLOCK_LINE = 20;//当前地图的行数
- const int BLOCK_ROW = 10;//当前地图的列数
- class CBlock
- {
- public:
- CBlock(void);
- ~CBlock(void);
- private:
- // 当前方块形状
- int m_BlockShape;
- //下一个方块形状
- int m_nextBlockShape;
- //当前方块状态
- int m_BlockState;
- //等级
- int m_BlockLevel;
- //当前可消行数
- int m_BlockCurDelLine;
- //游戏是否在执行
- bool m_blockRunning;
- //当前方块位置
- POINT m_BlockPos[4];
- //下个方块位置
- POINT m_nextBlockPos[4];
- //当前的屏幕状态
- //BLOCK_LINE是行数,BLOCK_ROW是列数
- int m_Blockmap[BLOCK_LINE][BLOCK_ROW];
- public:
- // 初始化游戏
- void BlockInit( void );
- private:
- // 记录方块图形
- CBitmap m_bmpBlock[7];
- public:
- //创建一个新的方块出来,这里只给方块形状赋值
- void CreateNewBlock(void);
- private:
- //这里给方块位置赋值,
- //shape是形状, pt[]是用来接收方块坐标的(方块形状的排列坐标)数组
- //xPos是偏移量,就是方块显示位置和方块显示的框的最左边的差
- void MakeNewBlock(int shape, POINT pt[], int xPos);
- public:
- //将方块画在对应的DC上
- void DrawBlock(CDC* pDC);
- //方块的下落过程,主要部分
- void BlockDropDown(CDC* pDC);
- private:
- // 隐藏方块
- void HideBlock(CDC* pDC);
- // 背景图片变量
- CBitmap m_bmpBKGND;
- public:
- // 画下个方块的框框
- void DrawNextBlock( CDC* pDC );
- //方块左移
- void BlockLeft(CDC* pDC);
- //方块右移
- void BlockRight(CDC* pDC);
- //方块下移
- void BlockFastDown(CDC* pDC);
- //方块变形
- void ChangeState(CDC* pDC);
- // 消除一行
- //pDC是传入的DC
- //LineNum是消除的行从第几行开始(我这里是最上面为0,最下面为19)
- //start是 游戏是否是要把消除行以上的都置0,我是用在OnDraw()里,用来重画屏幕的,
- void DeleteLine(CDC* pDC, int LineNum, bool start);
- // 游戏是否结束,true=结束了
- bool BlockGameOver(void);
- // 计分板
- //del是决定是否是已消一行的
- void BlockScore(int del, CDC* pDC);
- //返回是否升级了,true=升级了
- bool BlockLevelUp(void);
- //返回下落速度
- int BlockSpeed(void);
- };
这里我采用了二维数组int m_Blockmap[20][10];记录游戏区。
在初始化后,就要生成新方块,采用随机数的方法。方块是通过坐标位置记录的,POINT m_BlockPos[4];
游戏是写在定时器里的,通过等级不同使下落时间也不同,游戏的主要过程是方块的下落过程。在这里首先判断是否已经结束,结束了则结束计时器,否则判断是否能下落,不能下落则判断是否能消除一行。这些都完成后则生成新方块,重新下落。
在KEY_DOWN事件中加入左移,右移,下移,变形的函数,就可以实现游戏了。
其他的功能就是自己随便添加的暂停,开始这样的了。那些就不写了。
游戏可执行程序下载地址:http://download.csdn.net/source/1595231
游戏源代码下载地址:http://download.csdn.net/source/1595110
点击这里加我为好友:http://student.csdn.net/invite.php?u=110891&c=3fdff026fca470b3