2020.10.16 第17节课 图形化中级篇

2020.10.16 第17节课 图形化中级篇

一、基本贴图

1.为图片起一个名字?

类型 变量名;

int iNum;

IMAGE mm;

2.把名字和相关图片建立联系

loadimage(&mm,“图片路径”);

loadimage(&mm,“图片路径”,int w,int h); 缩放为

3.显示图片

putimage(int x,int y,IMAGE *mm);

#include  <graphics.h>
	1.为图片起一个名字?
		类型 变量名;
		int  iNum;
		IMAGE mm;
	2.把名字和相关图片建立联系
		loadimage(&mm,"图片路径");
		loadimage(&mm,"图片路径",int w,int h);
	3.显示图片
		putimage(int x,int y,IMAGE *mm);
int main() 
{
	initgraph(800, 800);
	IMAGE mm;
    //加载的时候缩放
	loadimage(&mm, "mm.jpg",800,800);
	putimage(0, 0, &mm);
	while (1);
	closegraph();
	return 0;
}

二、鼠标操作

1.鼠标消息存放鼠标变量中

2.如何获取鼠标消息

3.分类讨论 m.uMsg;

#include <graphics.h>
/*
	1.鼠标消息存放鼠标变量中
	MOUSEMSG  mouse message
	struct MOUSEMSG
	{
		UINT uMsg;				// 当前鼠标消息	//通过这个去了解鼠标消息的类型
		bool mkCtrl;			// Ctrl 键是否按下
		bool mkShift;			// Shift 键是否按下
		bool mkLButton;			// 鼠标左键是否按下
		bool mkMButton;			// 鼠标中键是否按下
		bool mkRButton;			// 鼠标右键是否按下
		short x;				// 当前鼠标 x 坐标
		short y;				// 当前鼠标 y 坐标
		short wheel;			// 鼠标滚轮滚动值 (120 的倍数)
	};
	2.如何获取鼠标消息
		GetMouseMsg();
		MOUSEMSG m=GetMouseMsg();
	3.分类讨论 m.uMsg;
		鼠标消息的类型
		窗口    消息     鼠标  移动
		window message  mouse move
		WM_MOUSEMOVE:  
		L:left R:right
		BUTTON: 按钮
		DOWN: 往下 按下
		UP: 往上 弹起
		WM_LBUTTONDOWN:
		WM_RBUTTONDOWN:
	案例:
		左键画圆 右键画方
*/

int main() 
{
	initgraph(600, 600);
	while (1) 
	{
		MOUSEMSG m = GetMouseMsg();
		switch (m.uMsg) 
		{
		case WM_LBUTTONDOWN:
			circle(m.x, m.y, 10);
			break;
		case WM_RBUTTONDOWN:
			rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);
			break;
		}
	}
	closegraph();
	return 0;
}

三、自绘按钮 与 音乐播放

#include <graphics.h>
#include <string.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib") 静态库资源
/*
	micSendString("指令",0,0,0);
	指令: 
	  基本指令
		1.open  音乐路径  酷狗下载
		2.play 播放
		3.stop
		4.close
		5.resume
		6.pause
	  修饰:
		wait
		repeat
*/
//1.抽象按钮的共同属性
struct Button 
{
	int x;			//左上角坐标
	int y;
	int width;		//按钮的宽和高
	int height;
	int dx;			//文字相对于按钮左上角的偏移值
	int dy;
	char* text;		//按钮的文字
	COLORREF color;
};

//创建按钮
struct Button* createButton(int x,int y,int width,int height,int dx,
	int dy,const char* text,COLORREF color) 
{
	struct Button* pButton = (struct Button*)malloc(sizeof(struct Button));
	pButton->x = x;
	pButton->y = y;
	pButton->width = width;
	pButton->height = height;
	pButton->dx = dx;
	pButton->dy = dy;
	pButton->text = (char*)malloc(strlen(text) + 1);
	strcpy(pButton->text, text);
	pButton->color = color;
	return pButton;
}
void drawButton(struct Button* pButton) 
{
	setfillcolor(pButton->color);
	settextcolor(BLACK);
	settextstyle(25, 0, "楷体");
	fillrectangle(pButton->x, pButton->y, pButton->x + pButton->width, pButton->y + pButton->height);
	settextcolor(RED);
	setbkmode(TRANSPARENT);
	outtextxy(pButton->x+pButton->dx, pButton->y+pButton->dy, pButton->text);
}
//判断鼠标是否在按钮中
int mouseInButton(struct Button* pButton,MOUSEMSG m) 
{
	if (m.x >= pButton->x && m.x <= pButton->x + pButton->width 
		&& m.y >= pButton->y && m.y <= pButton->y + pButton->height) 
	{
		pButton->color = LIGHTBLUE;
		return 1;
	}
	pButton->color = YELLOW;
	return 0;
}

int main() 
{
	initgraph(500, 375);
	IMAGE mm;
	loadimage(&mm, "mm.jpg", 500, 375);
	struct Button* play = createButton(200, 100, 120, 35, 10, 8, "播放游戏", YELLOW);
	struct Button* close = createButton(200, 140, 120, 35, 10, 8, "关闭音乐", YELLOW);
	struct Button* end = createButton(200, 180, 120, 35, 10, 8, "退出程序", YELLOW);
	while (1) 
	{
		BeginBatchDraw();
		putimage(0, 0, &mm);刷新不需要了
		drawButton(play);
		drawButton(close);
		drawButton(end);
		MOUSEMSG m = GetMouseMsg();	//定义的鼠标变量
		if (mouseInButton(play,m)&&m.uMsg==WM_LBUTTONDOWN)
		{
			mciSendString("open 1.mp3", 0, 0, 0);
			mciSendString("play 1.mp3 repeat", 0, 0, 0);
		}
		if (mouseInButton(close, m)&&m.uMsg==WM_LBUTTONDOWN)
		{
			mciSendString("close 1.mp3", 0, 0, 0);
		}
		if (mouseInButton(end, m) && m.uMsg == WM_LBUTTONDOWN) 
		{
			exit(0);
		}
		Sleep(50);
		EndBatchDraw();
	}
	closegraph();
	return 0;
}

四、贪吃蛇游戏

/*
	贪吃蛇:
		蛇 
		食物
*/
#include <graphics.h>
#include <time.h>
#include <conio.h>
struct XY 
{
	int x;
	int y;
};
struct Snake 
{
	struct XY xy[100];
	int size;
	int dir;
};
enum direction {DOWN,UP,RIGHT,LEFT};
struct Snake mySnake;
struct Food 
{
	struct XY xy;
	int flag;
};
struct Food food;

void initSanke() 
{
	mySnake.size = 1;
	mySnake.xy[0].x = 0;
	mySnake.xy[0].y = 0;
	mySnake.dir = RIGHT;
	for (int i = 1; i < 100; i++) 
	{
		mySnake.xy[i].x = -100;
		mySnake.xy[i].y = -100;
	}

}
void drawSnake() 
{
	for (int i = 0; i < mySnake.size; i++) 
	{
		setlinecolor(BLACK);
		setfillcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
		fillrectangle(mySnake.xy[i].x, mySnake.xy[i].y, mySnake.xy[i].x + 10, mySnake.xy[i].y + 10);
	}
}
void moveSnake() 
{
	//蛇身的处理
	for (int i = mySnake.size - 1; i > 0; i--) 
	{
		mySnake.xy[i].x = mySnake.xy[i - 1].x;
		mySnake.xy[i].y = mySnake.xy[i - 1].y;
	}
	switch (mySnake.dir) 
	{
	case DOWN:
		mySnake.xy[0].y += 10;
		break;
	case UP:
		mySnake.xy[0].y -= 10;
		break;
	case RIGHT:
		mySnake.xy[0].x += 10;
		break;
	case LEFT:
		mySnake.xy[0].x -= 10;
		break;
	}
}
void keyDown() 
{
	char userKey = _getch();
	switch (userKey) 
	{
	case 'w':
	case 'W':
	case 72:
		if (mySnake.dir != DOWN)
			mySnake.dir = UP;
		break;
	case 's':
	case 'S':
	case 80:
		if (mySnake.dir != UP) 
		{
			mySnake.dir = DOWN;
		}
		break;
	case 'A':
	case 'a':
	case 75:
		if (mySnake.dir != RIGHT)
			mySnake.dir = LEFT;
		break;
	case 'D':
	case 'd':
	case 77:
		if (mySnake.dir != LEFT)
			mySnake.dir = RIGHT;
		break;
	}
}


void keyDownAI() 
{
	if (food.xy.x > mySnake.xy[0].x && mySnake.dir != LEFT) 
	{
		mySnake.dir = RIGHT;
	}
	else if (food.xy.x < mySnake.xy[0].x && mySnake.dir != RIGHT) 
	{
		mySnake.dir = LEFT;
	}
	else if (food.xy.y > mySnake.xy[0].y && mySnake.dir != UP) 
	{
		mySnake.dir = DOWN;
	}
	else if (food.xy.y < mySnake.xy[0].y && mySnake.dir != DOWN)
	{
		mySnake.dir = UP;
	}
}

void initFood() 
{
	food.xy.x = rand() % 60 * 10 + 100;  //(100-700)
	food.xy.y = rand() % 60 * 10 + 100;
	//食物不能出现在蛇的身上
	while (1) 
	{
		int flag = 0;
		for (int i = 0; i < mySnake.size; i++)
		{
			if (mySnake.xy[i].x == food.xy.x || mySnake.xy[i].y == food.xy.y)
			{
				food.xy.x = rand() % 60 * 10 + 100;  //(100-700)
				food.xy.y = rand() % 60 * 10 + 100;
				flag = 1;
			}
		}
		if (flag == 0)
			break;
	}
	food.flag = 1;		//食物存在的标记
}
void drawFood() 
{
	setlinecolor(BLACK);
	setfillcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
	fillrectangle(food.xy.x, food.xy.y, food.xy.x + 10, food.xy.y + 10);
}
void eatFood() 
{
	if (mySnake.xy[0].x == food.xy.x && mySnake.xy[0].y == food.xy.y) 
	{
		mySnake.size++;
		food.flag = 0;
	}
}


int main() 
{
	srand((unsigned int)time(0));
	initgraph(800, 800);
	setbkcolor(WHITE);
	cleardevice();
	initSanke();
	while (1) 
	{
		cleardevice();
		if (food.flag == 0) 
		{
			initFood();
		}
		drawFood();
		drawSnake();
		moveSnake();
		eatFood();
		//if (_kbhit()) 
		//{
		//	keyDown();
		//}
		keyDownAI();
		Sleep(50);
	}
	closegraph();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值