EasyX 是针对 C++ 的图形库,可以帮助 C/C++ 初学者快速上手图形和游戏编程。
Easyx的下载链接 EasyX Graphics Library for C++
easyx 可以默认为一个现成的图形化库函数,里面的函数可以直接通过头文件<graphics.h>和<conio.h>来调用。
这次以简易推箱子游戏为素材为大家讲一下自己的心得:
这个游戏的设计思路主要从界面设计,地图加载,贴图,地图刷新来实现。
//"map.h"
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<graphics.h>
#include<stdbool.h>
#include <mmsystem.h> //播放音乐需要的头文件
#pragma comment(lib,"winmm.lib")
//定义当前关卡
int number = 0;//初始化位第0张地图
//格子边长
#define SPACE 60
//6.3.1 定义变量
IMAGE png[12];//5张图,定义5个变量,定义一个数组
#define MapMany 6
//枚举方向
enum CH {
right = 1,
left = 2,
up = 3,
down = 4
}ch;
//定义一个全局三维数组
//0表示空地, 1表示墙, 2代表目的地, 3代表人站在空地上, 4代表箱子,
//5箱子与目的地重合, 6,人站在目的地上,
//下面定义地图
int map[MapMany][10][10] = {
//图一
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 2, 0, 1, 1, 0, 0, 0, 2, 1 },
{ 1, 0, 0, 1, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 1, 1, 0, 4, 1 },
{ 1, 0, 0, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
{ 1, 4, 0, 0, 0, 0, 0, 3, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图二
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 2, 0, 0, 0, 4, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
{ 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 0, 3, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 2, 0, 0, 4, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图三
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 2, 0, 1, 0, 0, 3, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 4, 0, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 0, 0, 0, 4, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 4, 0, 1, 0, 0, 1 },
{ 1, 2, 0, 0, 0, 0, 1, 0, 2, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图四
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图五
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图六
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
}
};
//"carry.h"
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<graphics.h>
#include<stdbool.h>//bool
//播放音乐需要的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#include"map.h"//地图
#include"direction.h"//方向
//贴图
void drawGame() {
for (int i = 0; i < 10; i++) {//显示一行
for (int j = 0; j < 10; j++) {//显示一个格子
putimage(j * SPACE, i * SPACE, &png[map[number][i][j]]);
}
}
}
void DrawMap(int n)
{
system("cls");//清屏
for (int j = 0; j < 10; j++)
{
int i;
for (i = 0; i < 10; i++)
{
if (map[number][i][j] == 0)
putimage(j * SPACE, i * SPACE, &png[0]);
if (map[number][i][j] == 1)
putimage(j * SPACE, i * SPACE, &png[1]);
if (map[number][i][j] == 2)
putimage(j * SPACE, i * SPACE, &png[2]);
if (map[number][i][j] == 3)
putimage(j * SPACE, i * SPACE, &png[3]);
if (map[number][i][j] == 4)
putimage(j * SPACE, i * SPACE, &png[4]);
if (map[number][i][j] == 5)
putimage(j * SPACE, i * SPACE, &png[5]);
if (map[number][i][j] == 6)
putimage(j * SPACE, i * SPACE, &png[6]);
}
if (i < 9)printf("\n");
}
}
//判断按键操作
int KbHit()
{
if (GetAsyncKeyState(VK_UP) & 1)
return up;
else if (GetAsyncKeyState(VK_DOWN) & 1)
return down;
else if (GetAsyncKeyState(VK_RIGHT) & 1)
return right;
else if (GetAsyncKeyState(VK_LEFT) & 1)
return left;
else
return 0;
}
//判断游戏是否结束
int GameOver()
{
//统计目的地的个数
int flag = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (map[number][i][j] == 2)
flag++;
}
}
//箱子到达目的地的个数
int count = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (map[number][i][j] == 4)
count++;
}
}
if (count == 0 && flag == 0)
return 1;
else
return 0;
}
//执行类
class Execute {
private:
int x;
int y;
int flag;
int x1, y1, x2, y2;
int j;
public:
Execute() {
x = 0;
y = 0;
x1 = 0; y1 = 0; x2 = 0; y2 = 0;
flag = 0;
j = 0;
}
int strat()
{
while (1)
{
drawGame();
switch (KbHit())
{
case 4:ManUp(); break; //人向上运动
case 2:ManLeft(); break;//人向左运动
case 1:ManRight(); break;//人向右运动
case 3:ManDown(); break;//人向下运动
case 0:continue;
}
if (GameOver())
{
number++;
Sleep(1000);
}
if (number == 6)
break;
}
loadimage(&png[7], _T("D:\\1.jpg"), 10 * SPACE, 10 * SPACE);
putimage(0, 0, &png[7]);
settextcolor(BLUE);
setbkmode(TRANSPARENT);
outtextxy(280, 290, _T("通关"));
Sleep(10000);
return 0;
}
void draw_shape(int j)//实现功能
{
MOUSEMSG m;
flag = 0;
while (1)
{
m = GetMouseMsg();//获取鼠标信息
x = m.x, y = m.y;
if (m.y >= 0 && m.y < 100)//判断鼠标是否在可域内
{
break;
}
if (m.uMsg == WM_LBUTTONDOWN)//判断鼠标是否按下
{
if (flag == 0)
{
x1 = m.x;
y1 = m.y;
flag = 1;
}
}
else if (m.uMsg == WM_LBUTTONUP && flag == 1)//判断鼠标是否弹起
{
x2 = m.x;
y2 = m.y;
if (j == 2)
{
//开始执行
strat();
}
if (j == 3)
{
cleardevice();//清屏
}
flag = 0;
}
}
}
//实现闪烁
void mouse_kbhit()
{
MOUSEMSG m;// 定义消息变量
while (true)
{
m = GetMouseMsg();// 获取一条鼠标或按键消息
if (m.uMsg == WM_LBUTTONDOWN)//判断鼠标点击位置
{
if (m.x >= 160 && m.x <= 330 && m.y >= 270 && m.y <= 350)
{
j = 2;
setfillcolor(RED); //设置实心颜色为红
solidrectangle(160, 270, 330, 350);//画一个实心的矩形
setfillcolor(WHITE); //设置实心颜色为白
solidrectangle(160, 270, 330, 350);//画一个实心矩形
setbkmode(TRANSPARENT); //字符透明
settextcolor(RGB(97, 274, 255));
outtextxy(180, 290, L"开始");
Sleep(100);
setfillcolor(RED); //设置实心颜色为红
solidrectangle(160, 270, 330, 350);//画一个实心矩形
setcolor(WHITE);
rectangle(160, 270, 330, 350); //画一个矩形边框
outtextxy(180, 290, L"开始");
// draw_shape(j);
if ( j=2)
{
draw_shape(j);
}
}
else if (m.x >= 160 && m.x <= 330 && m.y >= 370 && m.y <= 450)//清空
{
j = 3;
setfillcolor(RED);
solidrectangle(160, 370, 330, 450);
setfillcolor(WHITE);
solidrectangle(160, 370, 330, 450);
setbkmode(TRANSPARENT); //字符透明
settextcolor(RGB(97, 274, 255));
outtextxy(180, 390, L"退出");
Sleep(100);
setfillcolor(RED);
solidrectangle(160, 370, 330, 450);
setcolor(WHITE);
rectangle(160, 370, 330, 450); //画一个矩形边框
outtextxy(180, 390, L"退出");
// draw_shape(j);
if ( j=3)//清空
{
draw_shape(j);
}
}
}
}
}
};
//"direction.h"
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<graphics.h>
#include<stdbool.h>
//播放音乐需要的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#include"map.h"
//********************************************人向上移动
void ManUp()
{
//先找到人的位置
int i, j;
for (i = 0; i < 10; i++)
{
int flag = 0;
for (j = 0; j < 10; j++)
{
if (map[number][i][j] == 3 || map[number][i][j] == 6)
{
flag = 1;
break;
}
}
if (flag==1)
break;
}
//人的位置是map[number][i][j];
//改变人的方向
//人的位置是空地
if (map[number][i][j] == 3)
{
//***********人的上面是空地
if (map[number][i + 1][j] == 0)
{
map[number][i][j] = 0;
map[number][i + 1][j] = 3;
}
//************人的上面是目的地
else if (map[number][i + 1][j] == 2)
{
map[number][i][j] = 0;
map[number][i + 1][j] = 6;
}
//*************人的上面是箱子
else if (map[number][i + 1][j] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i + 2][j] == 2)
{
map[number][i][j] = 0;
map[number][i + 1][j] = 3;
map[number][i + 2][j] = 5;
}
//2,************箱子上面是空地
else if (map[number][i + 2][j] == 0)
{
map[number][i][j] = 0;
map[number][i + 1][j] = 3;
map[number][i + 2][j] = 4;
}
}
}
//人的位置是目的地
else if (map[number][i][j] == 6)
{
//***********人的上面是空地
if (map[number][i + 1][j] == 0)
{
map[number][i][j] = 2;
map[number][i + 1][j] = 3;
}
//************人的上面是目的地
else if (map[number][i + 1][j] == 2)
{
map[number][i][j] = 2;
map[number][i + 1][j] = 6;
}
//*************人的上面是箱子
else if (map[number][i + 1][j] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i + 2][j] == 2)
{
map[number][i][j] = 2;
map[number][i + 1][j] = 3;
map[number][i + 2][j] = 5;
}
//2,************箱子上面是空地
else if (map[number][i + 2][j] == 0)
{
map[number][i][j] = 2;
map[number][i + 1][j] = 3;
map[number][i + 2][j] = 4;
}
}
}
}
//********************************************人向右移动
void ManRight()
{
//先找到人的位置
int i, j;
for (i = 0; i < 10; i++)
{
int flag = 0;
for (j = 0; j < 10; j++)
if (map[number][i][j] == 3 || map[number][i][j] == 6)
{
flag = 1;
break;
}
if (flag)
break;
}
//人的位置是map[number][i][j];
//改变人的方向
//人的位置是空地
if (map[number][i][j] == 3)
{
//***********人的右面是空地
if (map[number][i][j + 1] == 0)
{
map[number][i][j] = 0;
map[number][i][j + 1] = 3;
}
//************人的右面是目的地
else if (map[number][i][j + 1] == 2)
{
map[number][i][j] = 0;
map[number][i][j + 1] = 6;
}
//*************人的右面是箱子
else if (map[number][i][j + 1] == 4)
{
//1,***********箱子右面是目的地
if (map[number][i][j + 2] == 2)
{
map[number][i][j] = 0;
map[number][i][j + 1] = 3;
map[number][i][j + 2] = 5;
}
//2,************箱子右面是空地
else if (map[number][i][j + 2] == 0)
{
map[number][i][j] = 0;
map[number][i][j + 1] = 3;
map[number][i][j + 2] = 4;
}
//3,*************箱子右面是。。。。。
}
}
//人的位置是目的地
else if (map[number][i][j] == 6)
{
//***********人的右面是空地
if (map[number][i][j + 1] == 0)
{
map[number][i][j] = 2;
map[number][i][j + 1] = 3;
}
//************人的右面是目的地
else if (map[number][i][j + 1] == 2)
{
map[number][i][j] = 2;
map[number][i][j + 1] = 6;
}
//*************人的右面是箱子
else if (map[number][i][j + 1] == 4)
{
//1,***********箱子右面是目的地
if (map[number][i][j + 2] == 2)
{
map[number][i][j] = 2;
map[number][i][j + 1] = 3;
map[number][i][j + 2] = 5;
}
//2,************箱子右面是空地
else if (map[number][i][j + 2] == 0)
{
map[number][i][j] = 2;
map[number][i][j + 1] = 3;
map[number][i][j + 2] = 4;
}
//3,*************箱子右面是。。。。。
}
}
}
//********************************************人向左移动
void ManLeft()
{
//先找到人的位置
int i, j;
for (i = 0; i < 10; i++)
{
int flag = 0;
for (j = 0; j < 10; j++)
if (map[number][i][j] == 3 || map[number][i][j] == 6)
{
flag = 1;
break;
}
if (flag)break;
}
//人的位置是map[number][i][j];
//改变人的方向
//人的位置是空地
if (map[number][i][j] == 3)
{
//***********人的左面是空地
if (map[number][i][j - 1] == 0)
{
map[number][i][j] = 0;
map[number][i][j - 1] = 3;
}
//************人的左面是目的地
else if (map[number][i][j - 1] == 2)
{
map[number][i][j] = 0;
map[number][i][j - 1] = 6;
}
//*************人的左面是箱子
else if (map[number][i][j - 1] == 4)
{
//1,***********箱子左面是目的地
if (map[number][i][j - 2] == 2)
{
map[number][i][j] = 0;
map[number][i][j - 1] = 3;
map[number][i][j - 2] = 5;
}
//2,************箱子左面是空地
else if (map[number][i][j - 2] == 0)
{
map[number][i][j] = 0;
map[number][i][j - 1] = 3;
map[number][i][j - 2] = 4;
}
}
}
//人的位置是目的地
else if (map[number][i][j] == 6)
{
//***********人的上面是空地
if (map[number][i][j - 1] == 0)
{
map[number][i][j] = 2;
map[number][i][j - 1] = 3;
}
//************人的上面是目的地
else if (map[number][i][j - 1] == 2)
{
map[number][i][j] = 2;
map[number][i][j - 1] = 6;
}
//*************人的上面是箱子
else if (map[number][i][j - 1] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i][j - 2] == 2)
{
map[number][i][j] = 2;
map[number][i][j - 1] = 3;
map[number][i][j - 2] = 5;
}
//2,************箱子上面是空地
else if (map[number][i][j - 2] == 0)
{
map[number][i][j] = 2;
map[number][i][j - 1] = 3;
map[number][i][j - 2] = 4;
}
}
}
}
//********************************************人向下移动
void ManDown()
{
//先找到人的位置
int i, j;
for (i = 0; i < 10; i++)
{
int flag = 0;
for (j = 0; j < 10; j++)
if (map[number][i][j] == 3 || map[number][i][j] == 6)
{
flag = 1;
break;
}
if (flag)
break;
}
//人的位置是map[number][i][j];
//改变人的方向
//人的位置是空地
if (map[number][i][j] == 3)
{
//***********人的下面是空地
if (map[number][i - 1][j] == 0)
{
map[number][i][j] = 0;
map[number][i - 1][j] = 3;
}
//************人的上面是目的地
else if (map[number][i - 1][j] == 2)
{
map[number][i][j] = 0;
map[number][i - 1][j] = 6;
}
//*************人的上面是箱子
else if (map[number][i - 1][j] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i - 2][j] == 2)
{
map[number][i][j] = 0;
map[number][i - 1][j] = 3;
map[number][i - 2][j] = 5;
}
//2,************箱子上面是空地
else if (map[number][i - 2][j] == 0)
{
map[number][i][j] = 0;
map[number][i - 1][j] = 3;
map[number][i - 2][j] = 4;
}
}
}
//人的位置是目的地
else if (map[number][i][j] == 6)
{
//***********人的上面是空地
if (map[number][i - 1][j] == 0)
{
map[number][i][j] = 2;
map[number][i - 1][j] = 3;
}
//************人的上面是目的地
else if (map[number][i - 1][j] == 2)
{
map[number][i][j] = 2;
map[number][i - 1][j] = 6;
}
//*************人的上面是箱子
else if (map[number][i - 1][j] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i - 2][j] == 2)
{
map[number][i][j] = 2;
map[number][i - 1][j] = 3;
map[number][i - 2][j] = 5;
}
//2,************箱子上面是空地
else if (map[number][i - 2][j] == 0)
{
map[number][i][j] = 2;
map[number][i - 1][j] = 3;
map[number][i - 2][j] = 4;
}
}
}
}
//.cpp
#include"map.h"
#include"direction.h"
#include"carry.h"
#define SND_FILMNAME
//声明函数区
//************************************************************
//画出地图
void DrawMap(int n);
void drawGame();
void initscreen();//加载界面
//判断按键操作
void draw_picture();//背景图
void draw_bkcolor();//设置背景
int KbHit();//判断方向
//方向
void ManUp();
void ManRight();
void ManLeft();
void ManDown();
int GameOver();//结束游戏
//*******************************************************
//设置窗口大小
void initscreen()
{
initgraph(10 * SPACE, 10 * SPACE);
setbkcolor(WHITE);//设置面板颜色
cleardevice();
//0表示空地 , 1表示墙 , 2代表目的地, 3代表人, 4代表箱子
//5箱子与目的地重合, 6人站在目的地
loadimage(&png[0], _T("D:\\0.jpg"), SPACE, SPACE);
loadimage(&png[1], _T("D:\\1.jpg"), SPACE, SPACE);
loadimage(&png[2], _T("D:\\2.jpg"), SPACE, SPACE);
loadimage(&png[3], _T("D:\\3.jpg"), SPACE, SPACE);
loadimage(&png[4], _T("D:\\4.jpg"), SPACE, SPACE);
loadimage(&png[5], _T("D:\\5.jpg"), SPACE, SPACE);
loadimage(&png[6], _T("D:\\6.jpg"), SPACE, SPACE);
}
void draw_bkcolor()//设置背景
{
setfillcolor(0xAAAA00);
fillroundrect(120, 150, 360, 200, 30, 10);
settextcolor(BLUE);
setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
settextstyle(40, 30, _T("宋体"));
outtextxy(140, 160, _T("推箱子"));
setfillcolor(RED);
fillroundrect(160, 270, 330, 350, 30, 10);//设置圆角填充矩形(开始按钮)
settextcolor(BLUE);
setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
settextstyle(40, 30, _T("宋体"));
outtextxy(180, 290, _T("开始"));
setfillcolor(RED);
fillroundrect(160, 370, 330, 450, 30, 10);
settextcolor(BLUE);
setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
settextstyle(40, 30, _T("宋体"));
outtextxy(180, 390, _T("退出"));
}
void draw_picture()//背景图
{
IMAGE imag;
loadimage(&imag, _T("D:\\as.jpg"), 0, 0);
Resize(NULL, imag.getwidth(), imag.getheight());
putimage(0, 0, &imag);
}
int main()
{
initscreen();
draw_picture();//背景图
draw_bkcolor();//设置背景
//播放音乐
mciSendString(_T("open misck.wav.mp3 alias bkmusic"), NULL, 0, NULL);//播放音乐
mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL);//重复播放
Execute execute;//执行
execute. mouse_kbhit();//按钮
system("pause");
return 0;
}
一,界面设计
界面设计主要应用loadimage读取图片文件和putimage在当前绘图设备上绘制指定图像。
设计界面时可以先设计背景以及旋钮的位置,然后将对应的功能添加。
背景设计之后添加对应功能,将功能与界面相连接需通过鼠标和按键来传递信息,这里就需要处理信息的函数。
清空鼠标消息缓冲区。 | |
GetMouseMsg | 获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。 |
PeekMouseMsg | 获取一个鼠标消息,并立即返回。 |
MouseHit | 检测当前是否有鼠标消息。 |
MOUSEMSG | 保存鼠标消息的结构体。 |
鼠标按键以及移动的控制信息
WM_MOUSEMOVE | 鼠标移动消息。 |
WM_MOUSEWHEEL | 鼠标滚轮拨动消息。 |
WM_LBUTTONDOWN | 左键按下消息。 |
WM_LBUTTONUP | 左键弹起消息。 |
WM_LBUTTONDBLCLK | 左键双击消息。 |
WM_MBUTTONDOWN | 中键按下消息。 |
WM_MBUTTONUP | 中键弹起消息。 |
WM_MBUTTONDBLCLK | 中键双击消息。 |
WM_RBUTTONDOWN | 右键按下消息。 |
WM_RBUTTONUP | 右键弹起消息。 |
WM_RBUTTONDBLCLK | 右键双击消息。 |
mkCtrl
实例:
void draw_bkcolor()//设置背景
{
setfillcolor(0xAAAA00);//红色
fillroundrect(120, 150, 360, 200, 30, 10);
settextcolor(BLUE);
setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
settextstyle(40, 30, _T("宋体"));
outtextxy(140, 160, _T("推箱子"));
setfillcolor(RED);
fillroundrect(160, 270, 330, 350, 30, 10);//设置圆角填充矩形(开始按钮)
settextcolor(BLUE);
setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
settextstyle(40, 30, _T("宋体"));
outtextxy(180, 290, _T("开始"));
setfillcolor(RED);
fillroundrect(160, 370, 330, 450, 30, 10);
settextcolor(BLUE);
setbkmode(TRANSPARENT);//指定图案填充和文字输出时的背景模式
settextstyle(40, 30, _T("宋体"));
outtextxy(180, 390, _T("退出"));
}
void draw_picture()//背景图
{
IMAGE imag;
loadimage(&imag, _T("D:\\as.jpg"), 0, 0);
Resize(NULL, imag.getwidth(), imag.getheight());
putimage(0, 0, &imag);
}
//执行类
class Execute {
private:
int x;
int y;
int flag;
int x1, y1, x2, y2;
int j;
public:
Execute() {
x = 0;
y = 0;
x1 = 0; y1 = 0; x2 = 0; y2 = 0;
flag = 0;
j = 0;
}
int strat()
{
while (1)
{
drawGame();
switch (KbHit())
{
case 4:ManUp(); break; //人向上运动
case 2:ManLeft(); break;//人向左运动
case 1:ManRight(); break;//人向右运动
case 3:ManDown(); break;//人向下运动
case 0:continue;
}
if (GameOver())
{
number++;
Sleep(1000);
}
if (number == 6)
break;
}
loadimage(&png[7], _T("D:\\1.jpg"), 10 * SPACE, 10 * SPACE);
putimage(0, 0, &png[7]);
settextcolor(BLUE);
setbkmode(TRANSPARENT);
outtextxy(280, 290, _T("通关"));
Sleep(10000);
return 0;
}
void draw_shape(int j)//实现功能
{
MOUSEMSG m;
flag = 0;
while (1)
{
m = GetMouseMsg();//获取鼠标信息
x = m.x, y = m.y;
if (m.y >= 0 && m.y < 100)//判断鼠标是否在可域内
{
break;
}
if (m.uMsg == WM_LBUTTONDOWN)//判断鼠标是否按下
{
if (flag == 0)
{
x1 = m.x;
y1 = m.y;
flag = 1;
}
}
else if (m.uMsg == WM_LBUTTONUP && flag == 1)//判断鼠标是否弹起
{
x2 = m.x;
y2 = m.y;
if (j == 2)
{
//开始执行
strat();
}
if (j == 3)
{
cleardevice();//清屏
}
flag = 0;
}
}
}
//实现闪烁
void mouse_kbhit()
{
MOUSEMSG m;// 定义消息变量
while (true)
{
m = GetMouseMsg();// 获取一条鼠标或按键消息
if (m.uMsg == WM_LBUTTONDOWN)//判断鼠标点击位置
{
if (m.x >= 160 && m.x <= 330 && m.y >= 270 && m.y <= 350)
{
j = 2;
setfillcolor(RED); //设置实心颜色为红
solidrectangle(160, 270, 330, 350);//画一个实心的矩形
setfillcolor(WHITE); //设置实心颜色为白
solidrectangle(160, 270, 330, 350);//画一个实心矩形
setbkmode(TRANSPARENT); //字符透明
settextcolor(RGB(97, 274, 255));
outtextxy(180, 290, L"开始");
Sleep(100);
setfillcolor(RED); //设置实心颜色为红
solidrectangle(160, 270, 330, 350);//画一个实心矩形
setcolor(WHITE);
rectangle(160, 270, 330, 350); //画一个矩形边框
outtextxy(180, 290, L"开始");
// draw_shape(j);
if ( j=2)
{
draw_shape(j);
}
}
else if (m.x >= 160 && m.x <= 330 && m.y >= 370 && m.y <= 450)//清空
{
j = 3;
setfillcolor(RED);
solidrectangle(160, 370, 330, 450);
setfillcolor(WHITE);
solidrectangle(160, 370, 330, 450);
setbkmode(TRANSPARENT); //字符透明
settextcolor(RGB(97, 274, 255));
outtextxy(180, 390, L"退出");
Sleep(100);
setfillcolor(RED);
solidrectangle(160, 370, 330, 450);
setcolor(WHITE);
rectangle(160, 370, 330, 450); //画一个矩形边框
outtextxy(180, 390, L"退出");
// draw_shape(j);
if ( j=3)//清空
{
draw_shape(j);
}
}
}
}
}
};
二,地图加载
用一个三维数组表示地图,用mapmany来表示地图的数量(游戏关卡),后面的二位数组排列平面地图,
//定义当前关卡
int number = 0;//初始化位第0张地图
//格子边长
#define SPACE 60
//6.3.1 定义变量
IMAGE png[12];//5张图,定义5个变量,定义一个数组
#define MapMany 6
//枚举方向
enum CH {
right = 1,
left = 2,
up = 3,
down = 4
}ch;
//定义一个全局三维数组
//0表示空地, 1表示墙, 2代表目的地, 3代表人站在空地上, 4代表箱子,
//5箱子与目的地重合, 6,人站在目的地上,
//下面定义地图
int map[MapMany][10][10] = {
//图一
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 2, 0, 1, 1, 0, 0, 0, 2, 1 },
{ 1, 0, 0, 1, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 1, 1, 0, 4, 1 },
{ 1, 0, 0, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
{ 1, 4, 0, 0, 0, 0, 0, 3, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图二
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 2, 0, 0, 0, 4, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
{ 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 0, 3, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 2, 0, 0, 4, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图三
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 2, 0, 1, 0, 0, 3, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 4, 0, 1, 1, 1, 1, 0, 0, 1 },
{ 1, 0, 0, 1, 1, 0, 0, 0, 4, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 4, 0, 1, 0, 0, 1 },
{ 1, 2, 0, 0, 0, 0, 1, 0, 2, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图四
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图五
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
},
//图六
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
}
};
三,地图刷新
地图的刷新主要是人物移动之后,地图中的物件开始更新位置。
人物移动,刷新地图。首先在地图中找到人的位置
人后判断人周围的环境状况,当人物移动之后将移动后的位置更新为人的位置,将之前的人的位置更新为空地。当人和箱子在一条线上时,人的位置更新的同时也更新箱子的位置,实现人推箱子移动的过程。
//地图刷新
//********************************************人向上移动
void ManUp()
{
//先找到人的位置
int i, j;
for (i = 0; i < 10; i++)
{
int flag = 0;
for (j = 0; j < 10; j++)
{
if (map[number][i][j] == 3 || map[number][i][j] == 6)
{
flag = 1;
break;
}
}
if (flag==1)
break;
}
//人的位置是map[number][i][j];
//改变人的方向
//人的位置是空地
if (map[number][i][j] == 3)
{
//***********人的上面是空地
if (map[number][i + 1][j] == 0)
{
map[number][i][j] = 0;
map[number][i + 1][j] = 3;
}
//************人的上面是目的地
else if (map[number][i + 1][j] == 2)
{
map[number][i][j] = 0;
map[number][i + 1][j] = 6;
}
//*************人的上面是箱子
else if (map[number][i + 1][j] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i + 2][j] == 2)
{
map[number][i][j] = 0;
map[number][i + 1][j] = 3;
map[number][i + 2][j] = 5;
}
//2,************箱子上面是空地
else if (map[number][i + 2][j] == 0)
{
map[number][i][j] = 0;
map[number][i + 1][j] = 3;
map[number][i + 2][j] = 4;
}
}
}
//人的位置是目的地
else if (map[number][i][j] == 6)
{
//***********人的上面是空地
if (map[number][i + 1][j] == 0)
{
map[number][i][j] = 2;
map[number][i + 1][j] = 3;
}
//************人的上面是目的地
else if (map[number][i + 1][j] == 2)
{
map[number][i][j] = 2;
map[number][i + 1][j] = 6;
}
//*************人的上面是箱子
else if (map[number][i + 1][j] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i + 2][j] == 2)
{
map[number][i][j] = 2;
map[number][i + 1][j] = 3;
map[number][i + 2][j] = 5;
}
//2,************箱子上面是空地
else if (map[number][i + 2][j] == 0)
{
map[number][i][j] = 2;
map[number][i + 1][j] = 3;
map[number][i + 2][j] = 4;
}
}
}
}
//********************************************人向右移动
void ManRight()
{
//先找到人的位置
int i, j;
for (i = 0; i < 10; i++)
{
int flag = 0;
for (j = 0; j < 10; j++)
if (map[number][i][j] == 3 || map[number][i][j] == 6)
{
flag = 1;
break;
}
if (flag)
break;
}
//人的位置是map[number][i][j];
//改变人的方向
//人的位置是空地
if (map[number][i][j] == 3)
{
//***********人的右面是空地
if (map[number][i][j + 1] == 0)
{
map[number][i][j] = 0;
map[number][i][j + 1] = 3;
}
//************人的右面是目的地
else if (map[number][i][j + 1] == 2)
{
map[number][i][j] = 0;
map[number][i][j + 1] = 6;
}
//*************人的右面是箱子
else if (map[number][i][j + 1] == 4)
{
//1,***********箱子右面是目的地
if (map[number][i][j + 2] == 2)
{
map[number][i][j] = 0;
map[number][i][j + 1] = 3;
map[number][i][j + 2] = 5;
}
//2,************箱子右面是空地
else if (map[number][i][j + 2] == 0)
{
map[number][i][j] = 0;
map[number][i][j + 1] = 3;
map[number][i][j + 2] = 4;
}
//3,*************箱子右面是。。。。。
}
}
//人的位置是目的地
else if (map[number][i][j] == 6)
{
//***********人的右面是空地
if (map[number][i][j + 1] == 0)
{
map[number][i][j] = 2;
map[number][i][j + 1] = 3;
}
//************人的右面是目的地
else if (map[number][i][j + 1] == 2)
{
map[number][i][j] = 2;
map[number][i][j + 1] = 6;
}
//*************人的右面是箱子
else if (map[number][i][j + 1] == 4)
{
//1,***********箱子右面是目的地
if (map[number][i][j + 2] == 2)
{
map[number][i][j] = 2;
map[number][i][j + 1] = 3;
map[number][i][j + 2] = 5;
}
//2,************箱子右面是空地
else if (map[number][i][j + 2] == 0)
{
map[number][i][j] = 2;
map[number][i][j + 1] = 3;
map[number][i][j + 2] = 4;
}
//3,*************箱子右面是。。。。。
}
}
}
//********************************************人向左移动
void ManLeft()
{
//先找到人的位置
int i, j;
for (i = 0; i < 10; i++)
{
int flag = 0;
for (j = 0; j < 10; j++)
if (map[number][i][j] == 3 || map[number][i][j] == 6)
{
flag = 1;
break;
}
if (flag)break;
}
//人的位置是map[number][i][j];
//改变人的方向
//人的位置是空地
if (map[number][i][j] == 3)
{
//***********人的左面是空地
if (map[number][i][j - 1] == 0)
{
map[number][i][j] = 0;
map[number][i][j - 1] = 3;
}
//************人的左面是目的地
else if (map[number][i][j - 1] == 2)
{
map[number][i][j] = 0;
map[number][i][j - 1] = 6;
}
//*************人的左面是箱子
else if (map[number][i][j - 1] == 4)
{
//1,***********箱子左面是目的地
if (map[number][i][j - 2] == 2)
{
map[number][i][j] = 0;
map[number][i][j - 1] = 3;
map[number][i][j - 2] = 5;
}
//2,************箱子左面是空地
else if (map[number][i][j - 2] == 0)
{
map[number][i][j] = 0;
map[number][i][j - 1] = 3;
map[number][i][j - 2] = 4;
}
}
}
//人的位置是目的地
else if (map[number][i][j] == 6)
{
//***********人的上面是空地
if (map[number][i][j - 1] == 0)
{
map[number][i][j] = 2;
map[number][i][j - 1] = 3;
}
//************人的上面是目的地
else if (map[number][i][j - 1] == 2)
{
map[number][i][j] = 2;
map[number][i][j - 1] = 6;
}
//*************人的上面是箱子
else if (map[number][i][j - 1] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i][j - 2] == 2)
{
map[number][i][j] = 2;
map[number][i][j - 1] = 3;
map[number][i][j - 2] = 5;
}
//2,************箱子上面是空地
else if (map[number][i][j - 2] == 0)
{
map[number][i][j] = 2;
map[number][i][j - 1] = 3;
map[number][i][j - 2] = 4;
}
}
}
}
//********************************************人向下移动
void ManDown()
{
//先找到人的位置
int i, j;
for (i = 0; i < 10; i++)
{
int flag = 0;
for (j = 0; j < 10; j++)
if (map[number][i][j] == 3 || map[number][i][j] == 6)
{
flag = 1;
break;
}
if (flag)
break;
}
//人的位置是map[number][i][j];
//改变人的方向
//人的位置是空地
if (map[number][i][j] == 3)
{
//***********人的下面是空地
if (map[number][i - 1][j] == 0)
{
map[number][i][j] = 0;
map[number][i - 1][j] = 3;
}
//************人的上面是目的地
else if (map[number][i - 1][j] == 2)
{
map[number][i][j] = 0;
map[number][i - 1][j] = 6;
}
//*************人的上面是箱子
else if (map[number][i - 1][j] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i - 2][j] == 2)
{
map[number][i][j] = 0;
map[number][i - 1][j] = 3;
map[number][i - 2][j] = 5;
}
//2,************箱子上面是空地
else if (map[number][i - 2][j] == 0)
{
map[number][i][j] = 0;
map[number][i - 1][j] = 3;
map[number][i - 2][j] = 4;
}
}
}
//人的位置是目的地
else if (map[number][i][j] == 6)
{
//***********人的上面是空地
if (map[number][i - 1][j] == 0)
{
map[number][i][j] = 2;
map[number][i - 1][j] = 3;
}
//************人的上面是目的地
else if (map[number][i - 1][j] == 2)
{
map[number][i][j] = 2;
map[number][i - 1][j] = 6;
}
//*************人的上面是箱子
else if (map[number][i - 1][j] == 4)
{
//1,***********箱子上面是目的地
if (map[number][i - 2][j] == 2)
{
map[number][i][j] = 2;
map[number][i - 1][j] = 3;
map[number][i - 2][j] = 5;
}
//2,************箱子上面是空地
else if (map[number][i - 2][j] == 0)
{
map[number][i][j] = 2;
map[number][i - 1][j] = 3;
map[number][i - 2][j] = 4;
}
}
}
}