Easyx-----c++实现虚拟空调,清凉一夏

 灵感来源:云空调,便携小空调-后记 

 common.h

#pragma once
#include <graphics.h>
#include <iostream>
#include <map>
#include <string>
using namespace std;

 c++空调.cpp

#include"DrawImg.h"
#include"res.h"
#include"button.h"
int main()
{
	Draw draw;
	Button* pp = new Button();		//按钮
	ExMessage msg;					//定义鼠标消息
	initgraph(900, 600);
	setbkcolor(WHITE);
	cleardevice();
	while (true)
	{
		while (peekmessage(&msg, EM_MOUSE))  //获取鼠标消息
		{

			pp->ClickButton(msg);	
		}    

		BeginBatchDraw();
		draw.GameDraw();					//绘制
		pp->draw();
		EndBatchDraw();
	}
}

 button.h

#pragma once
#include "common.h"
#include"DrawImg.h"
class Button
{
public:
	Button();
	void ClickButton(ExMessage msg);
	int& getTemp() { return tempCnt; }
	void draw();
protected:
	int tempCnt = 16;		//温度变量


	bool showWitch=false;	//开关
	bool showCool = false;
	bool showHot = false;
	bool showTempUp = false;	//温度
	bool showTempDown = false;

};

 button.cpp

#include "button.h"
#include"common.h"
#include"res.h"
Button::Button() {}
void Button::ClickButton(ExMessage msg)
{
	if (msg.message == WM_LBUTTONDOWN)
	{
		//开关
		if ((msg.x > 418 && msg.y >= 340) && (msg.x <= 488 && msg.y <= 410))
		{
			showWitch = !showWitch;
		}
		//冷
		if ((msg.x > 318 && msg.y >= 340) && (msg.x <= 388 && msg.y <= 410))
		{
			showCool = true;
			showHot = false;
			getTemp() = 16;
		}
		//热
		if ((msg.x > 520 && msg.y >= 340) && (msg.x <= 610 && msg.y <= 410))
		{
			showHot = true;
			showCool = false;
			getTemp() = 30;
		}
		//温度控制 上 温度从16度开始
		//int ge=6, shi=1;
		if ((msg.x > 418 && msg.y >= 420) && (msg.x <= 488 && msg.y <= 490))
		{
			showTempUp = true;
		}
		//温度控制 下
		if ((msg.x > 418 && msg.y >= 500) && (msg.x <= 488 && msg.y <= 570))
		{
			showTempDown = true;
		}
	}
}

void Button::draw()
{
	/*setlinecolor(RED);*/
	/*rectangle(418, 420, 488, 490);*/
		//开关
		if (showWitch)
		{
			    Res::DrawIMG(110, 235, "风", 1);
				Res::DrawIMG(0, 0, "空调", 1);
				Res::Draw_IMG(771, 86, to_string(getTemp() / 10 % 10) + "_");
				Res::Draw_IMG(795, 86, to_string(getTemp() % 10) + "_");
				Res::DrawIMG(788, 40, "标识", 1);
				Res::Draw_IMG(818, 86, "摄氏度");
				Res::DrawIMG(418, 340, "开关", 1);

				//冷
				if (showCool)
				{
					
					Res::DrawIMG(788, 40, "标识", 1);
					Res::Draw_IMG(818, 86, "摄氏度");
				}
				//热
				if (showHot)
				{
					Res::DrawIMG(788, 40, "标识", 0);
					Res::Draw_IMG(818, 86, "摄氏度");
				}
				//温度控制 上 温度从16度开始
				//int ge=6, shi=1;

				if (showTempUp && getTemp() <= 30)
				{
					getTemp()++;
					//Res::Draw_IMG(771, 86, to_string(getTemp() / 10 % 10) + "_");
					//Res::Draw_IMG(795, 86, to_string(getTemp() % 10) + "_");
					//Res::Draw_IMG(818, 86, "摄氏度");
					ge = getTemp() % 10;	//16%10==6 19%10==9  20%10==0 21%10==2 22%10==2
					shi = getTemp() / 10 % 10;
					showTempUp = false;
				}
				//温度控制 下
				if (showTempDown && getTemp() >= 17)
				{
					getTemp()--;
					//Res::Draw_IMG(771, 86, to_string(getTemp() / 10 % 10) + "_");
					//Res::Draw_IMG(795, 86, to_string(getTemp() % 10) + "_");
					//Res::Draw_IMG(818, 86, "摄氏度");
					showTempDown = false;
				}
		}		
}

 res.h

#pragma once
#include "common.h"
class Res
{
private:
	Res();
public:
	static int WIDTH(string name);
	static int HEIGHT(string name);
	static Res* GetInstance();
	static void Draw_IMG(int x, int y, string name);
	static void DrawIMG(int x, int y, string name, int preIndex);	 //图片绘制
	~Res();
public:
	static map<string, IMAGE*> img;					 //图片资源
};

 res.cpp

#include "res.h"
map<string, IMAGE*> Res::img;		//图片
/*———————————————————————————————————————————

         加载 和 初始化 图片相关内容

————————————————————————————————————————————*/
Res::Res()
{
	//空调
	string background[2] = { "./res/AirConditionerfir.png" ,"./res/AirConditionersec.png" };
	//风
	string blow[2] = { "./res/Blow0.png" ,"./res/Blow1.png"};
	//开关
	string switches[2] = {"./res/Open.png" ,"./res/Off.png"};
	//标识
	string flag[2] = { "./res/Sun.png","./res/Ice.png" };
	//冷热按钮
	string button[2] = { "./res/IceButton.png","./res/SunButton.png" };
	//温度按钮
	string temp[2] = { "./res/Up.png","./res/Down.png" };
	//摄氏度
	string C = "./res/number/temp.png";
	//温度 0-9
	for (int i = 0; i <= 9; i++) 
	{
		string init = "./res/number/";
		string strURY = "0";
		strURY[0] += i;
		strURY += "_1.png";
		strURY = init + strURY;
		img[to_string(i - 0) + "_"] = new IMAGE;		  //img["0_"]
		loadimage(img[to_string(i - 0) + "_"], strURY.c_str());
		//cout << strURL << endl;
	}
	img["空调"] = new IMAGE[2];
	img["风"] = new IMAGE[2];
	img["开关"] = new IMAGE[2];
	img["标识"] = new IMAGE[2];
	img["冷热按钮"] = new IMAGE[2];
	img["温度按钮"] = new IMAGE[2];
	img["摄氏度"] = new IMAGE;
	loadimage(img["摄氏度"] , C.data());
	for (int i = 0; i < 2; i++)
	{
		loadimage(img["空调"] + i, background[i].data());
	}
	for (int i = 0; i < 2; i++)
	{
		loadimage(img["风"] + i, blow[i].data());
	}
	for (int i = 0; i < 2; i++)
	{
		loadimage(img["开关"] + i, switches[i].data(), 70,70);
	}
	for (int i = 0; i < 2; i++)
	{
		loadimage(img["标识"] + i, flag[i].data());
	}
	for (int i = 0; i < 2; i++)
	{
		loadimage(img["冷热按钮"] + i, button[i].data(), 70, 70);
	}
	for (int i = 0; i < 2; i++)
	{
		loadimage(img["温度按钮"] + i, temp[i].data(), 70, 70);
	}
}
//获取图片的高度
int Res::WIDTH(string name)
{
	return GetInstance()->img[name]->getwidth();
}
int Res::HEIGHT(string name)
{
	return GetInstance()->img[name]->getheight();
}
Res* Res::GetInstance()
{
	static Res* res = new Res;
	return res;
}
//贴图 
void Res::Draw_IMG(int x, int y, string name)
{
	putimage(x, y, GetInstance()->img[name]);
}
void Res::DrawIMG(int x, int y, string name, int preIndex)
{
	putimage(x, y, GetInstance()->img[name] + preIndex);
}
Res::~Res()
{
	delete img["摄氏度"];
	delete[]img["空调"];
	delete[]img["风"];
	delete[]img["开关"];
	delete[]img["标识"];
	delete[]img["冷热按钮"];
	delete[]img["温度按钮"];
	for (int i = 0; i < 9; i++)
	{
		delete	img[to_string(i - 0)];
		delete	img[to_string(i - 0) + "y"];
	}
}

 DrawImg.h 

#pragma once
#include "common.h"
class Draw
{
public:
	void GameDraw();
	
};

  DrawImg.cpp

#include"res.h"
#include "DrawImg.h"
void Draw::GameDraw()
{
	Res::DrawIMG(0, 0, "空调",0);
	Res::DrawIMG(318, 340, "冷热按钮", 0);
	Res::DrawIMG(520, 340, "冷热按钮", 1);
	Res::DrawIMG(418, 340, "开关", 0);
	Res::DrawIMG(418, 420, "温度按钮", 0);
	Res::DrawIMG(418, 500, "温度按钮", 1);
	Res::DrawIMG(110, 235, "风", 0);
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Nicholl-Lee-Nicholl(NLN)算法是一种线段裁剪算法,用于在计算机图形学中将线段裁剪到指定的窗口或视口中。它是一种快速而有效的算法,通常用于实时应用程序。 以下是使用C++和EasyX图形库实现NLN算法的代码: ```cpp #include <graphics.h> #include <iostream> using namespace std; // 定义 NLN 算法所需的几个数据结构 struct Point { int x; int y; }; struct Edge { Point p1; Point p2; float dx; float dy; }; struct Window { int left; int top; int right; int bottom; }; // 定义 NLN 算法函数 void NLN(Edge edge, Window window) { float t1 = 0, t2 = 1; float dx = edge.dx; float dy = edge.dy; // 判断线段是否在窗口内 if (dx == 0) { if ((edge.p1.x < window.left) || (edge.p1.x > window.right)) return; } else { float m = dy / dx; float c = edge.p1.y - m * edge.p1.x; float tleft = (window.left - c) / m; float tright = (window.right - c) / m; if (dx > 0) { if (tleft > t1) t1 = tleft; if (tright < t2) t2 = tright; } else { if (tleft < t2) t2 = tleft; if (tright > t1) t1 = tright; } } if (dy == 0) { if ((edge.p1.y < window.top) || (edge.p1.y > window.bottom)) return; } else { float m = dx / dy; float c = edge.p1.x - m * edge.p1.y; float ttop = (window.top - c) / m; float tbottom = (window.bottom - c) / m; if (dy > 0) { if (ttop > t1) t1 = ttop; if (tbottom < t2) t2 = tbottom; } else { if (ttop < t2) t2 = ttop; if (tbottom > t1) t1 = tbottom; } } // 判断线段是否被裁剪 if (t1 <= t2) { Point new_p1, new_p2; new_p1.x = edge.p1.x + t1 * dx; new_p1.y = edge.p1.y + t1 * dy; new_p2.x = edge.p1.x + t2 * dx; new_p2.y = edge.p1.y + t2 * dy; // 绘制裁剪后的线段 line(new_p1.x, new_p1.y, new_p2.x, new_p2.y); } } int main() { // 创建图形窗口 initgraph(640, 480); // 绘制窗口边框 setcolor(WHITE); rectangle(100, 100, 500, 400); // 定义窗口和线段数据 Window window = {100, 100, 500, 400}; Edge edge = {{50, 200}, {600, 200}, 0, 0}; // 计算线段裁剪后的结果并绘制 NLN(edge, window); // 关闭图形窗口 getch(); closegraph(); return 0; } ``` 以上代码中,我们首先定义了三个数据结构:`Point` 代表点的坐标,`Edge` 代表线段的两个端点,以及 `Window` 代表窗口的大小。 然后,我们实现了 `NLN` 函数,该函数接受一个线段和一个窗口作为输入,并计算线段在窗口内的裁剪结果。该函数的实现基于 NLN 算法的基本原理,即通过计算线段与窗口之间的交点来裁剪线段。 最后,我们在 `main` 函数中使用 `NLN` 函数计算线段的裁剪结果,并绘制在图形窗口中。在绘制之前,我们还绘制了一个矩形边框来表示窗口的大小。 运行程序后,将看到裁剪后的线段仅在窗口内被绘制,而窗口外的部分被裁剪掉了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值