(1)推箱子的准备思想(预热TC图形库知识+小小的win函数知识)

很激动,手动完成了自己人生中的第一个游戏,虽然它存在普遍性!
做游戏呢,尤其是新手,我觉得TC图形库也还不错(虽然被前辈们敲烂了)
好,步入主题:

用TC图形库基本上可以不用win函数,但为了储备更多的知识,我还是拿小本本记录了一些win知识(原创+百度理解)
(1).在控制台的指定坐标位置输出数据
先定义一个COORD的结构体来存储输出位置的坐标x,y。
介绍一下COORD这个东西
COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。其定义为:

typedef struct _COORD {
SHORT X; // horizontal coordinate输出位置的横坐标
SHORT Y; // vertical coordinate输出位置的纵坐标
} COORD;

然后我们需要获取输出控制台的句柄,这里使用的是GetStdHandle( ) 函数,
这里介绍一下这个获取标准设备句柄的函数;
1.首先,在使用这个函数的时候,我们要清楚句柄这个概念: 在windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为他们分配内存,并返回标示这些资源的标示号,即句柄 。句柄指的是一个核心对象在某一个进程中的唯一索引,而不是指针。由于地址空间的限制,句柄所标识的内容对进程是不可见的,只能由操作系统通过进程句柄列表来进行维护。句柄列表:每个进程都要创建一个句柄列表,这些句柄指向各种系统资源,比如信号量,线程,和文件等,进程中的所有线程都可以访问这些资源 。
2.调用这个函数的时候我们首先要创建一个面向于要输出数据控制台窗口的句柄

HANDLE console;//定义一个句柄,叫做console

3.GetStdHandle()函数的原型

HANDLE GetStdHandle( DWORD nStdHandle )
//该函数面向于句柄来实现,DWORD指注册表的健值,而nStdHandle参数也有三种类型
// **1.STD_INPUT_HANDLE       标准输入的句柄
// **2.STD_OUTPUT_HANDLE      标准输出的句柄
// **3.STD_ERROR_HANDLE       标准错误的句柄

4.我们要实现输出的功能,肯定选第二个标准输出的句柄:

HANDLE console;
console = GetStdHandle(STD_OUTPUT_HANDLE); 

5.句柄设置好后,我们还要设置控制台的光标位置,这里使用SetConsoleCursorPosition( ) 函数

在这里应该有两个参数
SetConsoleCursorPosition(HANDLE,COORD);
//接受句柄类型,接受位置坐标的信息

6.完整的代码:

#include<bits/stdc++.h>   //******c++万能头文件
#include<windows.h>      //********window的头文件
using namespace std;
void gotoxy(int x,int y)
{
	COORD APP;
	APP.X=x;
	APP.Y=y;
	HANDLE console;
	console = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(console,APP);
}
int main()
{
	gotoxy(25,10);
	cout<<"Hello,MFC"<<endl;
}

在这里插入图片描述
(2).界面的清除

system("cls");//**用来清除屏幕上的所有显示,并将光标置于屏幕左上角。
//****************windows.h头文件内

(3).我们知道输出数据时控制台会显示一个光标,该光标的位置就是告诉你将要输入数据的位置,但游戏做完开始动手肝的时候,游戏界面多了一个忽闪忽灭的光标,这在很大程度上影响游戏美观(个人观点),所以,控制光标的状态则显得尤为重要

在windows.h里面有一个关于控制光标的结构体CONSOLE_CURSOR_INFO
/*CONSOLE_CURSOR_INFO
{
	DWORD DwSize //用来控制光标的宽度(俗称厚度),一般定义为1--100;
	BOOL bVisible  //光标的状态(0或者false为隐藏光标,1或者true为光标可见)
}*/
//代码演示
void iscursor()
{
	HANDLE app=GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO C;
	GetConsoleCursorInfo(app,&C);//检索有关指定的控制台屏幕缓冲区的光标的
	//可见性和大小信息,该函数两个参数,第一个是控制台屏幕缓冲区的句柄。该句柄
	//必须具有的 GENERIC_READ 的访问权限。 第二个是指向接收有关该控制台的光标
	//的信息的CONSOLE_CURSOR_INFO结构的指针
	
	C.bVisible=0;  //************此时代表隐藏光标
	SetConsoleCursorInfo(app,&C);//上面函数的Get对应现在的Set,就是设置的
	//意思。
}

在这里插入图片描述
(相比较上一张图,光标被隐藏了)

(4).游戏中文字颜色——字体类型的设置(不同的颜色确实不一样的感官效果,嘿嘿!)
++++++++颜色设置有两种方式:+++++++++
1.介绍SetConsoleTextAttribute()函数

原型:
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
HANDLE hConsoleOutput 指标准输出句柄,这个不再讨论;
wAttributes 是用来设置输出颜色的参数。

扫描二维码关注公众号,回复: 9810649 查看本文章
//这里只修改字体颜色,下面会介绍修改背景颜色
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;

int main()
{
    HANDLE app;
    app=GetStdHandle(STD_OUTPUT_HANDLE);
    //FOREGROUND_INTENSITY指原色,即保持默认字体的原颜色
    SetConsoleTextAttribute(app,FOREGROUND_INTENSITY);
    cout<<"HELLO MFC"<<endl;
    //FOREGROUND_BLUE 字体变成蓝色
    SetConsoleTextAttribute(app,FOREGROUND_BLUE);
    cout<<"HELLO MFC"<<endl;
    //FOREGROUND_RED 字体变成红色
    SetConsoleTextAttribute(app,FOREGROUND_RED);
    cout<<"HELLO MFC"<<endl;
    //FOREGROUND_GREEN 字体变成绿色
    SetConsoleTextAttribute(app,FOREGROUND_GREEN);
    cout<<"HELLO MFC"<<endl;
    //FOREGROUND_GREEN | FOREGROUND_RED 混合两种颜色,代表黄色
    SetConsoleTextAttribute(app,FOREGROUND_GREEN | FOREGROUND_RED);
    cout<<"HELLO MFC"<<endl;
    //FOREGROUND_BLUE | FOREGROUND_RED 混合两种颜色,代表紫色
    SetConsoleTextAttribute(app,FOREGROUND_BLUE | FOREGROUND_RED);
    cout<<"HELLO MFC"<<endl;
    //FOREGROUND_BLUE | FOREGROUND_GREEN 混合两种颜色,代表青蓝色
    SetConsoleTextAttribute(app,FOREGROUND_BLUE | FOREGROUND_GREEN);
    cout<<"HELLO MFC"<<endl;
    SetConsoleTextAttribute(app,FOREGROUND_INTENSITY);
    system("pause"); //窗口暂停,防止闪屏
    return 0;
}

在这里插入图片描述
背景颜色也是类似上面,就不多多说明了
在这里插入图片描述
2. 第二种设置颜色的方法:

//定义一个无字符短字节的整形数值 c(unsigned 无字符代表定义的数值只能取大于等于0的整数,short就是2个字节宽的短整型量,和int有点区别)
void color(unsigned short c)
{
	HANDLE app;
	app=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(app,c);
}
//调用函数的时候(演示代码)
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
void color(unsigned short c)
{
	HANDLE app;
	app=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(app,c);
}
int main()
{
   color(1);  //深蓝色
   cout<<"HELLO"<<endl;
   color(2);  //深绿色
   cout<<"HELLO"<<endl;
   color(3);  //青蓝色
   cout<<"HELLO"<<endl;
   color(4);  //火红色
   cout<<"HELLO"<<endl;
   color(5);  //紫色
   cout<<"HELLO"<<endl;
   color(6);  //褐黄色
   cout<<"HELLO"<<endl;
   color(7);  //粉笔白色
   cout<<"HELLO"<<endl;
   color(8);  //灰色
   cout<<"HELLO"<<endl;
   color(9);  //亮蓝色
   cout<<"HELLO"<<endl;
   color(10);  //绿色
   cout<<"HELLO"<<endl;
   color(11);  //青色
   cout<<"HELLO"<<endl;
   color(12);  //褐红色
   cout<<"HELLO"<<endl;
   color(13);  //深紫色
   cout<<"HELLO"<<endl;
   color(14);  //亮黄色
   cout<<"HELLO"<<endl;
   color(15);
   cout<<"HELLO"<<endl;
   //16有些特殊,后面可以自己尝试一下
   color(16);  //青蓝色
   cout<<"HELLO"<<endl;
    return 0;
}

在这里插入图片描述
颜色就告一段落了,但游戏的开始怎么能没有亮眼的动画呢,本人能力有限,只了解下面的一溜溜
+++++++++ 1.
SetConsoleScreenBufferSize(hConsoleOutput,dwSize) 是更改指定的控制台屏幕缓冲区的大小的函数,函数调用两个参数来实现——一个是标准句柄,还有一个是dwsize(一个COORD结构,指定新的控制台屏幕缓冲区的大小,以字符列和行为单位。指定的宽度和高度不能小于控制台屏幕缓冲区窗口的宽度和高度)。

SMALL_RECT,是一个结构体,内置四个成员,从上到下依次是Left,Top,
Right,Bottom这四个点,代表矩型的左上右下四个点。(与COORD不同)

typedef struct _SMALL_RECT {  
SHORT Left;  
SHORT Top;  
SHORT Right;  
SHORT Bottom;
} SMALL_RECT;

SetConsoleWindowInfo()原型是:(内置3个参数)

BOOL WINAPI SetConsoleWindowInfo
(
  _In_   HANDLE hConsoleOutput,
  //控制台屏幕缓冲区的句柄。该句柄必须具有GENERIC_READ访问权限
  _In_   BOOL bAbsolute,
  //如果此参数为TRUE和FALSE两种情况若为TURE,则坐标指定窗口的新左上角和右下角。
  //如果为FALSE,则坐标是相对于当前窗口角坐标的(当然也可以表示为1 0这两种情况)。
  _In_   const SMALL_RECT *lpConsoleWindow
  //指向SMALL_RECT结构的指针,该结构指定控制台窗口的新的左上角和右下角
);
加一个Sleep()函数来控制速度。
用for循环来循环输出SetConsoleWindowInfo来实现简单的横向动画

这期乱七八糟的知识有点多,只能下期再介绍TC图形库的一些知识,有问题欢迎指出!

发布了9 篇原创文章 · 获赞 14 · 访问量 2177

猜你喜欢

转载自blog.csdn.net/YSJ367635984/article/details/104526614