其实,我是想写一个小游戏来着,可是.....
时间:2010-12-10 来源:NigelOnTheWeb
先说明,我想做的这个游戏的原型是网上很火的一个小游戏——打豆子!
传送门:http://tieba.baidu.com/f?kw=%B4%F2%B6%B9%B6%B9#game
既然是游戏,首先是要把游戏界面画出来。
好,就做的像棋盘一样了,不然一片空白就不好看了,不过山寨就山寨的像点吧。
这不难。诺:

1 CPen pen(PS_SOLID,1,RGB(200,200,200));这里用了两步画背景,分别从(1,1)和(2,2)的位置开始画。不然灰色格子就不是连续的了。
2 CPen *pOldPen=pDC->SelectObject(&pen);
3 CBrush brush(RGB(200,200,200));
4 CBrush *pOldBrush=pDC->SelectObject(&brush);
5
6 for(int i=0;i<800;i=i+60)
7 {
8 for(int j=0;j<500;j=j+60)
9 {
10 pDC->RoundRect (i,j,i+30,j+30,10,10);
11 }
12 }
13 for(int a=30;a<800;a=a+60)
14 {
15 for(int b=30;b<500;b=b+60)
16 {
17 pDC->RoundRect (a,b,a+30,b+30,10,10);
18 }
19 }
PS:MFC的其他框架全部被我屏蔽了。

1 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
2 {
3 if( !CFrameWnd::PreCreateWindow(cs) )
4 return FALSE;
5 // TODO: 在此处通过修改
6 // CREATESTRUCT cs 来修改窗口类或样式
7 cs.hMenu = NULL;//去掉菜单
8 cs.style&=~WS_MAXIMIZEBOX; //禁用按动最大化按钮
9 cs.style&=~WS_THICKFRAME;//禁止用户改变窗口大小
10 cs.cx = 820;//窗口宽度
11 cs.cy = 540;//窗口高度
12 cs.style&=~FWS_ADDTOTITLE;//将FWS_ADDTOTITLE去掉
13
14 return TRUE;
15 }
去掉状态栏:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
1 /*if (!m_wndStatusBar.Create(this) ||
2 !m_wndStatusBar.SetIndicators(indicators,
3 sizeof(indicators)/sizeof(UINT)))
4 {
5 TRACE0("Failed to create status bar\n");
6 return -1; // fail to create
7 }*/
/*if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create }*/
小球就没想自己画了,直接网上搜的资源:
如图:等等5个了。
接下来是创建一个二维数组来存放不同位置的不同颜色的小球,当然要允许空的位置。于是:
srand((unsigned)time(NULL));剩下的只是根据不同位置的数值调用不同的小球了。
for(int m=1;m<26;m=m+1)
{
for(int n=1;n<16;n=n+1)
{
Game[m][n]=rand()%5;
}
}
由于vc下面的要实现透明实在不在我能力范围之内,于是就用PS做了以灰色为背景的图片,在需要显示的时候调用出来。(至今仍然怀疑这样做的正确性!)
下面是对比图:
明显第二种要好看些。不过对于没法透明显示好像只有这样好点了。
画小球的代码(初始时要在OnDraw里面调用。):

1 void CWorkView::DrawBall(CDC* pDC)
2 {
3 CDC dc;CBitmap* pOldBitmap;
4 CDC MemDC;
5 MemDC.CreateCompatibleDC(&dc); ///建立与显示设备兼容的内存设备场境
6 int m,n;
7 for(m=1;m<26;m=m+2)
8 {for(n=1;n<16;n=n+2)
9 {
10
11 if(Game[m][n]==1)
12 {
13 pOldBitmap=MemDC.SelectObject(&ball1a);
14 pDC->BitBlt(m*30,n*30,m*30+30,m*30+30,&MemDC,0,0,SRCCOPY);
15 }
16 if(Game[m][n]==2)
17 {
18 pOldBitmap=MemDC.SelectObject(&ball2a);
19 pDC->BitBlt(m*30,n*30,m*30+30,m*30+30,&MemDC,0,0,SRCCOPY);
20 }
21 if(Game[m][n]==3)
22 {
23 pOldBitmap=MemDC.SelectObject(&ball3a);
24 pDC->BitBlt(m*30,n*30,m*30+30,m*30+30,&MemDC,0,0,SRCCOPY);
25 }
26 if(Game[m][n]==4)
27 {
28 pOldBitmap=MemDC.SelectObject(&ball4a);
29 pDC->BitBlt(m*30,n*30,m*30+30,m*30+30,&MemDC,0,0,SRCCOPY);
30 }
31 if(Game[m][n]==5)
32 {
33 pOldBitmap=MemDC.SelectObject(&ball5a);
34 pDC->BitBlt(m*30,n*30,m*30+30,m*30+30,&MemDC,0,0,SRCCOPY);
35 }
36
37 }
38 }//*/
39 for(m=2;m<26;m=m+2)
40 {for(n=2;n<16;n=n+2)
41 {
42
代码同上。
69
70 }
71 }//*/
72 for(m=2;m<26;m=m+2)
{for(n=1;n<16;n=n+2)
{代码同上。}}
73
74
75
76 MemDC.DeleteDC();
77 }
上面的代码我也是按照分开填入的小球,原因很简单,不同的地方有的是要填入白色背景的小球,有的地方是要填入黑色背景的小球。
在实现功能完善的小游戏之前呢,我们先来实现一个功能更简单的小小游戏吧。
添加OnLButtonDown消息映射:

1 void CWorkView::OnLButtonDown(UINT nFlags, CPoint point)这个就是鼠标按哪个小球哪个小球就会消失,哎.....先这样,正在愁真正游戏部分的算法。弄好了再写!
2 {
3 // TODO: Add your message handler code here and/or call default
4 positionx=point.x/30;
5 positiony=point.y/30;
6 Game[positionx][positiony]=0;
7
8 Invalidate(FALSE);// 更新客户区
9 CView::OnLButtonDown(nFlags, point);
10 }
相关阅读 更多 +