zoukankan      html  css  js  c++  java
  • 12)游戏的第一步 ,编写基类

    我编好我的父类  然后  通过子类继承 改写不同的代码  就实现了 一个接口  多种行为

    1)首先是switch消息的种类的展示:

      

     1 switch(uMsg)
     2     {
     3     
     4     case WM_CREATE://初始化
     5         break;
     6     case WM_PAINT://窗口重绘,其实就是贴图
     7         break;
     8     case WM_KEYDOWN://键盘按键按下
     9         break;
    10     case WM_KEYUP://按键抬起
    11         break;
    12     case WM_LBUTTONDOWN://鼠标左键按下
    13         break;
    14     case WM_LBUTTONUP://鼠标左键抬起
    15         break;
    16     case WM_MOUSEMOVE://鼠标移动
    17         break;
    18     case WM_TIMER://定时器
    19         break;
    20     case WM_CLOSE://点那个×,窗口关闭
    21         ::PostQuitMessage(0);//消息推出
    22         break;
    23     
    24 
    25     }

    2)然后 就是  编写基类  就是父类,这个父类里卖弄有很多的虚函数

     我建立了一个CGameCtrl.h的基类头文件

     1 #pragma once
     2 //上面的代码为了兼容C++
     3 
     4 
     5 
     6 
     7 //下面的是兼容C编译器
     8 #ifndef _CGAMECTRL_
     9 #define _CGAMECTRL_
    10 class CGameCtrl
    11 {
    12     //此处写的纯虚函数,子类必须他们全部重写
    13 public:
    14     void virtual OnCreateGame()=0;//这个给WM_CREATE
    15     void virtual GameDraw()=0;//这个给WM_PAINT
    16     void virtual GameRun()=0;//这个给WM_TIMER
    17     void virtual OnKeyDown()=0;
    18     void virtual OnKeyUp()=0;
    19     void virtual OnLbuttonDown()=0;
    20     void virtual OnLbuttonUp()=0;
    21     void virtual OnMouseMove()=0;
    22 
    23 }
    24 
    25 #endif

    但是 要是基类的函数全部是纯虚函数,那么子类就必须实现,所以  我可以将创虚函数做点修改:

     1 #pragma once
     2 //上面的代码为了兼容C++
     3 
     4 
     5 
     6 
     7 //下面的是兼容C编译器
     8 #ifndef _CGAMECTRL_
     9 #define _CGAMECTRL_
    10 class CGameCtrl
    11 {
    12 
    13     //这样改写  子类中  就没必要全部重写这些函数了,因为有的子类用到键盘,有的用不到,那么下面的这种写法 ,就避免了  不用OnKeyDown()函数的类去改写这个函数
    14 public:
    15     void virtual OnCreateGame(){}
    16     void virtual GameDraw(){}
    17     void virtual GameRun(){}
    18     void virtual OnKeyDown(){}
    19     void virtual OnKeyUp(){}
    20     void virtual OnLbuttonDown(){}
    21     void virtual OnLbuttonUp(){}
    22     void virtual OnMouseMove(){}
    23 
    24 }
    25 
    26 #endif

     这样写   子类就可以不用实现了  要是 子类实现了  就用子类的  要是子类没有实现   就用父类的

    3)修改WinMaincpp中的内容:
          

      基本步骤 图片:
            

        基本代码信息:

      1 #include<Windows.h>
      2 #include"CGameCtrl.h"
      3 
      4 HINSTANCE hIns;
      5 
      6 //然后定义一个父类的指针
      7 CGameCtrl * cGame=NULL;
      8 
      9 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
     10 {
     11     switch(uMsg)
     12     {
     13     
     14     case WM_CREATE://初始化
     15         if(cGame!=NULL)
     16         {
     17             cGame->OnCreateGame();
     18         }
     19         break;
     20     case WM_PAINT://窗口重绘,其实就是贴图
     21         if(cGame!=NULL)
     22         {
     23             cGame->GameDraw();
     24         }
     25         break;
     26     case WM_KEYDOWN://键盘按键按下
     27         if(cGame!=NULL)
     28         {
     29             cGame->OnKeyDown();
     30         }
     31         break;
     32     case WM_KEYUP://按键抬起
     33         if(cGame!=NULL)
     34         {
     35             cGame->OnKeyUp();
     36         }
     37         break;
     38     case WM_LBUTTONDOWN://鼠标左键按下
     39         if(cGame!=NULL)
     40         {
     41             cGame->OnLbuttonDown();
     42         }
     43         break;
     44     case WM_LBUTTONUP://鼠标左键抬起
     45         if(cGame!=NULL)
     46         {
     47             cGame->OnLbuttonUp();
     48         }
     49         break;
     50     case WM_MOUSEMOVE://鼠标移动
     51         if(cGame!=NULL)
     52         {
     53             cGame->OnMouseMove();
     54         }
     55         break;
     56     case WM_TIMER://定时器
     57         if(cGame!=NULL)
     58         {
     59             cGame->OnCreateGame();
     60         }
     61         break;
     62     case WM_CLOSE://点那个×,窗口关闭
     63         ::PostQuitMessage(0);//消息推出
     64         break;
     65     
     66     }
     67     return ::DefWindowProc( hWnd, uMsg, wParam, lParam);
     68 }
     69 
     70 
     71 int CALLBACK WinMain(HINSTANCE hIstance,
     72                      HINSTANCE hPreInstance,
     73                      LPSTR pCmdLine,
     74                      int nCmdShow)
     75 {
     76             
     77     hIns=hIstance;
     78     HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255));
     79             
     80     
     81     //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个)
     82             WNDCLASSEX wndclass;
     83             wndclass.cbClsExtra=0;
     84             wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间
     85             wndclass.cbSize=sizeof(WNDCLASSEX);
     86             wndclass.hbrBackground=hBrush;
     87             wndclass.hCursor=NULL;//光标
     88             //因为上面的那个LoadCUrsor是需要字符串,但是那个IDC_CURSOR1是一个整型数字,所以  需要用那个宏给转定义一下
     89             wndclass.hIcon=NULL;//窗口图标
     90             wndclass.hIconSm=NULL;//窗口左上的图标
     91             wndclass.hInstance=hIstance;
     92             wndclass.lpfnWndProc=WndProc;
     93             wndclass.lpszClassName="wangchao";
     94             wndclass.lpszMenuName=NULL;
     95             wndclass.style=CS_HREDRAW|CS_VREDRAW;
     96 
     97     //2.注册
     98             if(::RegisterClassEx(&wndclass)==FALSE)
     99             {
    100                 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK);
    101                 
    102                 return 0;
    103             }
    104     //3.创建
    105                     
    106             HWND hWnd=::CreateWindow("wangchao","xiao_hua",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hIstance,NULL);
    107             
    108         if(hWnd==NULL)
    109         {
    110             ::MessageBox(NULL,"创建失败","提示",MB_OK);
    111             return 0;
    112         }
    113     //4.显式
    114             
    115         ::ShowWindow(hWnd,SW_SHOW);
    116         
    117     //5.消息循环
    118         
    119             MSG msg;
    120             
    121             while(::GetMessage(&msg,0,0,0))
    122         {
    123             //第一步先翻译
    124             ::TranslateMessage(&msg);
    125             //第二部分发
    126             ::DispatchMessageA(&msg);
    127 
    128         }
    129 
    130 
    131     ::DeleteObject(hBrush);
    132 }

    4)然后  我运行 一下  没有错误  证明我的代码是正确的。

    5)总的文档目录展示:
          

    6)总的代码展示:

        CGameCtrl.h文件内容:

     1 #pragma once
     2 //上面的代码为了兼容C++
     3 
     4 
     5 
     6 
     7 //下面的是兼容C编译器
     8 #ifndef _CGAMECTRL_
     9 #define _CGAMECTRL_
    10 class CGameCtrl
    11 {
    12 
    13 public:
    14     CGameCtrl()
    15     {
    16     
    17     }
    18     //如果  你的函数中有虚函数,那么析构就应是虚析构   至于为啥  我也不清楚
    19     virtual ~CGameCtrl()
    20     {
    21     
    22     }
    23 public:
    24     void virtual OnCreateGame(){}
    25     void virtual GameDraw(){}
    26     void virtual GameRun(){}
    27     void virtual OnKeyDown(){}
    28     void virtual OnKeyUp(){}
    29     void virtual OnLbuttonDown(){}
    30     void virtual OnLbuttonUp(){}
    31     void virtual OnMouseMove(){}
    32 
    33 };
    34 
    35 #endif

          WinMaincpp.cpp文件内容:

      1 #include<Windows.h>
      2 #include"CGameCtrl.h"
      3 
      4 HINSTANCE hIns;
      5 
      6 //然后定义一个父类的指针
      7 CGameCtrl * cGame=NULL;
      8 
      9 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
     10 {
     11     switch(uMsg)
     12     {
     13     
     14     case WM_CREATE://初始化
     15         if(cGame!=NULL)
     16         {
     17             cGame->OnCreateGame();
     18         }
     19         break;
     20     case WM_PAINT://窗口重绘,其实就是贴图
     21         if(cGame!=NULL)
     22         {
     23             cGame->GameDraw();
     24         }
     25         break;
     26     case WM_KEYDOWN://键盘按键按下
     27         if(cGame!=NULL)
     28         {
     29             cGame->OnKeyDown();
     30         }
     31         break;
     32     case WM_KEYUP://按键抬起
     33         if(cGame!=NULL)
     34         {
     35             cGame->OnKeyUp();
     36         }
     37         break;
     38     case WM_LBUTTONDOWN://鼠标左键按下
     39         if(cGame!=NULL)
     40         {
     41             cGame->OnLbuttonDown();
     42         }
     43         break;
     44     case WM_LBUTTONUP://鼠标左键抬起
     45         if(cGame!=NULL)
     46         {
     47             cGame->OnLbuttonUp();
     48         }
     49         break;
     50     case WM_MOUSEMOVE://鼠标移动
     51         if(cGame!=NULL)
     52         {
     53             cGame->OnMouseMove();
     54         }
     55         break;
     56     case WM_TIMER://定时器
     57         if(cGame!=NULL)
     58         {
     59             cGame->OnCreateGame();
     60         }
     61         break;
     62     case WM_CLOSE://点那个×,窗口关闭
     63         ::PostQuitMessage(0);//消息推出
     64         break;
     65     
     66     }
     67     return ::DefWindowProc( hWnd, uMsg, wParam, lParam);
     68 }
     69 
     70 
     71 int CALLBACK WinMain(HINSTANCE hIstance,
     72                      HINSTANCE hPreInstance,
     73                      LPSTR pCmdLine,
     74                      int nCmdShow)
     75 {
     76             
     77     hIns=hIstance;
     78     HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255));
     79             
     80     
     81     //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个)
     82             WNDCLASSEX wndclass;
     83             wndclass.cbClsExtra=0;
     84             wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间
     85             wndclass.cbSize=sizeof(WNDCLASSEX);
     86             wndclass.hbrBackground=hBrush;
     87             wndclass.hCursor=NULL;//光标
     88             //因为上面的那个LoadCUrsor是需要字符串,但是那个IDC_CURSOR1是一个整型数字,所以  需要用那个宏给转定义一下
     89             wndclass.hIcon=NULL;//窗口图标
     90             wndclass.hIconSm=NULL;//窗口左上的图标
     91             wndclass.hInstance=hIstance;
     92             wndclass.lpfnWndProc=WndProc;
     93             wndclass.lpszClassName="wangchao";
     94             wndclass.lpszMenuName=NULL;
     95             wndclass.style=CS_HREDRAW|CS_VREDRAW;
     96 
     97     //2.注册
     98             if(::RegisterClassEx(&wndclass)==FALSE)
     99             {
    100                 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK);
    101                 
    102                 return 0;
    103             }
    104     //3.创建
    105                     
    106             HWND hWnd=::CreateWindow("wangchao","xiao_hua",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hIstance,NULL);
    107             
    108         if(hWnd==NULL)
    109         {
    110             ::MessageBox(NULL,"创建失败","提示",MB_OK);
    111             return 0;
    112         }
    113     //4.显式
    114             
    115         ::ShowWindow(hWnd,SW_SHOW);
    116         
    117     //5.消息循环
    118         
    119             MSG msg;
    120             
    121             while(::GetMessage(&msg,0,0,0))
    122         {
    123             //第一步先翻译
    124             ::TranslateMessage(&msg);
    125             //第二部分发
    126             ::DispatchMessageA(&msg);
    127 
    128         }
    129 
    130 
    131     ::DeleteObject(hBrush);
    132 }
  • 相关阅读:
    TCP通信 -C/S中的Socket与ServerSocket
    打印流 -可将数据写入文件/可改变输出方向
    转换流 -解决输入输出时编码格式不统一的问题
    字节/字符缓冲流
    Properties -IO相关的双列集合类
    IO流 -字符输入输出流,以及异常处理方法
    IO流
    线程间的通信
    o(* ̄︶ ̄*)o
    1
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/8306444.html
Copyright © 2011-2022 走看看