【c++游戏小技巧-2】可用鼠标点击的按钮

7 篇文章 0 订阅
3 篇文章 0 订阅

前言

(水一期)

正片1-全文

#ifndef BUTTON_H
#define BUTTON_H

#include<windows.h>
#include<cstdio>
#include<iostream>

#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

namespace All{
	
	namespace Button{
		
		void noedit(){
			HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);
			DWORD mode;
			GetConsoleMode(hStdin,&mode);
			mode&=~ENABLE_QUICK_EDIT_MODE;
			mode&=~ENABLE_INSERT_MODE;
			mode&=~ENABLE_MOUSE_INPUT;
			SetConsoleMode(hStdin,mode);
		}
		
		namespace ColorTable{
			const int BULE=1;const int GREEN=2;
			const int SBULE=3;const int RED=4;
			const int PURPLE=5;const int YELLO=6;
			const int WHITE=7;const int ASH=8;
			const int SBBULE=9;const int BGREEN=10;
			const int BBULE=11;const int SRED=12;
			const int SPURPLE=13;const int BYELLO=14;
			const int BWHITE=15;const int BLACK=16;
		}
		
		class Button{
			int x;int y;int c;const char *n;int pc=-1;int pc_=-1;
			
			void GetPos(POINT &pt){
			    HWND hwnd=GetForegroundWindow();
			    GetCursorPos(&pt);
			    ScreenToClient(hwnd,&pt);
			    pt.y=pt.y/16,pt.x=pt.x/16;
			}
			
			void gto(int x,int y){
			    COORD pos;pos.X=y*2;pos.Y=x;
			    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
			}
			
			void color(int ForgC, int BackC){
				WORD wColor=((BackC&0x0F)<<4)+(ForgC&0x0F);
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),wColor);
			}
			
			public:
				Button(){}
				Button(int x_,int y_,int color,const char *neiron,int pcolor=-1,int tcolor=-1){
					x=x_,y=y_,c=color,pc=pcolor;n=neiron;pc_=tcolor;
				}
				
				void New(int x_,int y_,int color,const char *neiron,int pcolor=-1,int tcolor=-1){
					gto(x,y);
					for(int i=0;i<(int)strlen(n);i++)
						printf(" ");
					x=x_,y=y_,c=color,pc=pcolor;n=neiron;pc_=tcolor;
				}
				
				bool press(int q,int h){
					POINT pt;
					GetPos(pt);
					if(pt.y==x&&(pt.x>=y&&pt.x<=(int)y+(int)strlen(n)/2)&&kd(VK_LBUTTON)){
						gto(x,y);
						color(c,pc);
						std::printf("%s",n);
						color(q,h);
						return 1;
					}
					return 0;
				}
				
				bool touch(int q,int h){
					POINT pt;
					GetPos(pt);
					if(pt.y==x&&(pt.x>=y&&pt.x<=(int)y+(int)strlen(n)/2)){
						gto(x,y);
						color(c,pc_);
						std::printf("%s",n);
						color(q,h);
						return 1;
					}
					return 0;
				}
				
				void out(){
					gto(x,y);
					color(c,ColorTable::BLACK);
					printf("%s",n);
				}
		};
	
	}
}

#endif

让我们慢慢看......

正片2- 1~6行分析

#ifndef BUTTON_H
#define BUTTON_H

#include<windows.h>
#include<cstdio>
#include<iostream>

1~2行是一个只让头文件包含一次的方法之一,详情见c++游戏小技巧4:可用鼠标点击的按钮_L('ω')┘脏脏包└('ω')」的博客-CSDN博客

看看就好,的文章好是好,就是太水了,的三篇=我的一篇

正片3- 8行分析

#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

这里调用了GetAsyncKeyState函数,不过

 这里是多余的,(是故意的)。

正片4- 10~12行分析

namespace All{
	
	namespace Button{

定义了两个命名空间(All和Button)

正片5- 14~22行分析

有时候程序会卡住,必须要按回车程序才会输出,

其实这是由于命令行窗口的快速编辑模式导致

		void noedit(){
			HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);
			DWORD mode;
			GetConsoleMode(hStdin,&mode);
			mode&=~ENABLE_QUICK_EDIT_MODE;
			mode&=~ENABLE_INSERT_MODE;
			mode&=~ENABLE_MOUSE_INPUT;
			SetConsoleMode(hStdin,mode);
		}

创造了一个函数,作用是关掉快速编辑模式。(不然会有Bug)

正片6 -24~33分析

		namespace ColorTable{
			const int BULE=1;const int GREEN=2;
			const int SBULE=3;const int RED=4;
			const int PURPLE=5;const int YELLO=6;
			const int WHITE=7;const int ASH=8;
			const int SBBULE=9;const int BGREEN=10;
			const int BBULE=11;const int SRED=12;
			const int SPURPLE=13;const int BYELLO=14;
			const int BWHITE=15;const int BLACK=16;
		}

定义了一个命名空间ColorTable,里面是一些值(颜色)。

正片7- 35~36行分析

		class Button{
			int x;int y;int c;const char *n;int pc=-1;int pc_=-1;

定义了一个类(Button),有一系列成员:

x//x,y//y

c//字的颜色

n//字的内容

pc//按下的颜色

pc_//碰到的颜色

正片8- 38~43行分析

			void GetPos(POINT &pt){
			    HWND hwnd=GetForegroundWindow();
			    GetCursorPos(&pt);
			    ScreenToClient(hwnd,&pt);
			    pt.y=pt.y/16,pt.x=pt.x/16;
			}

获取鼠标相对于窗口的位置(想不明白为什么/16就去掉试试)

正片9- 45~48行分析

			void gto(int x,int y){
			    COORD pos;pos.X=y*2;pos.Y=x;
			    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
			}

移动到y+1行x+1列,(不要问为什么)

正片10 -50~53行分析

			void color(int ForgC, int BackC){
				WORD wColor=((BackC&0x0F)<<4)+(ForgC&0x0F);
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),wColor);
			}

设置颜色,ForgC是字体色,BackC是背景色。

正片11- 55~59行分析

			public:
				Button(){}
				Button(int x_,int y_,int color,const char *neiron,int pcolor=-1,int tcolor=-1){
					x=x_,y=y_,c=color,pc=pcolor;n=neiron;pc_=tcolor;
				}

55行是一个关健字,不知道的可以去搜搜

56行是一个构造函数,(防止不构造报错)。

57行还是一个构造函数,是初始化变量的。

正片12- 61~66行分析

				void New(int x_,int y_,int color,const char *neiron,int pcolor=-1,int tcolor=-1){
					gto(x,y);
					for(int i=0;i<(int)strlen(n);i++)
						printf(" ");
					x=x_,y=y_,c=color,pc=pcolor;n=neiron;pc_=tcolor;
				}

就重新构造了一遍吗,很简单。

正片13- 68~92行分析

				bool press(int q,int h){
					POINT pt;
					GetPos(pt);
					if(pt.y==x&&(pt.x>=y&&pt.x<=(int)y+(int)strlen(n)/2)&&kd(VK_LBUTTON)){
						gto(x,y);
						color(c,pc);
						std::printf("%s",n);
						color(q,h);
						return 1;
					}
					return 0;
				}
				
				bool touch(int q,int h){
					POINT pt;
					GetPos(pt);
					if(pt.y==x&&(pt.x>=y&&pt.x<=(int)y+(int)strlen(n)/2)){
						gto(x,y);
						color(c,pc_);
						std::printf("%s",n);
						color(q,h);
						return 1;
					}
					return 0;
				}

press是检测是否按下按钮,touch是检查是否碰到按钮。

正片14 -94~98行分析

				void out(){
					gto(x,y);
					color(c,ColorTable::BLACK);
					printf("%s",n);
				}

输出按钮。

正片15 -99~104行分析

		};
	
	}
}

#endif

为了对印上面的括号。

后文

c++游戏小技巧4:可用鼠标点击的按钮_L('ω')┘脏脏包└('ω')」的博客-CSDN博客

哎,废了这么大劲,您能给我点个赞吗?

(如有疑惑评论或私信,大家一起学习!)

@L('ω')┘脏脏包└('ω')」(不错)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值