AS3学习之路(6) 简单动画(3 位领导批示)
- 2009-08-10
- 分类:ActionScript
- 作者:银子
- 726 位领导视察
通过定时器或enterFrame来实现对像的改变和时间联系起来以实现动画.
两个公式需要记忆一下:
(1) 计算弧度 radians = angle * Math.PI / 180
(2) 计算度数 angle = radians * 180 / Math.PI
通过定时器或enterFrame来实现对像的改变和时间联系起来以实现动画.
两个公式需要记忆一下:
(1) 计算弧度 radians = angle * Math.PI / 180
(2) 计算度数 angle = radians * 180 / Math.PI
一个拖动对象的例子..重点学习的是: startDrag, stopDrag, dropTarget, setChildIndex 等方法的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | package { import flash.display.Sprite; import flash.display.DisplayObject; import flash.events.MouseEvent; import flash.geom.Point; import flash.filters.DropShadowFilter; public class ClassDrag extends Sprite { private var _red:Sprite; private var _blue:Sprite; private var _green:Sprite; private var _white:Sprite; // 被拖动对象原始坐标 private var _startingLocation:Point; // 构造函数 public function ClassDrag() { init(); } // 初始化 private function init():void { _red = new Sprite(); createRectangle(_red, 0xff0000, 10, 10, 20, 20); _blue = new Sprite(); createRectangle(_blue, 0x0000ff, 10, 35, 20, 20); _green = new Sprite(); createRectangle(_green, 0x00cc00, 10, 60, 20, 20); _white = new Sprite(); createRectangle(_white, 0xf0f0f0, 40, 10, 300, 300, false); } // 创建矩型 private function createRectangle(rectangle:Sprite, color:uint, x:uint, y:uint, width:uint, height:uint, drag:Boolean = true):void { rectangle.graphics.beginFill(color); rectangle.graphics.drawRect(x, y, width, height); rectangle.graphics.endFill(); addChild(rectangle); if(drag) { // 侦听事件 rectangle.addEventListener(MouseEvent.MOUSE_DOWN, pickup); rectangle.addEventListener(MouseEvent.MOUSE_UP, place); } } // 拖动 private function pickup(event:MouseEvent):void { // 保存原始坐标 _startingLocation = new Point(); _startingLocation.x = event.target.x; _startingLocation.y = event.target.y; // 开始拖动 event.target.startDrag(); // 加上阴影 event.target.filters = [new DropShadowFilter()]; // 拖动对象最前显示 setChildIndex(DisplayObject(event.target), numChildren - 1); } // 拖动结束 private function place(event:MouseEvent):void { // 拖动结束 event.target.stopDrag(); // 清除阴影 event.target.filters = null; // 检测是否已经移动到目标区域 if(event.target.dropTarget == _white) { var color:uint; switch(event.target) { case _red: color = 0xff0000; break; case _blue: color = 0x0000ff; break; case _green: color = 0x00cc00; break; } // 重新创建目标区域 _white.graphics.clear(); createRectangle(_white, color, 40, 10, 300, 300, false); } // 拖放对象回到原位 event.target.x = _startingLocation.x; event.target.y = _startingLocation.y; } } } |
很简单的小例子..主要需要掌握的是绘制图形的 drawRect, lineStyle, moveTo, lineTo等方法..鼠标事件侦听的重要性就不再复述.
p.s. cookbook的确是很好的入门书籍.全是实例.^_^
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package { import flash.display.Sprite; import flash.events.MouseEvent; public class ClassGraphics extends Sprite { private var mySprite:Sprite; // 构造函数 public function ClassGraphics() { this.mySprite = new Sprite(); addChild(this.mySprite); this.mySprite.graphics.beginFill(0x336699); this.mySprite.graphics.drawRect(0, 0, 550, 400); this.mySprite.graphics.endFill(); this.mySprite.addEventListener(MouseEvent.MOUSE_DOWN, spriteMouseDown); this.mySprite.addEventListener(MouseEvent.MOUSE_UP, spriteMouseUp); } // 鼠标按下事件 private function spriteMouseDown(event:MouseEvent):void { this.mySprite.graphics.lineStyle(1, 0, 1); this.mySprite.graphics.moveTo(mouseX, mouseY); this.mySprite.addEventListener(MouseEvent.MOUSE_MOVE, spriteMouseMove); } // 鼠标离开事件 private function spriteMouseUp(event:MouseEvent):void { this.mySprite.removeEventListener(MouseEvent.MOUSE_MOVE, spriteMouseMove); } // 移动事件 private function spriteMouseMove(event:MouseEvent):void { this.mySprite.graphics.lineTo(mouseX, mouseY); } } } |
打算写一个AS3+PHP+MySQL的留言本.(当初学习PHP第一个练习也是留言本-_,-+), 完成部分..使用了Flash CS3 的内置组件: TextInput, TextArea, Label 及 Button
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | package com { import flash.display.Sprite; import flash.events.MouseEvent; import flash.display.StageScaleMode; import flash.display.StageAlign; import fl.controls.Label; import fl.controls.TextInput; import fl.controls.TextArea; import fl.controls.Button; public class ClassMain extends Sprite { private var userName:TextInput; private var userNameLabel:Label; private var message:TextArea; private var messageLabel:Label; private var button:Button; // 构造函数 public function ClassMain() { stage.scaleMode = "noScale"; stage.align = StageAlign.TOP_LEFT; this.initMc(); } // 一点准备工作 private function initMc():void { this.userName = new TextInput(); addInput(this.userName, "userName", 50, 10, 200, 18); this.userNameLabel = new Label(); addLabel(this.userNameLabel, "呢称:", 10, 10, 40, 18); this.message = new TextArea(); addTextArea(this.message, "message", 50, 40, 400, 100); this.messageLabel = new Label(); addLabel(this.messageLabel, "留言:", 10, 40, 40, 18); this.button = new Button(); addButton(this.button, "提交", 350, 150); } // 创建Label private function addLabel(label:Label, text:String, x:uint, y:uint, width:uint, height:uint):void { label.text = text; label.move(x, y); label.setSize(width, height); addChild(label); } // 创建文本框 private function addInput(input:TextInput, name:String, x:uint, y:uint, width:uint, height:uint):void { input.name = name; input.move(x, y); input.setSize(width, height); addChild(input); } // 创建文本域 private function addTextArea(textArea:TextArea, name:String, x:uint, y:uint, width:uint, height:uint):void { textArea.name = name; textArea.move(x, y); textArea.setSize(width, height); textArea.condenseWhite = true; addChild(textArea); } // 创建按钮 private function addButton(button:Button, value:String, x:uint, y:uint):void { button.label= value; button.move(x, y); addChild(button); } } } |
未完成之前..源码还是不放出了..
最近开始学习AS. 在日志上胡乱记录几个实例..以备回顾..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package { import flash.display.MovieClip; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFieldAutoSize; import flash.events.*; import flash.utils.Timer; public class ClassTyped extends MovieClip { var txt:TextField = new TextField(); var txtF:TextFormat = new TextFormat(); var cont:String = new String(); var i:uint = 0; // 构造函数 public function ClassTyped() { cont = "打字效果测试. By Silver..........."; txtF.font = "微软雅黑"; txtF.size = 14; txtF.color = 0x669900; txt.defaultTextFormat = txtF; var timer:Timer = new Timer(120, cont.length); timer.addEventListener(TimerEvent.TIMER, timerHandler); timer.start(); } private function timerHandler(event):void { txt.selectable = false; txt.appendText(cont.charAt(i)); txt.autoSize = TextFieldAutoSize.LEFT; txt.wordWrap = true; txt.width = 200; addChild(txt); txt.x = (txt.stage.stageWidth - txt.width) / 2; txt.y = (txt.stage.stageHeight - txt.height) / 2; i++; } } } |
Perl被设计成90%擅长处理文本,10%处理其余的问题。因此Perl有强大的文本处理能力,包括正则表达式。但有时正则表达式过于复杂,需要一种更简单的方法来处理字符串。
一、使用索引寻找子串
查找的方法依赖于查找的地方。如果在一个大字符串中查找,可以使用index函数。
Perl查找子串第一次在大字符串中出现的地方,返回第一个字符的位置。字符位置是从0开始编号的。如果子串在字符串的开头处找到,则index返回0。如果一个字符后,则返回1,依次类推。如果子串不存在,则返回-1。
index函数总是报告子串出现的第一个位置。可以使用可选的第三个参数要求它从后面的某个地方开始查询,它会告诉index从什么位置开始。
NOTE:通常不能重复的查找某个子串,除非使用了循环。
如果想知道某个子串最后出现的位置。可以使用rindex 函数来做到。
rindex函数也有可选的第三个参数,它给出的是可能的最大值。
一、在目录树上移动
程序在某个工作目录(working directory)下运行,这是相对路径的起点。
chdir可以改变工作目录。它和Unix shell,Win command下的cd命令类似。
chdir "/test" or die "打开目录出错:$!";
错误发生时将给变量$!赋值。通常应当检查$!的值,因为它将告诉你chdir失败的原因。
工作目录会被Perl启动后的所有进程所继承。但是对于调用Perl的进程的工作目录将不会改变,因此,不能写一个Perl程序来代替shell下的cd命令。
二、Globbing
通常,shell将每个命令行中的任何的文件名模式转换成它所匹配的文件名。这被称作globbing。例如,在echo命令后使用了文件名模式*.pm,shell会将它转换成它所匹配的文件名。
my @all_files = glob "*";
foreach $v (@all_files)
{
print $v."\n";
}
@all_files得到了当前目录下的所有文件,这些文件按照字母排序的,不包括由点(.)开头的文件。
my @all_files = glob ".* *";
foreach $v (@all_files)
{
print $v."\n";
}
这里,我们包括了额外的 点星号(.*) 参数,来得到所有的文件(由点开头的文件,以及不由点开头的文件)。引号中两个项之间的空隔是必须的。
一、文件检测操作
如果程序会建立新的文件,在程序创建新文件之前,我们应先确定是否存在同名的文件,以免重要数据被覆盖掉。对于这种问题,我们可以使用–e选项,检测是否存在相同名字的文件。
例:
$filename = 'phper7.rar'; die "$filename 已经存在.\n" if -e $filename;
检测文件的选项是由连接线(-)和一个字母组成,字母指测试的类型,后接被测试的文件名或文件句柄。大多数选项返回true/false值,但有少数例外。
(1)-r, -w, -x以及-o检测相应的属性对effective user 或group ID是否为真,它是指实际负责运行此程序的用户。
(2)Unix文件系统包括几种类型,分别可有-f, -d, -l, -S, -p, -b, 以及-c检测,任何一种必属于其中之一。
(3)时间检测,-M, -A, -C(均大写),返回系统最后一次修改,访问,以及索引节点被修改到现在的天数。
(4)-T和-B分别检测一个文件是文本的还是二进制的。
(5)当给定的文件句柄是一个TTY(系统函数isatty()的返回结果,不能对文件名使用这个测试)时,-t文件检测项返回true。
一、if else 控制结构
一旦能比较两个值时,就希望能根据这些比较结果作判断。和别的语言类似,Perl中也提供了if控制结构。
如果需要另一种选择,可以使用关键字else。
NOTE:花括号是必须的(这一点和C,php不同)。
二、while 控制结构
while 语句可以循环执行其内部的一块代码直到其条件非真。
条件中真假值的判断和if结构中是一样的。和if控制结构相同,花括号是必须的。判断条件在迭代前执行,如果条件为假,则一次也不执行。
三、foreach 控制结构
foreach 从列表(数组)的第一个元素一直循环执行到最后一个元素,一次迭代一个。
foreach $list (qw/一 二 三/)
{
print "$list\n";
}
foreach 控制变量每一次迭代从列表中取出一个新值。
可以通过正则表达式来改变文本。到目前为止,只介绍过怎么匹配模式。现在,我们将向你演示怎样通过模式来改变字符串中相应地部分。
一、使用s///进行替换
如果将 m// 这个模式匹配看作同文字处理器的 查询(search) 类似的功能,那Perl中 s/// 操作的则类似于 查询并替换(search and replace) 。它将替换变量中模式所匹配上的部分。
$_ ="我喜欢打球"; s/很喜欢/不喜欢/; #很喜欢被不喜欢替换掉 print "$_\n";
如果没有匹配上,则什么也不会发生,此变量也不会有任何更改。
s///会返回一个Boolean 值。如果成功替换则返回true;否则返回false。
1.使用 /g 进行全局替换
在前面的例子中你可能已经注意到,s///值进行一次替换,无论是否还有地方还能匹配上。当然,这只是默认的行为。修饰符 /g 要求s///将不相重叠的所有匹配上的部分都进行替换。
$_ = "哇,好大的棉花糖哇!"; s/哇/哟/g; print "$_";
全局替换的一个常用地方是将多个空格用单个空格替换掉。
2.不同的分隔符
如同m//和qw//一样,我们也可以改变s///的分隔符。但这里使用了3个分隔符,因此有些不同。
通常的(非配对的)字符,由于没有左字符和右字符的区别,则可以像使用正斜线(/)那样使用。
如果使用的是配对的字符,也就是说其左字符和右字符不的,则必需使用两对:一对存放模式,一对存放替换的字符串。分隔符甚至可以是不同的。