11.背景的绘制以及交互功能

HJ Lv2

11.背景的绘制以及交互功能

背景的绘制

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
void putMainBk() {
char wstr[20]; //当前积分
char stimec[20]; //当前剩余时间
char bestscore[20]; //当前积分最佳得分
sprintf(wstr, "%d", credit); //当前积分写入字符串变量
sprintf(bestscore, "%d", getScore()); //获取最高积分
sprintf(stimec, "%d", stime); //剩余时间
//先放置背景
putimage(0, 0, &picgroup[1]);
//再放置互动图片
PutL(10, 7, "宋体", 20, YELLOW, "血量");
PutL(10, 30, "宋体", 20, YELLOW, "用户名");
PutL(70, 30, "宋体", 20, YELLOW, username);//当前用户名
setfillcolor(RED);
solidrectangle(50, 7, 200, 27);
setfillcolor(GREEN);
double bili = (zombielist->hp) / (double)(150);//当前血量占比
int yz = 150 * bili;//血量条长度
solidrectangle(50, 7, 50 + yz, 27);
PutL(210, 7, "宋体", 20, YELLOW, "得分");
PutL(250, 7, "宋体", 20, YELLOW, wstr);
PutL(210, 30, "宋体", 20, YELLOW, "最高得分");
PutL(290, 30, "宋体", 20, YELLOW, bestscore);
PutL(320, 7, "宋体", 20, YELLOW, "剩余时间");
PutL(410, 7, "宋体", 20, YELLOW, stimec);
putimagePNG(450, 0, &picgroup[4]);
PutL(470, 8, "黑体", 25, BLACK, "退出游戏");
putimagePNG(620, 0, &picgroup[4]);
PutL(640, 8, "黑体", 25, BLACK, "暂停游戏");
}

这段代码没有什么难度。
最后效果如图所示:
avatar

交互

在这里将所有的交互写到一个函数

1
2
3
4
5
6
void clickMsg() {
ExMessage msg;
peekmessage(&msg);
keyboardMove(&msg);
clickMenu(&msg);
}

其中keyboardMove是键盘事件,clickMenu是鼠标事件。

键盘事件

在键盘事件中,我们要实现通过按wsad实现僵尸的上下左右移动。并且需要不越界。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void keyboardMove(ExMessage* msg) {//模式2中键盘控制僵尸移动
if (msg->message == WM_KEYDOWN && zombielist->status == 1) {
if(msg->prevdown==false){
switch (msg->vkcode) {
case 0x41://a
//当按下A后处理的事件
break;
case 0x44://d
//当按下D后处理的事件
break;
case 0x57://w
//当按下W后处理的事件
break;
case 0x53://s
//当按下S后处理的事件
break;
}
}
}
}

在这里WM_KEYDOWN表示键盘消息,msg->prevdown==false判断前一个案件是否按下,如果不写这行代码,则会连续移动两次,0x41等表示案件的虚拟键码;如果僵尸在第一行到第五行并且在图内按键盘才有效。

鼠标事件

在本游戏中,鼠标按键就是判断用户点击了哪个菜单,若点击了退出游戏,那么关闭游戏,若点击了暂停,则游戏暂停。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void clickMenu(ExMessage* msg) {
if (msg) {
if () {//判断退出游戏的条件
exit(0);
}

if () {//判断暂停游戏的条件
ispause = true;//暂停
while (1) {
//在这里写暂停时处理的事件
if(...){//判断结束暂停的条件
ispause=false;
return;
}
}
}
}
}

我们主要看暂停部分,若玩家点击了暂停按钮,则变量ispause设置为true表示为暂停状态,随后进入一个死循环,绘制暂停框,只有用户点击了继续游戏,变量ispause设置为false退出死循环,继续游戏。