zoukankan      html  css  js  c++  java
  • [游戏学习27] MFC 匀速运动

    >_<:理解上一个时间函数的概念和用法,本节的实现也比较简单

    >_<:就是简单的绘图+时间函数

    >_<:TicTac.h

     1 #define EX 1            //该点左鼠标
     2 #define OH 2            //该点右鼠标
     3 
     4 class CMyApp : public CWinApp
     5 {
     6 public:
     7     virtual BOOL InitInstance ();
     8 };
     9 
    10 class CMainWindow : public CFrameWnd     //不是继承CFrameWnd 因此需要在CMainWindow()自己定义窗口类了
    11 {
    12 protected:
    13     CPoint pos,killpos;
    14     int vx,vy,ax,ay;
    15     int killvx,killvy,killax,killay;
    16     int num,Length;
    17 
    18 public:
    19     CMainWindow ();
    20 
    21 protected:
    22     virtual void PostNcDestroy ();//在程序终止之前销毁CMainWindow对象
    23     afx_msg int OnCreate (LPCREATESTRUCT lpcs);
    24     afx_msg void OnTimer (UINT nTimerID);
    25     DECLARE_MESSAGE_MAP ()
    26 };

    >_<:TicTac.cpp

      1 #include <afxwin.h>
      2 #include "TicTac.h"
      3 #define ID_TIMER_ELLIPSE 1
      4 #define ID_TIMER_RECTANGLE 2
      5 
      6 CMyApp myApp;
      7 
      8 /////////////////////////////////////////////////////////////////////////
      9 // CMyApp member functions
     10 
     11 BOOL CMyApp::InitInstance ()
     12 {
     13     m_pMainWnd = new CMainWindow;
     14     m_pMainWnd->ShowWindow (m_nCmdShow);
     15     m_pMainWnd->UpdateWindow ();
     16     return TRUE;
     17 }
     18 
     19 /////////////////////////////////////////////////////////////////////////
     20 // CMainWindow message map and member functions
     21 
     22 BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
     23     ON_WM_CREATE ()
     24     ON_WM_TIMER ()
     25 END_MESSAGE_MAP ()
     26 
     27 CMainWindow::CMainWindow ()
     28 {
     29     //初始化游戏
     30     //InitGame();
     31     pos=CPoint(0,0);
     32     vx=killvx=20;
     33     vy=killvy=20 ;
     34     ax=ay=killax=killay=0;
     35     Length=6;
     36     num=0;
     37 
     38 
     39     
     40     //注册一个 WNDCLASS 窗口类.
     41     CString strWndClass = AfxRegisterWndClass (
     42         CS_DBLCLKS,                                        // Class style(有双击时间发生的窗口类型)
     43         AfxGetApp ()->LoadStandardCursor (IDC_ARROW),   // Class cursor(加载一个系统光标,也可自己定义)
     44         (HBRUSH) (COLOR_3DFACE + 1),                    // Background brush(每次::BeginPaint时用它清空客户区);COLOR_3DFACE+1是指定窗口具有与按钮对话框一致的背景色和其他一些3D属性;默认为灰亮色
     45         AfxGetApp ()->LoadStandardIcon (IDI_WINLOGO)    // Class icon(加载系统图标,也可自己定义)
     46     );
     47 
     48     //调用CWnd::CreateEx()创建主窗口
     49     //第一个参数表示0个或是多个WS_EX标志组合;2:AfxRegisterWndClass()返回的WNDCLASS名称;
     50     //3、标题;4、窗口样式
     51     CreateEx (0, strWndClass, _T ("Timer"),
     52         WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,   //WS_THICKFRAME窗口可调大小属性(这里不用)
     53         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, //初始位置和大小,这里用CW_USEDEFAULT让Windows拾取窗口和大小
     54         NULL, NULL);
     55 
     56     //处理窗口位置和尺寸
     57     CRect rect (0, 0, 840, 400);       //理想客户区窗口矩形形状
     58     CalcWindowRect (&rect);            //根据分辨率、菜单...计算窗口矩形大小(必须在窗口创建后调用)
     59 
     60     SetWindowPos (NULL, 0, 0, rect.Width (), rect.Height (),
     61         SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
     62 }
     63 
     64 //在程序结束之前销毁创建的CMainWindow对象
     65 void CMainWindow::PostNcDestroy ()
     66 {
     67     delete this;
     68 }
     69 
     70 
     71 
     72 int CMainWindow::OnCreate (LPCREATESTRUCT lpcs)//回掉函数
     73 {
     74     if (CFrameWnd::OnCreate (lpcs) == -1)
     75         return -1;
     76 
     77     if (!SetTimer (ID_TIMER_ELLIPSE, 100, NULL)) {
     78         MessageBox (_T ("Error: SetTimer failed"));
     79         return -1;
     80     }
     81     return 0;
     82 }
     83 
     84 void CMainWindow::OnTimer (UINT nTimerID)
     85 {
     86     CRect rect;
     87     GetClientRect (&rect);
     88     
     89     
     90     pos.x+=vx;
     91     if(pos.x>rect.right-30){
     92         pos.x=rect.right-30;
     93         vx=-vx;
     94     }
     95     if(pos.x<0){
     96         pos.x=0;
     97         vx=-vx;
     98     }
     99     pos.y+=vy;
    100     if(pos.y>rect.bottom-30){
    101         pos.y=rect.bottom-30;
    102         vy=-vy;
    103     }
    104     if(pos.y<0){
    105         pos.y=0;
    106         vy=-vy;
    107     }
    108 
    109 
    110     if(num++==0)killpos=pos;
    111     if(num>=Length){
    112     killpos.x+=killvx;
    113     if(killpos.x>rect.right-30){
    114         killpos.x=rect.right-30;
    115         killvx=-killvx;
    116     }
    117     if(killpos.x<0){
    118         killpos.x=0;
    119         killvx=-killvx;
    120     }
    121     killpos.y+=killvy;
    122     if(killpos.y>rect.bottom-30){
    123         killpos.y=rect.bottom-30;
    124         killvy=-killvy;
    125     }
    126     if(killpos.y<0){
    127         killpos.y=0;
    128         killvy=-killvy;
    129     }}
    130     
    131     CClientDC dc (this);
    132     
    133     
    134     CPen pen(PS_NULL,1,RGB(0,0,0));
    135     dc.SelectObject(&pen);
    136     if(num==1)dc.Rectangle(rect);
    137     dc.Ellipse(killpos.x,killpos.y,killpos.x+30,killpos.y+30);
    138     ::DeleteObject(&pen);
    139 
    140     CBrush brush(RGB(10,10,240));
    141     dc.SelectObject (&brush);
    142     dc.Ellipse(pos.x,pos.y,pos.x+30,pos.y+30);
    143     ::DeleteObject(&brush);
    144 
    145     CBrush brush1(RGB(255,0,0));
    146     dc.SelectObject (&brush1);
    147     dc.Ellipse(pos.x+5,pos.y+5,pos.x+25,pos.y+25);
    148     ::DeleteObject(&brush1);
    149 }
  • 相关阅读:
    Apache并发相关的几个配置
    MPM:Multi-Processing Modules
    regsvr32是干什么的
    第一个子容器设置margin-top后和父容器发生外边距合并,解决办法是给父容器设置非0 padding-top或overflow:hidden
    li或dd 浮动后增加图片时高度多出3-5px的问题
    [Error: No platforms added to this project. Please use `cordova platform add <platform>`.]
    单链表的实现(python)
    python的顺序表(list,tuple)
    python装饰器
    梯度下降算法
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3735425.html
Copyright © 2011-2022 走看看