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>
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") 静态库资源
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;
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;
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();
keyDownAI();
Sleep(50);
}
closegraph();
return 0;
}