-
Notifications
You must be signed in to change notification settings - Fork 0
/
4.5.3 鼠标交互反弹球.cpp
174 lines (152 loc) · 4.16 KB
/
4.5.3 鼠标交互反弹球.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <conio.h>
#include <graphics.h>
#define High 480 // 游戏画面尺寸
#define Width 640
#define Brick_num 10 // 砖块个数
// 全局变量
int ball_x,ball_y; // 小球的坐标
int ball_vx,ball_vy; // 小球的速度
int radius; // 小球的半径
int bar_x,bar_y; // 挡板中心坐标
int bar_high,bar_width; // 挡板的高度和宽度
int bar_left,bar_right,bar_top,bar_bottom; // 挡板的上下左右位置坐标
int isBrickExisted[Brick_num]; // 每个砖块是否存在,1为存在,0为没有了
int brick_high,brick_width; // 每个砖块的高度和宽度
void startup() // 数据初始化
{
ball_x = Width/2;
ball_y = High/2;
ball_vx = 1;
ball_vy = 1;
radius = 20;
bar_high = High/20;
bar_width = Width/2;
bar_x = Width/2;
bar_y = High - bar_high/2;
bar_left = bar_x - bar_width/2;
bar_right = bar_x + bar_width/2;
bar_top = bar_y - bar_high/2;
bar_bottom = bar_y + bar_high/2;
brick_width = Width/Brick_num;
brick_high = High/Brick_num;
int i;
for (i=0;i<Brick_num;i++)
isBrickExisted[i] = 1;
initgraph(Width, High);
BeginBatchDraw();
}
void clean() // 消除画面
{
setcolor(BLACK);
setfillcolor(BLACK);
fillcircle(ball_x, ball_y, radius); // 绘制黑线、黑色填充的圆
bar(bar_left,bar_top,bar_right,bar_bottom); // 绘制黑线、黑色填充的挡板
int i,brick_left,brick_right,brick_top,brick_bottom;
for (i=0;i<Brick_num;i++)
{
brick_left = i*brick_width;
brick_right = brick_left + brick_width;
brick_top = 0;
brick_bottom = brick_high;
if (!isBrickExisted[i]) // 砖块没有了,绘制黑色
fillrectangle(brick_left,brick_top,brick_right,brick_bottom);
}
}
void show() // 显示画面
{
setcolor(YELLOW);
setfillcolor(GREEN);
fillcircle(ball_x, ball_y, radius); // 绘制黄线、绿色填充的圆
bar(bar_left,bar_top,bar_right,bar_bottom); // 绘制黄线、绿色填充的挡板
int i,brick_left,brick_right,brick_top,brick_bottom;
for (i=0;i<Brick_num;i++)
{
brick_left = i*brick_width;
brick_right = brick_left + brick_width;
brick_top = 0;
brick_bottom = brick_high;
if (isBrickExisted[i]) // 砖块存在,绘制砖块
{
setcolor(WHITE);
setfillcolor(RED);
fillrectangle(brick_left,brick_top,brick_right,brick_bottom); // 绘制砖块
}
}
FlushBatchDraw();
// 延时
Sleep(3);
}
void updateWithoutInput() // 与用户输入无关的更新
{
// 挡板和小圆碰撞,小圆反弹
if ( ( (ball_y+radius >= bar_top) && (ball_y+radius < bar_bottom-bar_high/3) )
|| ( (ball_y-radius <= bar_bottom) && (ball_y-radius > bar_top-bar_high/3) ) )
if ( (ball_x>=bar_left) && (ball_x<=bar_right) )
ball_vy = -ball_vy;
// 更新小圆坐标
ball_x = ball_x + ball_vx;
ball_y = ball_y + ball_vy;
// 小圆和边界碰撞
if ((ball_x==radius)||(ball_x==Width-radius))
ball_vx = -ball_vx;
if ((ball_y==radius)||(ball_y==High-radius))
ball_vy = -ball_vy;
// 判断小圆是否和某个砖块碰撞
int i,brick_left,brick_right,brick_bottom;
for (i=0;i<Brick_num;i++)
{
if (isBrickExisted[i]) // 砖块存在,才判断
{
brick_left = i*brick_width;
brick_right = brick_left + brick_width;
brick_bottom = brick_high;
if ( (ball_y==brick_bottom+radius) && (ball_x>=brick_left) && (ball_x<=brick_right) )
{
isBrickExisted[i] = 0;
ball_vy = -ball_vy;
}
}
}
}
void updateWithInput() // 与用户输入有关的更新
{
MOUSEMSG m; // 定义鼠标消息
if (MouseHit()) //这个函数用于检测当前是否有鼠标消息
{
m = GetMouseMsg(); // 获取一条鼠标消息
if(m.uMsg == WM_MOUSEMOVE)
{
// 鼠标移动时,挡板的位置等于鼠标所在的位置
bar_x = m.x;
bar_y = m.y;
bar_left = bar_x - bar_width/2;
bar_right = bar_x + bar_width/2;
bar_top = bar_y - bar_high/2;
bar_bottom = bar_y + bar_high/2;
}
else if (m.uMsg == WM_LBUTTONDOWN)
{
// 按下鼠标左键,初始化小球的位置为挡板上面中心
ball_x = bar_x;
ball_y = bar_top - radius-3;
}
}
}
void gameover()
{
EndBatchDraw();
closegraph();
}
int main()
{
startup(); // 数据初始化
while (1) // 游戏循环执行
{
clean(); // 把之前绘制的内容取消
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
show(); // 显示新画面
}
gameover(); // 游戏结束、后续处理
return 0;
}