课程四:屏幕操作
一个程序光靠命令行来进行交互操作是不现实的,想要程序做的好,必定要有一个好看的GUI,以便进行操作。
身为一个为计算器设计的语言,里面已经集成了绘图函数。
而且使用方法很简单。
首先我们来熟悉几个常量:
LCD_WIDTH和LCD_HEIGHT
这两个常量分别代表了长度和宽度
在TI-89上面,显示屏是160*100的,TI-92和V200则是240*128的
对于TI-89,LCD_WIDTH就是160,LCD_HEIGHT就是100
TI-92/V200同理
下面我们来了解一下第一个函数:
DrawLine
这个函数的目的就是画一条线
她有五个参数:
DrawLine(x1,x2,y1,y2,绘制方式)
同样,我们的方式依旧是A_NORMAL,其他方式请阅读TI-GCC说明文档
比如,在2,2和22,22的地方画一条线,可以采用:
DrawLine(2,2,22,22,A_NORMAL);
原文中提到了一个
x1 = random(LCD_WIDTH);
这个就不多解释了,随机数的意思
那么,下面我们来进行第二个函数的学习
我们来认识一个新概念----精灵
精灵是个好东西,很多游戏开发软件(如Gamemaker)中通常都有这个说法
TIGCC也为我们准备了三个函数来绘制精灵
她们是:
{Sprite8 , Sprite16 , Sprite32}
这三个函数是用来在屏幕上绘制精灵的函数
让我们来看一个示例:- #include <tigcclib.h>
-
- unsigned char S1[] = {0x3C,0x42,0x42,0x7E,0x42,0x42,0x42,0x42};
- unsigned short int S2[] =
- {
- 0xFFFF,0x8001,0xBFFD,0xA005,0xAFF5,0xA815,0xABD5,0xAA55,0xAA55,0xABD5,0x A815,0xAFF5,0xA005,0xBFFD,0x8001,0xFFFF
- };
- unsigned long int S3[] = {
- 0x00000000,0x00000000,0x00000000,0x00000000, 0x00000000,0x00000000,0x00E07000,0x01FE7F80, 0x03FEFF80,0x07B9CE00,0x03188E00,0x03FFFF00, 0x01FFFF00,0x01C00700,0x01FFFF00,0x01C00700, 0x01FFFF00,0x01C00700,0x01FFFF00,0x01FFFF00, 0x00383800,0x07FFFFC0,0x07FFFFC0,0x00703800, 0x00F03800,0x01E03800,0x00403800,0x00000000, 0x00000000,0x00000000,0x00000000,0x00000000
- };
- void _main(void)
- {
- ClrScr();
- Sprite8(10,20,8,S1,LCD_MEM,SPRT_XOR);
- Sprite16(30,20,16,S2,LCD_MEM,SPRT_XOR);
- Sprite32(60,20,32,S3,LCD_MEM,SPRT_XOR);
- ngetchx();
- }
复制代码运行结果如下: 下面就让我们来剖析这个程序 首先,在程序的开头我们定义了三个变量:S1,S2,S3 它们分别为”Unsigned Char”,”Unsigned short int”和”Unsigned long int” 这三个变量储存着三个不同的精灵(8x8 16x16 32x32) 然后通过程序中的 Sprite8(10,20,8,S1,LCD_MEM,SPRT_XOR); Sprite16(30,20,16,S2,LCD_MEM,SPRT_XOR); Sprite32(60,20,32,S3,LCD_MEM,SPRT_XOR); 这三个函数绘制在屏幕上 那么怎么把图片(点阵图)变成精灵的数据呢? 很简单 有过单片机开发经验的朋友都知道,有一种软体叫做字符取模 也就是将图片变成C51格式的字符串 这个软体我会在帖子结尾上传 下面是软件截图: 也许大家就要问了 为什么我把一个32x32或16x16的图片取模后和我的格式不一样呢? 这是由于Sprite16和Sprite32的函数只能接受这种格式 可以手动将 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x70,0x00,0x01,0xFE,0x7F,0x80,
- 0x03,0xFE,0xFF,0x80,0x07,0xB9,0xCE,0x00,0x03,0x18,0x8E,0x00,0x03,0xFF,0xFF,0x00,
- 0x01,0xFF,0xFF,0x00,0x01,0xC0,0x07,0x00,0x01,0xFF,0xFF,0x00,0x01,0xC0,0x07,0x00,
- 0x01,0xFF,0xFF,0x00,0x01,0xC0,0x07,0x00,0x01,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x00,
- 0x00,0x38,0x38,0x00,0x07,0xFF,0xFF,0xC0,0x07,0xFF,0xFF,0xC0,0x00,0x70,0x38,0x00,
- 0x00,0xF0,0x38,0x00,0x01,0xE0,0x38,0x00,0x00,0x40,0x38,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
复制代码这种格式转化为 - 0x00000000,0x00000000,0x00000000,0x00000000, 0x00000000,0x00000000,0x00E07000,0x01FE7F80, 0x03FEFF80,0x07B9CE00,0x03188E00,0x03FFFF00, 0x01FFFF00,0x01C00700,0x01FFFF00,0x01C00700, 0x01FFFF00,0x01C00700,0x01FFFF00,0x01FFFF00, 0x00383800,0x07FFFFC0,0x07FFFFC0,0x00703800, 0x00F03800,0x01E03800,0x00403800,0x00000000, 0x00000000,0x00000000,0x00000000,0x00000000
复制代码这种格式 也就是把四个一个字节的数据合并成为一个四个字节的数据. 然后我们来正式介绍着三个函数 SpriteXX函数接受6个参数 分别是: x位置 , y位置 , 图像高度 , 图像数据 , 显存指针 , 绘制方法 Xy位置自然不用说 图像高度就是精灵中图像的高度(图像宽度就是SpriteXX中的XX) 图像数据从Sprite8至Sprite32分别为: 无符号的字符数组,无符号的短整型数组,无符号的长整形数组 至于显存指针,您只需要记住: 当前屏幕的显存指针通常就是 LCD_MEM (除非您是想将精灵绘制到其他的地方,我们或许在以后的课程中提到) 下面,让我们来看一看绘制方法: 我推荐大家使用的绘制方法是SPRT_XOR 也就是说异或 下面通过一组代码您会充分认识到这个绘制方法的好处: 首先我们定义 unsigned char S4[] = {0x18,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18}; unsigned char S5[] = {0xC3,0x66,0x24,0x00,0x00,0x24,0x66,0xC3}; Sprite8(1,1,8,S4,LCD_MEM,SPRT_XOR); Sprite8(1,1,8,S5,LCD_MEM,SPRT_XOR); Sprite8(1,1,8,S4,LCD_MEM,SPRT_XOR); 您会发现: 第一句代码和第二句代码一模一样 为什么会产生不同的效果呢? 这是因为我们使用了SPRT_XOR 这个绘制方法是很好用的 如果绘制的地方没有像素点,那么就绘制一个像素点 如果绘制的地方已经有了一个像素点,那么就抹掉一个像素点 这就是我为什么推荐这个绘制方法 很好用,而且很方便 更多的方法请翻阅GUIDE,谢谢
P.S. 我死灰复燃了
|