|
1、easyx.h头文件;
2、绘图窗口设置
initgraph();
closegraph();
setbkcolor();
cleardevice();绘图刷新前使用。
getchar();中断;需#include<stdio.h>
system(&#34;pause&#34;);需#include<stdlib.h>
3、坐标系设置
setorigin(x,y);
setaspectratio();-1为翻转坐标系。
4、基本图形绘制
点:putpixel(x,y,颜色)
线:line(x1,y1,x2,y2);
solid+,填充,fill+,描边加填充;
{
圆:circle();fillcircle();
矩形:rectangle();
椭圆:ellipse();
圆角矩形:roundrect();
扇形:pie();pi=3.14,起始角度与坐标系有关。
}
圆弧:arc()
5、多边形绘制
方法1、 POINT pts[] = { {50, 200}, {200, 200}, {200, 50} };
polygon(pts, 3);
方法 2 、int pts[] = {50, 200, 200, 200, 200, 50};
polygon((POINT*)pts, 3);
solid+,fill+;需setpolyfillmode(WINDOWS);
polyline();
6、颜色设置
white,black,yellow,red,green,blue,brown;
cyan,青色;magenta,紫色;
RGB(r,g,b);0-255;16进制数值表示方法待学习。
绘制渐变色,HSV颜色模型。HSBtoRGB(0-360,0-1f,0-1f)(色相,饱和度,亮度)。
数值后面加f转换成浮点型。
7、图形颜色与样式设置
setlinecolor;
setlinestyle(线型,粗细)
(PS_SOLID,DASH,DOT,NULL)
(PS_ENDCAP_ROUND,SQUARE,FLAT)
(PS_JOIN_BEVEL,MITER,ROUND)
setfillcolor;
setfillcolor;+setpolyfillmode(WINDOWS);多边形填充需使用。
8、图形剪贴区域
借用windows GDI,以物理坐标为坐标系。
单区域:
CreateEllipticRgn,chuang,创建椭圆区域;含圆形。
CreatePolygonRgn,chuang,创建多边形区域;
CreateRectRgn,chuang,创建矩形区域;
CreateRoundRectRgn,chuang,创建圆角矩形区域;
HRGN rgn=Create*Rgn();
setcliprgn(rgn);
setcliprgn(NULL);
DeleteObject(rgn);
多区域组合:
CombineRgn(hrgn0,hrgn1,hrgn2,组合类型),hrgn0,为空区域()。
组合类型:
RGN_AND,COPY,DIFF,OR,XOR(交集,hrgn1部分,hrgn1-hrgn2,并集,or-and)
9、文字输出
字体描边颜色和样式同图形。setlinecolor;setlinestyle;
设置文字的颜色:
setbkcolor();设置背景颜色;
settextcolor();设置字体颜色,
setbkcolor();使用背景颜色
调整字体样式:settextstyle(h,w,&#34;字体&#34;),0为自适应。
settextstyle(字体样式),重载版本;
结构体:LOGFONT;只需在设置字体样式之前,调用gettextstyle函数;
获取当前字体的logfont;修改结构体中成员;
最后,将修改后结构体传入settextstyle函数。
LOGFONT fontstyle;
gettextstyle(&fontstyle);
fontstyle.lfUnderline=true;(等等)
settextstyle(&fontstyle);
setbkmode(),修改背景模式,opaque,当前背景色;transparent,背景透明。
窗体上绘制文字:
outtextxy(x,y,&str);需要调整字符集为未设置 ,第三参数可以为字符串或字符;
指定区域绘制文字:drawtext()函数,待输出字符串,矩形区域指针,格式化输出
矩形区域结构体声明:
typedef struct tagRECT{
left;top;right;bottom;
}RECT;
格式化输出:DT_底部,水平居中,左对齐,右对齐,显示一行,顶对齐,垂直居中,自动换行,截取尾部。
可以通过位或运算符组合使用。
10、批量绘图与单次绘图
BeginBatchDraw();
FlushBatchDraw();
EndBatchDraw();
11、图片的显示,使用IMAGE对象;
easyx图形库支持,bmp,gif,jpg,png,tif,emf,wmf,ico。
声明:IMAGE img;
填充,显示:
loadimage(图像指针,图像地址,宽,高,是否调整大小适应图片)
图像地址:
绝对路径,E:/p/p/bear.jpg。相对引用,bear.jpg。当前文件夹&#34;./&#34;可省略,上一级文件夹&#34;../&#34;。
可使用字符串传递,或字符数组传递。
使用多字节字符,const char * 。
需要修改:项目名称-属性-配置属性-高级-字符集=未设置。
putimage(x,y,&img,三元光栅操作码);
背景图片的设置:IMAGE img;loadimage;putimage;
前景图片设置,如果使用一个img对象,会造成图片大小不变问题,需进行调整。
调整方法1,loadimage,最后加参数(0,0,true);
调整方法2,另外一个IMAGE对象,img1;
三元光栅:使用剪影图片,黑白,称掩码。
第一,剪影图片与背景图片进行与运算,得到带有背景的剪影;
第二,带有背景的剪影图片与主体图片或运算,得到主体与背景图片融合。
剪影and背景or主体图片=主体加背景图片。
IMAGE 背景对象;loadimage()加载。
IMAGE 掩码对象;loadimage()加载。
IMAGE 前景对象;loadimage()加载。
putimage(0,0,背景指针);
putimage(x,y,掩码指针,SRCAND);
putimage(x,y,前景指针,SRCPAINT);
前景图片运动形式,多个图片循环显示。
文件路径的表示。使用字符数组,替换。
char strimagepath[100];
sprintf(strimagepath,&#34;路径%d.png&#34;,i)
12、精确帧率控制
延时:Sleep();毫秒;
精确控制运行机制:
Sleep休眠最小时间为15毫秒,为精确休眠时间:
timeBeginPeriod(1);需属性中增加库winmm.lib。代码尾部使用timeEndPeriod(1);结束。
工程-属性-链接器-输入-附加依赖项,添加。
定义变量:LARGE_INTEGER startCount,endCount,F;
获取频率:QueryPerformanceFrequency(&F);
开始绘图:BeginBatchDraw()
获取开始时间:QueryPerformanceCounter(&startCount.QuadPart);
运行代码;
获取结束时间:QueryPerformanceCounter(&endCount.QuadPart);
计算耗时:long long elapse=(endCount.QuadPart-startCount.QuadPart)*1000000/F.QuadPart;//毫秒;
耗时小于设定值时循环比较:while(elapse<n)
{
Sleep(1);
QueryPerformanceCounter(&endCount.QuadPart);
elapse=(endCount.QuadPart-startCount.QuadPart)*1000000/F.QuadPart;
}
刷新绘图:FlushBatchDraw();
结束绘图:EndBatchDraw();
代码尾部使用timeEndPeriod(1);结束。
12、键盘交互控制与键盘鼠标消息处理
第一种,getchar()函数
第二种,_getch()函数,平台函数,#include<conio.h>
char c=_getch();如果画面需要一直变化,if(_kbhit()!=0);
消息处理:鼠标消息EX_MOUSE,键盘消息EX_KEY,字符消息EX_CHAR,窗体消息EX_WINDOW。
getmessage()函数:多个消息,用“|”连接。
ExMessage msg;msg=getmessage(EX_MOUSE);
ExMessage msg;getmessage(&msg,EX_MOUSE);
msg.message
第三种,鼠标消息处理
ExMessage msg;msg=getmessage(EX_MOUSE);
msg.message;
ctrl,shift,lbutton,mbutton,rbutton,x,y,wheel;
WM_
识别鼠标双击事件,创建窗体时initgraph(800,600,EX_DBCLICKS);
第四种,键盘消息处理
键盘消息,创建窗体时initgraph(800,600,EX_SHOWCONSOLE);
ExMessage msg;msg=getmessage(EX_KEY);
msg.message
vkcode,scancode,extended,prevdown;
VKCODE:上0X26;下0X28;左0X25;右0X27;
字符消息:ch;窗口消息:wParam,lParam;
13、多个变量封装成结构
声明一个结构,定义一个别名,该别名就成为一个数据类型。
可以使用该数据类型定义 变量,数组、函数等。
typedef struct
{
}GameData;
函数调用结构:
void reset(GameData *gdata)
{
}
//通过上述结构访问起成员,使用时变量名+“->”。
GameData gdata;//声明GameData类型变量,变量名gdata。
reset(&gdata);//传入gdata地址指针
通过gdata变量使用是,gdata.x方式调用。
14、枚举类型,与结构相似,无别名,调用名称。
15、申请内存空间
malloc(字节数)函数
16、特殊函数使用
随机数设置rand()%(n+1)-m;
rand()%(n-m+1)+m;
随机数随机:srand((unsigned int)time(NULL));头函数,time.h
休眠函数:Sleep()毫秒。
17、特殊算法实现
圆周坐标求值(x,y)。math.h头文件
x=cos(pi/180*n)*r;
y=sin(pi/180*n)*r;
18、物体运动条件判断与运算
速度分解;
tan角=|yx-y1|/|x2-x1|
角度=atan(tan角);
vx=cos(角度)*v;
vy=sin(角度)*v
p1点移动到p2点:
x+=vx;y+=vy;
if(x>x2||y<y2)break;
封装linearMotion函数,两点运动,及速度v。
19、多物体运动,
定义一个结构 ,多个小球,可以定义为:
typedef struct{
int x;//圆心x坐标
int y;//圆心y坐标
int vx;//圆x轴运动速度
int vy;//圆y轴运动速度
COLORREF color;//球的颜色
}ball;
(颜色的定义:COLORREF)
20、音频的播放,需要附加winmm.lib库文件。
工程-属性-链接器-输入-附加依赖项,添加。
MCIERROR mciSendString()函数;
mciSendString(&#34;open str&#34;,NULL,0,NULL);
open,play,pause,resume,stop,close;
play 命令,第二参数使用repeat,可以循环播放。
open命令,第一参数后 alias 别名;可以为音频文件取别名。便于后续使用。
21、面向对象(与面向过程)。
特性:封装,通过方法直接操作数据。方法命名规则,获取数据get_,设置数据set _;
结构体中指针成员,属性赋值;s->id=id;结构体成员,属性赋值s.id=id;
函数和数据结合,对象.方法(对象指针,参数列表),借助函数指针。
首先,需要在结构中声明函数的函数指针。(*函数名)必须用括号包括,以提高优先级。
其次,通过函数,设置初始化结构体,s->setStudentId=setStudentId;
最后,主调函数,定义结构体变量,初始化结构体变量。
继承;
背景,学校:
共同:人员(属性:编号,姓名,性别;方法:设置性别,获取性别),使用时需要命名。
学生(属性:学号,姓名,性别,考试分数),
使用结构体定义。
学号的设置方法makeStudent();
性别的数值与字符转换方法;numTOstr;strTOnum;
老师(属性:工号,姓名,性别,任课科目)。
多态;(绘制图形):矩形,圆形,三角形;相同draw方法。根据传入参数的不同,调用不同draw方法。
父对象与子对象内存排布必须重合。
第一,抽离各个对象共有方法,draw,单独放置对象Sharp内;
第二,各个对象继承Sharp对象;
第三,子对象中draw方法,设置为各自实现方法;
第四、声明Sharp对象指针,并将其赋值为子对象指针;
第五、通过上述对象指针,调用共有方法draw,执行第三步中设置的方法;
22、动态数组。
数组存放数据,声明数组长度不能预知;自动增长策略。
malloc,申请空间,成功返回首地址。
realloc(首地址,新空间长度);函数增长或缩短已申请的内存空间,; |
|