`
xujinquan19
  • 浏览: 145926 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

最经典 VC游戏开发全过程

阅读更多

入门篇:

游戏是动画的延伸,只要知道了动画的原理,在动画变化时,使它根据键盘或鼠标的输入操作而变化,就是游戏了。

所以在介绍游戏编程之前,先讲讲动画。

动画一般分三种形式:形变、位变、色变。如下:

 

1. 形变  

 

即几种形状的图形或位图依次转变而成。(图1-1)


                          图1-1

 

 

先看一个简单的实例:

a.  新建工程1_1,选择单文档,完成。

b.  在view类加变量int ituxing,并在构造函数里赋值为ituxing=0;

c.  在OnDraw(CDC* pDC)函数上添上以下语句:

  void CMy1_1View::OnDraw(CDC* pDC)

{

    CMy1_1Doc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

    // TODO: add draw code for native data here

  //清除当前图形

    CBrush mybrush1;

    mybrush1.CreateSolidBrush(RGB(255,255,255));

    CRect myrect1(0,0,1024,768);

    pDC->FillRect(myrect1,&mybrush1);

    //判断当前图形ituxing

    if(ituxing==1)

  //ituxing=1,画矩形

           pDC->Rectangle(20,20,89,89);

    else if(ituxing==2)

    //ituxing=2,画圆

            pDC->Ellipse(20,20,89,89);

        else

    //否则,画三角形

           {

                  pDC->MoveTo(20,20);

                  pDC->LineTo(89,45);

               pDC->LineTo(20,89);

                  pDC->LineTo(20,20);

           }

}

d.  添加OnTimer(UINT nIDEvent)和OnCreate(LPCREATESTRUCT lpCreateStruct),并加上语句如下:

   void CMy1_1View::OnTimer(UINT nIDEvent) 

{

        // TODO: Add your message handler code here and/or call default

     //获取指针pdc

     CDC *pDC=GetDC();

     //调用OnDraw(pDC)重画

     OnDraw(pDC);

     //使ituxing循环

     ituxing=(ituxing+1)%3;

 

     CView::OnTimer(nIDEvent);

}

 

int CMy1_1View::OnCreate(LPCREATESTRUCT lpCreateStruct) 

{

     if (CView::OnCreate(lpCreateStruct) == -1)

            return -1;


     // TODO: Add your specialized creation code here

     //设置更新时间

     SetTimer(1, 750, NULL);

     return 0;

}

e.  完成。

 

2. 位变 

 

 即同一个图形或位图依次在不同的位置上出现而形成动画。(图1-2)

      

 

   

                       图 1-2

 

见实例1_2:

a.       复制实例1_1文件夹,改名为1_2。

把void CMy1_1View::OnTimer(UINT nIDEvent)中的ituxing=(ituxing+1)%3;改为ituxing=(ituxing+1)%10;

b.       把OnDraw(CDC* pDC)函数改为:

    void CMy1_1View::OnDraw(CDC* pDC)

{

       CMy1_1Doc* pDoc = GetDocument();

       ASSERT_VALID(pDoc);

       // TODO: add draw code for native data here

       //清除当前图形

       CBrush mybrush1;

mybrush1.CreateSolidBrush(RGB(255,255,255));

CRect myrect1(0,0,1024,768);

               pDC->FillRect(myrect1,&mybrush1);

 

               //用当前图形位置ituxing     

       //画圆

       pDC->Ellipse(30*ituxing,30*ituxing,30*ituxing+50,30*ituxing+50); 

}

c.       执行,OK!

      

3.  色变  

 

即利用不同颜色的转变而形成有动感的图画。(图1-3)


                             图1-3

 

 

   实例1_3:

a.       新建单文档工程1_3。

b.       添加参数int icolor并赋值为0。

c.       添加函数OnTimer(UINT nIDEvent)和OnCreate(LPCREATESTRUCT lpCreateStruct),并添加语句如下:

 

        void CMy1_3View::OnTimer(UINT nIDEvent) 

{

       // TODO: Add your message handler code here and/or call default

       icolor+=1;

    //此函数使客户区失效,以致重画

       Invalidate();

       CView::OnTimer(nIDEvent);

}

 

int CMy1_3View::OnCreate(LPCREATESTRUCT lpCreateStruct) 

{

       if (CView::OnCreate(lpCreateStruct) == -1)

                     return -1;

       

                     // TODO: Add your specialized creation code here

                     SetTimer(1,750,NULL);

                     return 0;

}

d.       最后在OnDraw(CDC* pDC)加上画圆语句:

     void CMy1_3View::OnDraw(CDC* pDC)

{

       CMy1_3Doc* pDoc = GetDocument();

       ASSERT_VALID(pDoc);

       // TODO: add draw code for native data here

       //获取icolor值

    int i=icolor;     

    //在不同位置画四个不同颜色的圆

    CBrush brush1(RGB(20+(64*i)%255,140+(64*i)%255,210*(64+i)%255));

       CBrush*pOldBrush1=pDC->SelectObject(&brush1);

    pDC->Ellipse(300,200,350,250);

    pDC->SelectObject(pOldBrush1);

       

       CBrush brush2(RGB(84+(64*i)%255,204+(64*i)%255,24+(64*i)%255));

       CBrush*pOldBrush2=pDC->SelectObject(&brush2);

    pDC->Ellipse(350,200,400,250);

    pDC->SelectObject(pOldBrush2);

       

       CBrush brush3(RGB(148+(64*i)%255,14+(64*i)%255,88+(64*i)%255));

       CBrush*pOldBrush3=pDC->SelectObject(&brush3);

    pDC->Ellipse(300,250,350,300);

    pDC->SelectObject(pOldBrush3);

       

       CBrush brush4(RGB(212+(64*i)%255,78+(64*i)%255,152+(64*i)%255));

       CBrush*pOldBrush4=pDC->SelectObject(&brush4);

    pDC->Ellipse(350,250,400,300);

       pDC->SelectObject(pOldBrush4); 

}

e.       完成。

 

以上是三种最基本的动画。当然,具体情况不会这么简单,而往往的其中二或三种的复杂的结合。

 

而作为游戏,它的关键在:在动画的基础上加一些主观的操作。如先画一个球,然后用方向键或鼠标移动。如实例1_4:

 

a.       新建单文档工程1_4。

b.       添加半径和圆心  

        int ir;//半径

           CPoint center;//圆心

在CMy1_4View()中赋值如下:

 CMy1_4View::CMy1_4View()

{

       // TODO: add construction code here

                   center.x=400;

                     center.y=200;

                     ir=50;

}

c.       在OnDraw(CDC* pDC)函数中画圆

       void CMy1_4View::OnDraw(CDC* pDC)

{

                     CMy1_4Doc* pDoc = GetDocument();

                     ASSERT_VALID(pDoc);

                     // TODO: add draw code for native data here

//画圆

                  pDC->Ellipse(center.x-ir,center.y-ir,center.x+ir,center.y+ir);

}

   

d.       添加OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags),使它按照键盘方向键的操作而移动圆的位置。如下:

 

     void CMy1_4View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 

{

       // TODO: Add your message handler code here and/or call default

       //利用方向键左右上下移动20

       switch(nChar)

       {

       case VK_LEFT:

           center.x-=20;

              break;

       case VK_RIGHT:

           center.x+=20;

              break;            

       case VK_UP:

        center.y-=20;

              break;

       case VK_DOWN:

           center.y+=20;

              break;

       }

       //重画

       Invalidate();

       CView::OnKeyDown(nChar, nRepCnt, nFlags);

}   

e.       执行,看看效果,你就可以操纵了。

f.        那么,利用鼠标又是怎样操作呢?添加OnLButtonDown(UINT nFlags, CPoint point)如下:

 

    void CMy1_4View::OnLButtonDown(UINT nFlags, CPoint point) 

{

       // TODO: Add your message handler code here and/or call default

       //把圆移动鼠标指定位置

       //圆心赋值为point

       center=point;

    //重画

       Invalidate();

       CView::OnLButtonDown(nFlags, point);

}  

g.       再执行,你现在键盘鼠标都可以操作了。

 

真正的游戏,也就是以上简单的图形或位图的复杂化和简单操作的复杂化而已。

 

 

………………………………………………………………………………

………………………………………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………………………

//

//

//学好入门篇之后,再来下载全部的经典游戏源码,保证你成为一个高级的游戏开发专家!!!!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics