一 算术运算符
+ 加, 一元取正
- 减, 一元取负
* 乘
/ 除
% 求余
-- 自减1
++ 自加1
逻辑运算符
&& 逻辑与
|| 逻辑或
! 逻辑非
关系运算符
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
位运算符号
& 按位与
| 按位或
^ 按位异或
~ 按位取反
>> 右移
<< 左移
二 /****从小到大排列*****已仿真***************/
#include <stdio.h>
#define N 10
void main()
{ TMOD|=0x20;
TH1=0xF3;
TR1=0x1;
TI=1;
int i,j,min,temp;
int a[N]={5,4,3,2,1,9,8,7,6,0};
printf("\nThe array is:\n"); /* 输出数组元素 */
for (i=0;i<N;i++)
printf("%5d",a[i]);
for (i=0;i<N-1;i++) /* 排序操作 */
{
min = i;
for (j=i+1; j<N; j++)
if (a[min]>a[j]) min =j;
temp=a[min]; a[min]=a[i]; a[i]=temp; /* 数据交换 */
}
printf("\nThe sorted numbers: \n"); /* 输出排序结果 */
for (i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n");
}
/*******从大到小排列****已仿真**************/
#include "REG51.H"
#include "stdio.H"
int i,j,p,q,s,
a[10]={12,22,52,32,25,51,23,14,82,36};
void main()
{
TMOD=0X20;
TI=1;
printf("\n input 10 numbers:\n");
for(i=0;i<10;i++)
{
p=i;q=a[i];
for(j=i+1;j<10;j++)
if(q<a[j]) { p=j;q=a[j]; }
if(i!=p)
{
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%3d",a[i]);
}
}
三 printf输出格式
d i 以带符号的十进制形式输出整数(正数不输出符号)
o 以八进制无符号形式输出整数(不输出前导符o)
x,X 以十六进制无符号形式输出整数(不输出前导符x)
用x则输出十六进制数的a~f时以小写形式输出。用X时则以大写形式输出
u 以无符号十进制形式输出整数
c 以字符形式输出 只输出一个字符
s 输出字符串
f 以小数形式输出单.双精度浮点数,隐含六位小数
c,E 以指数形式输出实数,用e时指数以“e”表示(如1.2e+02),
用E时指数以“E”表示(如1.2E+02)
g,G 选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0 。用G时
若以指数形式输出,则指数以大写表示
四 字符指针打印输出
#include<reg51.h>
#include"stdio.h"
void main(void)
{
int k;
char *pweek[4]={"monday","tuesday","wednesday","thursday",
"friday","satuaday","sunday"}
for(k=0;k<=7;k++)
printf("pweek[%d]=%s\n",kpweek[k]);
}
五 使用scanf函数进行输入
#include<stdio.h>
void main()
{
int a,b,c;
printf("输入 a,b,c\n");
scanf("%d,%d,%d",&a,&b,&c);
printf("a=%d b=%d c=%d\n",a,b,c);
fflush(stdin); }
在Dev-C++上运行程序为:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a,b,c;
printf("输入 a,b,c\n");
scanf("%d,%d,%d",&a,&b,&c);
printf("a=%d ,b=%d ,c=%d",a,b,c);
fflush(stdin);
system("pause");
}
注意上面的scanf("%d,%d,%d",&a,&b,&c);中%d,%d,%d之间有逗号,在输入数据时也要加逗号,如果去掉逗号,输入时就不
用逗号,而用空格,tab键或回车键将各个数据隔开
格式字符说明
%a,%A 读入一个浮点值(仅C99有效)
%c 读入一个字符
%d 读入十进制整数
%i 读入十进制,八进制,十六进制整数
%o 读入八进制整数
%x,%X 读入十六进制整数
%s 读入一个字符串,遇空格、制表符或换行符结束。
%f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
%p 读入一个指针 %u 读入一个无符号十进制整数
%n 至此已读入值的等价字符数
%[] 扫描字符集合
%% 读%符号
附加格式说明字符表修饰符说明
L/l 长度修饰符 输入"长"数据
h 长度修饰符 输入"短"数据
W 整型常数 指定输入数据所占宽度
* 表示本输入项在读入后不赋值给相应的变量
scanf的返回值
scanf的返回值由后面的参数决定 返回值表示成功读入的数据的个数
如: scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。 且返回值为int型.
使用scanf函数时应该注意的问题
1、scanf()中的变量必须使用地址。
2、scanf()的格式控制串可以使用其它非空白字符,但在输入时必须输入这些字符。
3、在用"%c"输入时,空格和“转义字符”均作为有效字符。
问题一
scanf()函数不能正确接受有空格的字符串?如:
I love you!
#include <stdio.h>
int main()
{
char str[80];
scanf("%s",str);
printf("%s",str);
return 0;
}
输入:I love you!
输出:scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,
scanf函数仅在每一个数据域均有数据,并按回车后结束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
所以,上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋值结束,
并忽略后面的"love you!".这里要注意是"love you!"还在键盘缓冲区(关于这个问题,网上我所见的说法都是如此,
但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只
是扫描stdin流,这个残存信息是在stdin中)。我们改动一下上面的程序来验证一下:
#include <stdio.h>
#include<windows.h>
int main()
{
char str[80];
char str1[80];
char str2[80];
scanf("%s",str);/*此处输入:I love you! */
printf("%s",str);
Sleep(5000);/*这里等待5秒,告诉你程序运行到什么地方*/ /*不是sleep(5) 1,函数名是Sleep不是sleep。
2,C/C++中,unsigned Sleep(unsigned)应该是毫秒ms. scanf("%s",str1);/*这两句无需你再输入,是对stdin流再扫描
*/ scanf("%s",str2);/*这两句无需你再输入,是对stdin流再扫描 */ printf("\n%s",str1);
printf("\n%s",str2); return 0; } 输入:I love you!
输出: I love you! 好了,原因知道了,所以结论是:残留的信息 love you是存在于stdin流中,
而不是在键盘缓冲区中。那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[]
格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:
#include "stdio.h"
int main()
{
char string[50];/*scanf("%s",string);不能接收空格符*/
scanf("%[^\n]",string);
printf("%s\n",string); return 0; }
问题二
键盘缓冲区残余信息问题
#include <stdio.h>
int main()
{
int a; char c; do
{
scanf("%d",&a);
scanf("%c",&c);
printf("a=%d c=%c\n",a,c);/*printf("c=%d\n",c);*/
}
while(c!='N'); }
scanf("%c",&c);这句不能正常接收字符,什么原因呢?我们用printf("c=%d\n",c);将C用int表示出来,
启用printf("c=%d\n",c);这一句,看看scanf()函数赋给C到底是什么,结果是c=10 ,ASCII值为10是什么?
换行即\n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),
在这里\r被scanf()函数处理掉了(姑且这么认为吧^_^),
而\n被scanf()函数“错误”地赋给了c.解决办法:可以在两个scanf()函数之后加个fflush(stdin);,
还有加getch() , getchar()也可以,但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。
但是加fflush(stdin);不管什么情况都可行。 ( 函数名: fflush 功 能: 清除一个流
用 法: int fflush(FILE *stream); )
#include <stdio.h>
int main()
{
int a;
char c;
do
{
scanf("%d",&a);
fflush(stdin);
scanf("%c",&c);
fflush(stdin);
printf("a=%d c=%c\n",a,c);
}
while(c!='N');
} 这里再给一个用“空格符”来处理缓冲区残余信息的示例:运行出错的程序:
#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf("%c",&j);/*这里%前没有空格*/
}
} 使用了空格控制符后:
#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf(" %c",&j);/*注意这里%前有个空格*/
}
} 可以运行看看两个程序有什么不同。
问题三
如何处理scanf()函数误输入造成程序死锁或出错?
#include <stdio.h>
int main()
{
int a,b,c; /*计算a+b*/
scanf("%d,%d",&a,&b); c=a+b;
printf("%d+%d=%d",a,b,c);
} 如上程序,如果正确输入a,b的值,那么没什么问题,但是,你不能保证使用者每一次都能正确输入,
一旦输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果,呵呵,这可能所有人都遇到过的问题吧?
解决方法:
scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,
如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,
键盘缓冲区就可能还个有残余信息问题。正确的例程:
#include <stdio.h>
int main()
{
int a,b,c; /*计算a+b*/
while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);
c=a+b;
printf("%d+%d=%d",a,b,c);
}
补充
fflush(stdin)这个方法在GCC下不可用。(在VC6.0下可以) 以下是 C99 对 fflush 函数的定义:
int fflush(FILE *stream); 如果stream指向输出流或者更新流(update stream),并且这个更新流
最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream 指向的文件(如标准输出文件stdout)。
否则,fflush函数的行为是不确定的。 C和C++的标准里从来没有定义过 fflush(stdin)。 fflush(NULL)
清空所有输出流和上面提到的更新流。如果发生写错误,fflush 函数会给那些流打上错误标记,并且返回EOF,
否则返回0。 由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用
fflush(stdin) 是不正确的,至少是移植性不好的。
可采用如下方法: 方法一:
/* 此函数可以和scanf函数一起使用,但使用%c输入时要注意,即此函数只能用于缓冲区非空的情况
*/
#include <stdio.h>
void flush()
{
char c;
while ((c=getchar()) != '\n'&&c!=EOF) ;
}
int main()
{
int a,b,c; /*计算a+b*/
while(scanf("%d,%d",&a,&b)!=2) flush();
c=a+b;
printf("%d+%d=%d",a,b,c);
}
方法二:
使用getchar()代替fflush(stdin)[1]
程序示例:
#include <stdio.h>
int main(int argc, char* argv[])
{
int i, c;
for ( ; ; )
{
fputs("Please input an integer: ", stdout);
scanf("%d", &i);
if
(
feof(stdin) || ferror(stdin) )
{ /* 如果用户输入文件结束标志(或文件已被读完), */
/* 或者发生读写错误,则退出循环 */
/* do something */ break; } /*
没有发生错误,清空输入流。 */ /*
通过 while 循环把输入流中的余留数据“吃”掉 */
while ( (c = getchar()) != '\n' && c != EOF ) ;
/*可直接将这句代码当成fflush(stdin)的替代,直接运行可清除输入缓存流*/
/* 使用 scanf("%*[^\n]"); 也可以清空输入流, */ /* 不过会残留 \n
字符。 */ printf("%d\n", i); } return 0; }
编辑本段发展
使用scanf函数进行输入,必须指定输入的数据的类型和格式,不仅繁琐复杂,
而且很容易出错.C++保留scanf只是为了和C兼容,以便过去用C语言写的程序可以
在C++的环境下运行。C++的编程人员都愿意使用cin进行输入,很少使用scanf。
六 while do while 语句
8、FLASH脚本-while与 do while循环、循环语句的嵌套、组件 二十二、while与 do while循环
在编程的许多问题中都要用到循环结构,比如要对 10 个数字的排序,两个数字之间的比较,如
果采用选择结构,进行的条件分支非常多,所以写的代码也相当长,利用循环结构可快速解决
这个问题,大大提高程序的效率.
ActionScript 语言中可通过四种语句实现程序的循环,分别是 while、do...while、for 循环和
for in 循环语句.它们与 if 语句的最大区别在于只要条件成立,循环里面的程序语句就会不
断地重复执行.而 if语句中的程序代码只可能被执行一次.
while 的格式如下:
while(条件表达式) {
循环体;
}
说明:在运行语句块之前,首先测试条件表达式;如果该测试返回 true,则运行该语句块。
如果该条件为 false,则跳过该语句块,并执行 while 动作语句块之后的第一条语句。其流
程图如图所示. 通常当计数器变量小于某指定值时, 使用循环执行动作。 在每个循环的结尾递增计数器的值,
直到达到指定值为止。此时,件条表达式的返回值不再为 true,且循环结束。
求 1 + 2+ 3+…+100 的和
新建一个 FLASH 文档,在第一帧打开动作面板,输入下列代码:
var i = 1;
var sum = 0;
while (i<=100) {
sum += i;
i++;
}
trace(sum)
代码执行过程:
在上面的循环程序中,变量 i 的初始值是 1,表达式 i<=100 为真,变量 sum 加上 1,然
后 i+1 等于 2。再进行 i<=100 的判断,条件真,sum 再加上 2,i 又加上 2 等于 3,这样
循环执行,i 一直自加到 101,此时条件 i<=100 为假,结束循环。这样程序共进行了 100
次判断,也就是进行了 100 次循环,100 次执行表达式 sum+=i,这样就算出了 1+2+3+…
+100 和。
注意:在循环结构中,应该有使循环趋于结束的语句,在本例的代码中,用变量 i 来控制,
i 不断递加到 101,使条件为假,结束循环。
在前面我们知道 enterFrame 事件也是循环执行的,但是循环结构的执行要快行多,我们通
过下面的小程控来测试 while语句的执行速度:
var t = getTimer()/1000;//开始时间以秒为单位
var i = 0;
while (i<1000) {
i++
}//进行 100 次循环
trace(getTimer()/1000-t+"秒");
//结束时间减去开始时间,即循环所需时间.
用 while语句优化代码
大家还记得在第十四课中我们用加法赋值作了一个鼠标跟随效果, 当时每个字我们都要分别
设置它的_x 和_y。如果有 10个字就要写 20 行语句,如果 100 个字呢,那不是就很麻烦
吗?我们用 while就可以把代码优化了。
打开第十四课鼠标跟随特效源文件,把第 1 帧上的代码删除,选中第 1 个字的影片
剪辑元件,打开动作面板,输入代码:
onClipEvent (enter Frame) {
var i = 1;
while (i<=6) {
_root.mc1._x += (_root._xmouse-_x)/5;
_root.mc1._y += (_root._ymouse-_y)/5;
_root["mc"+i]._x += (_root["mc"+(i-1)]._x-_root["mc"+i]._x)/5+8;
_root["mc"+i]._y += (_root["mc"+(i-1)]._y-_root["mc"+i]._y)/5;
i++;
}
}
说明:
(1)如果字的个数增加了,只需改条件即可,例如是 10 个字,那么只需把条件 i<=6 改为
i<=10 就可以了。
(2)由于我们用了 enter Frame事件,所以第 2 帧就可以不要了。
用 while循环实现批量复制影片剪辑
打开源文件,场景第一帧加上代码:
var i = 1;
var num = 5;
while (i<=num) {
attachMovie("qiu", "qiu"+i, i);
_root["qiu"+i]._x = Stage.width/6*i;
_root["qiu"+i]._y = Stage.height/2
_root["qiu"+i+".txt"] = "qiu"+i;
i++;
}
这段代码作用是复制5 个影片剪辑实例,实例名分别为 qiu1、qiu2、qiu3、qiu4、qiu5,并
实现横向等距离排列。要实现同样的交果,代码的写法有很多,如:
var i = 0
var num = 5;
while (i++<num) {
attachMovie("qiu", "qiu"+i, i);
_root["qiu"+i]._x = Stage.width/6*i;
_root["qiu"+i]._y = Stage.height/2;
_root["qiu"+i+".txt"] = "qiu"+i;
}
或者这样写:
var i = 1
var num = 5;
while (i<=num) {
attachMovie("qiu", "qiu"+i++, i);
_root["qiu"+(i-1)]._x = Stage.width/6*(i-1);
_root["qiu"+(i-1)]._y = Stage.height/2;
_root["qiu"+(i-1)+".txt"] = "qiu"+(i-1);
}
dowhile语句:
do while 语句的格式
do {
循环体;
} while(条件表达式)
说明:和 while 循环语句相反,do while 循环语句是一种先斩后奏的循环语句。不管怎样
do{“和”}之间的程序至少要执行一次,然后再判断条件是否要继续循环。如果 while()里
的条件成立,它继续执行 do 里面的程序语句,直到条件不成立为止。其流程图如图用 do while 语句求和
同样的累加问题:1+2+3+…+100,用 do while语句程序为:
var i = 1;
var sum = 0;
do {
sum = sum+i;
i++;
} while (i<=100);
trace(sum);
程序中的 i 不一定只能加 1,可能加上任意数,比如求 100 以内的偶数之和,用这程这样
表示:
var i = 1;
var sum = 0;
do {
sum += i;
} while ((i += 2)<=100);
trace(sum);
区别 whi le与 dowhile 语句
(1) 选中第 1 帧,打开动作面板,输入下列代码;
var i=1
var j=5
(2) 在场景中创建两个按钮实例,分别测试两种语句的结果,两个按钮上的语句分别为;
on (press) {
while (i<j) {
i++;
}
trace(i);
}
on (press) {do {
i++
} while (i<j);
trace(i)
}
(3) 测试影片,不断地单击按钮
从输出面板可以看出,当程序第一次执行时,就是第一次单击按钮时,。结果都是一样,都
是数字 5。 但多单击一次时, while 语句结果还是 5, 而 do while 语句的测试结果不断加 1,
原因是 do while 语句先执行程序, 再进行条件判断, 所以从第二次单击按钮开始, 变量 i 就
加 1。
小结:
while 与 do_while 结构都可以按照一定的条件循环执行循环体,wihle 结构先判定循环条件,
当条件符合时就执行循环体,按顺序执行完循环体中的语句后,在返回 wihle 语句开始处,重新
判定条件,并以此规则进行循环操作,直到循环条件为 false时终止循环,转而执行 wihle 结构
下面的命令,与 wihle 结构不同的是 do_while 循环结构先执行循环体中的语句,然后判定循
环条件.这就是说 do_while循环结构无论条件是否符合,循环至少执行一次.
二十三、循环语句的嵌套
一个循环体内包含另一个循环体结构,称为循环的嵌套.在这一讲中我们介绍 for 语句的嵌套、for 与while语句的嵌套。
二个for嵌套(乘法九九表)
(1)在舞台上创建一个动态文本,变量名为: “sir”
(2)插入“图层 2”在此第 1 帧输入代码:
var str:String = "";
for (var i = 1; i<=9; i++) {
for (var j = 1; j<=i; j++) {
var k = i*j;
str = str+i+"×"+j+"="+k+(k<10 ? " " : " ")+(j == i ? "\n" : "");
}
}
三个f or嵌套(求水仙花数)
提示:所谓的“水仙花数” ,是指一个三位数,其各位数字的立方和等于该数本身,例如:153 是一个,“水仙花数” ,因为 153 等于 1的立方加上 5 的立方加上 3 的立方。程序如下:
var str:String = "";
var n = 0;
for (var i = 1; i<=9; i++) {
for (var j = 0; j<=9; j++) {
for (var k = 0; k<=9; k++) {
m = i*100+j*10+k;
if(m == i*i*i+j*j*j+k*k*k) {
n++;
str = str+m+(n == 0 ? " " : " ");
}
}
}
}
for语句可以和while语句嵌套使用。(因数分解)
下面我们做一个因数分解的程序。这个实例子 for 语句可以和 while语句嵌套。
(1) 在舞台上创建一个输入文本, 变量名为: “my_txt1” ,再创建一个动态文本, 变量名为: “my_txt2” 。
(2) 创建两个按钮实例,分别用来做分解计算和清空
(3) 添加代码:
“分解”按钮上的代码:
on (release) {
m = Number(my_txt1);
var str:String = m+"=";
var flag = 1;
for (i=2; i<m; i++) {
while (m%i == 0) {
if (flag == 1) {
str = str+""+i;
flag = 0;
} else {
str = str+"×"+i;
}
m = m/i;
}
}
if (m != 1) {
str = str+"×"+m;
}
my_txt2 = str;
}
清空按钮上的代码:
on (release) {
my_txt1 = "";
my_txt2 = "";
}
嵌套复制
(1)打开素材源文件。
(2)选中复制按钮,打开动作脚本面板,添加代码:
on (release) {
for (i=1; i<=4; i++) {
for (j=1; j<=4; j++) {
duplicateMovieClip("mc", "mc"+i+j, i*4+j);
this["mc"+i+j]._x = (i-1)*100;
this["mc"+i+j]._y = (j-1)*100;
this["mc"+i+j+".txt"] = "mc"+i+j;
}
}
}
(3)选中删除按钮,打开动作在板,添加代码:
on (release) {
for (i=1; i<=4; i++) {
for (j=1; j<=4; j++) {
removeMovieClip("mc"+i+j);
}
}
}
说明:本课中的实例理论性较强,牵涉的数学知识较多
二十四、组件
组件是拥有已定义了参数的复杂影片剪辑,这些参数在文档创作时设置。通过参数的设置和使用,我们可以修改组件的外观和行为。每个组件都有自己的AS方法,允许我们设置和修改其选项。
FLASH提供几类组件,它包括数据组件、多媒体组件、UI组件。使用组件时,我们可以使用动作脚本方法添加组件,也可以按下Ctrl+F7组合键打开组件面板。
组件的添加和参数设置
使用组件面板来选择添加组件,按下Ctrl+F7组合键,打开组件面板,将需要的组件拖到场景中。打开属性面板,就可以在属性面板中的参数选项卡中为组件添加参数,并为组件命名和设置组件尺寸及位置。属性面板中的ComboBox组件参数选项卡如图所示
也可以按Alt+F7组合键打开组件检查器,如图所示,我们可以对组件进行设置。
建立ComboBox组件
下面通过使用组件面板来建立组件。
1、按下Ctrl+F7组合键,打开组件面板,选择UI组件类中的ComboBox组件,将它拖入场景中。
2、打开属性面板,在属性面板中的参数选项卡中为组件添加参数。选择labels项,单击labels右面的数据栏,弹出值对话框
3、在值对话框中输入数据项参数。
4、选择rowCount行数项,输入所需要的行数
测试效果
用程序指令控制组件
用程序指令处理组件时事件,有两种方法:一种使用on()函数控制组件,另一种使用Click组件侦听器控制组件。使用on()函数控制组件是FLASH传统的编程思想,容易理解和掌握。使用Click组件侦听器控制组件,是FLASH提倡使用的编程思想,这种方法更符合面向对象的编程特性,程序更安全,功能更强。
使用on()函数控制组件
1、建立组件对象。按下Ctrl+F7组合键,打开组件面板,选择UI组件类中的RadioButton组件,将它拖入场景中。
2、打开属性面板,在属性面板的参数选项卡中为组件添加参数。选择label数据项,在右面的数值栏中输入"选择"
3、对组件进行编程。选中组件,打开动作面板,输入帧指令:
on(click){
trace("选择正确");
}
测试影片,单击"选择"按钮,将在输出面板中输出"选择正确"字样
使用组件侦听器控制组件
将上例中控制组件的on()函数去掉,改为使用组件侦听器控制组件
1、选中场景中的组件,打开属性面板,在属性面板左边,输入组件实例名为"hack"。
2、选择第一帧,输入帧指令:
zt=new Object();//建立侦听器对象
zt.click=function(){
trace("选择正确");
};//为侦听器对象上的click定义一个函数
hack.addEventListener("click",zt);//将组件名为hack的组件注册到侦听对象
组件应用
利用组件制作选择题
1、按下Ctrl+F7组合键,打开组件面板,选择UI组件类中的RadioButton组件,将它拖入场景中。并复制一个RadioButton组件。在场景中建立选择题画面
2、选择左边的RadioButten组件,打开属性面板,在属性面板的参数选项卡中为组件修改参数。
在宽度栏输入60,将该组件的宽度改为60像素宽。
下面我们来解释下该组件的参数作用:
data数据参数:在数据参数栏输入数据15,这个数据将会作为选择题的判断依据。
label标签参数:将标签参数改为"对"。
groupName组名参数:它是很重要的参数,拥有相同组名的单选按钮,同时只能有一个被选中,这样在同一组内就不会出现多个选择。在这个参数栏输入a1。
选择右边的RadioButten组件,在宽度栏同样输入60,将该组件的宽度改成了40像素宽。右边的label标签采纳数栏改成"错",数据栏data中输入数据"13",这个数据将会作为选择题的判断依据,在组名参数栏输入a1
3、选择右下方的文本框,打开属性面板,在左边的文本类型栏中选择动态文本,在文本类型栏下面输入文本框名为"txt"
4、插入新的图层,作为AS层,选中第一帧,输入帧指令:
Listener=new Object();//建立侦听对象
Listener.click=function(hk){//建立侦听对象的click事件函数
if(15==hk.target.selection.data){//判断单选按钮组件中数据栏中的数值是不是等于15
txt.text="选择正确";//如果等于15,将"选择正确"赋予txt文本变量
}else{
txt.text="选择错误";//如果不等于15,将"选择错误"赋予txt文本变量
}
};
a1.addEventListener("click",Listener);//将组名为"a1"的单选按钮注册到侦听对象测试影片