入门篇:
游戏是动画的延伸,只要知道了动画的原理,在动画变化时,使它根据键盘或鼠标的输入操作而变化,就是游戏了。 所以在介绍游戏编程之前,先讲讲动画。 动画一般分三种形式:形变、位变、色变。如下: 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. 再执行,你现在键盘鼠标都可以操作了。 真正的游戏,也就是以上简单的图形或位图的复杂化和简单操作的复杂化而已。
………………………………………………………………………………
………………………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………………………………………
//
//
//学好入门篇之后,再来下载全部的经典游戏源码,保证你成为一个高级的游戏开发专家!!!!