[游戏学习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 }

[游戏学习27] MFC 匀速运动,布布扣,bubuko.com

时间: 2024-12-16 15:03:57

[游戏学习27] MFC 匀速运动的相关文章

[游戏学习26] MFC 时间函数 画图形

>_<:这里第一次介绍MFC的时间函数,功能和Win32里的计时器类似. >_<:这里还介绍了MFC的图形绘制函数,和Win32有一点区别 >_<:ABC.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 : p

[游戏学习25] MFC 橡皮筋画线效果

>_<:这是给出窗口内外不同情况的处理展示的例子. >_<:MouseCap.h 1 #include<afxwin.h> 2 class CMyApp :public CWinApp 3 { 4 public: 5 virtual BOOL InitInstance(); 6 }; 7 class CMainWindow:public CFrameWnd 8 { 9 protected: 10 BOOL m_bTracking; //标志:鼠标按下为真,否则为假 11

[游戏学习28] MFC 时钟

>_<:这是一个时钟小程序 >_<:通过调用获得系统时间然后经过计算得出当前时间,然后再以3个圆环表示时分秒. >_<:TAO_CLOCK.h 1 class CMyApp : public CWinApp 2 { 3 public: 4 virtual BOOL InitInstance (); 5 }; 6 7 class CMainWindow : public CFrameWnd 8 { 9 protected: 10 11 12 int m_nPrevSeco

[游戏学习22] MFC 井字棋 双人对战

>_<:太多啦,感觉用英语说的太慢啦,没想到一年做的东西竟然这么多.....接下来要加速啦! >_<:注意这里必须用MFC和前面的Win32不一样啦! >_<:这也是第一次出现MFC游戏,其框架和逻辑的写法和Win32有很大的区别,建议先看一下MFC的基础再理解代码: >_<:TicTac.h 1 #define EX 1 //该点左鼠标 2 #define OH 2 //该点右鼠标 3 4 class CMyApp : public CWinApp 5 {

[游戏学习24] MFC 各种绘图 字体学习

>_<:这里包含字体设置及各种绘图,只要稍微看一下代码就能理解,这里不多介绍 >_<:Hello.h 1 #include<afxwin.h> 2 class CMyApp:public CWinApp 3 { 4 public: 5 virtual BOOL InitInstance(); 6 }; 7 class CMainWindow:public CFrameWnd 8 { 9 public: 10 CMainWindow(); 11 protected: 12

[游戏学习23] MFC 画尺子

>_<:这是个简单的MFC程序,有利于了解MFC的框架结构 >_<:Ruler.h 1 #include<afxwin.h> 2 class CMyApp:public CWinApp 3 { 4 public: 5 virtual BOOL InitInstance(); 6 }; 7 class CMainWindow:public CFrameWnd 8 { 9 public: 10 CMainWindow(); 11 protected: 12 afx_msg

[游戏模版1] MFC最小框架(base function including)

>_<:Here are the template of mini-MFC include: CPen,CBrush,Front,Paint Line and some other graph. OnPaint message,OnLeftButtonDown message,you can through it know more Hello.h 1 #include<afxwin.h> 2 class CMyApp:public CWinApp 3 { 4 public: 5

简单数字拼板游戏学习

VS2010/MFC/对话框程序 MFC练习 1.新建一个矩形类. MoveDown(),MoveUp(),MoveLeft(),MoveRight()是移动的动作.int position是表示该矩形当前的实际位置,按如下布局: 0 1 2 3 4 5 6 7 8 .MoveXXX()函数一是要判断是否可以响应,而是响应后要修改position的值与当前位置匹配. 如MoveUp()函数中,如果该矩形position为0,1,2,则应该不动(此判断也可省,在键盘响应处理中会根据空格所在位置指定

[游戏学习29] Win32 图像处理1

>_<:bmp格式的简单处理:          >_<:变暗RGB同时除以某一值 >_<:出现轮廓的是通道相减 >_<:最后一个是颜色提取 >_<:头文件参见:http://www.cnblogs.com/zjutlitao/p/3733164.html 1 #include "stdafx.h" 2 #include "resourse.h" 3 4 #define MAX_LOADSTRING 100