颜色转换
flash.geom.ColorTransform 类及其方法
任何显示对象都有一个属性叫作 transform ,其中包括一些不同的属性用于缩放,旋转,定位和改变影片颜色,影响颜色属性的就是 colorTransform
mySprite.transform.colorTransform
ColorTransform 对象的构造函数如下:
ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier, redOffset, greenOffset, blueOffset, alphaOffset)
转换一个特殊颜色通道的公式如下,以红色通道为例:
newRed = oldRed * redMultiplier + redOffset;
[Embed(source="picture.jpg")]????????
位图(Bitmaps)
BitmapData ,没有继承自 DisplayObject,所有不能直接添加对象。
这就是为什么要有 Bitmap 类的原因, Bitmap 类几乎始终都有一个函数作为 BitmapData 实例的容器
EG:
var myBitmapData:BitmapData = new BitmapData(100, 100, false, 0xff0000);
var myBitmap:Bitmap = new Bitmap(myBitmapData);
addChild(myBitmap);
setPixel 使用24位色彩值忽略了 alpha 通道,
setPixel32 “32”版的则使用32位色彩值其中包括了透明度信息
读取和嵌入资源
一种是在动画播放时将资源读入,这就是我们所熟知的读取(loading)。另一种方法是在 SWF 编译时嵌入(embed)资源。
[Embed]元数据(metadata) 标签
[Embed(source="picture.jpg")] private var Image:Class;
现在可以使用这个变量创建一个新的资源实例,如下: var img:Bitmap = new Image();
本章重要公式
转换为十进制: trace(hexValue);
十进制转换为十六进制: trace(decimalValue.toString(16));
颜色合成:
color24 = red << 16 | green << 8 | blue;
color32 = alpha << 24 | red << 16 | green << 8 | blue;
颜色提取:
red = color24 >> 16;
green = color24 >> 8 & 0xFF;
blue = color24 & 0xFF; alpha = color32 >> 24;
red = color32 >> 16 & 0xFF; green = color32 >> 8 & 0xFF;
blue = color232 & 0xFF;
过控制点的曲线:
// xt, yt is the point you want to draw through
// x0, y0 and x2, y2 are the end points of the curve
x1 = xt * 2 – (x0 + x2) / 2;
y1 = yt * 2 – (y0 + y2) / 2;
moveTo(x0, y0);
curveTo(x1, y1, x2, y2);
2008年9月30日星期二
2008年9月27日星期六
[千斤顶]一天一个类
一天一个类
改从顶级包里的类开始
9.27
ArgumentError 类表示一种错误,如果函数提供的参数与为该函数定义的参数不一致,则会出现该错误。
例如,如果在调用函数时使用了错误的参数数目、不正确的参数类型或无效参数,则会发生此错误。
改从顶级包里的类开始
9.27
ArgumentError 类表示一种错误,如果函数提供的参数与为该函数定义的参数不一致,则会出现该错误。
例如,如果在调用函数时使用了错误的参数数目、不正确的参数类型或无效参数,则会发生此错误。
《making things move》笔记(第四章)(2)
使用 beingGradientFill 创建渐变填充
beginGradientFill(fillType, colors, alpha, ratios, matrix)
fillType: 填充类型,非常简单,用一个字符串表示,这两个值中的一个:”linear”或”radial”
可以导入 GradientType 类然后输入 GradientType.LINEAR 或 GradientType.RADIAL。
后面每一个参数都是一个数组,因为需要传入至少两个以上的 colors,alphas 及 ratios。
graphics.beginGradientFill(GradientType.LINEAR, [0xffffff, 0x000000], [1, 1], [0, 255], matrix);
matrix(矩阵) 参数
var matrix:Matrix = new Matrix();
matrix.createGradientBox(width, height, rotation, x, y);
不要忘记在类的开始处导入 flash.geom.Matrix 类。
如果仅指定 width 和 height,最后三个值默认为 0。
beginGradientFill(fillType, colors, alpha, ratios, matrix)
fillType: 填充类型,非常简单,用一个字符串表示,这两个值中的一个:”linear”或”radial”
可以导入 GradientType 类然后输入 GradientType.LINEAR 或 GradientType.RADIAL。
后面每一个参数都是一个数组,因为需要传入至少两个以上的 colors,alphas 及 ratios。
graphics.beginGradientFill(GradientType.LINEAR, [0xffffff, 0x000000], [1, 1], [0, 255], matrix);
matrix(矩阵) 参数
var matrix:Matrix = new Matrix();
matrix.createGradientBox(width, height, rotation, x, y);
不要忘记在类的开始处导入 flash.geom.Matrix 类。
如果仅指定 width 和 height,最后三个值默认为 0。
2008年9月26日星期五
《making things move》笔记(第四章)(1)
第四章 渲染技术
――常识:API 是什么,它是应用程序接口(Application Programming Interface)的缩写。总的来说,API 是指在程序中使用的一些属性和方法来访问某些相关的行为和属性。
FLASH的色彩知识:
将十六进制转换为十进制:trace(0xAC05A2);
将十进制转换为十六进制要用到 toString(16)函数,如:
trace((11273634).toString(16));使用这个数,要加上0x。
色彩值永远都是正数,并有可能超出 int 的值域范围,所以要使用 uint 来存储它们。
色彩合成
如何将红、绿、蓝三种颜色值组成一个有效的颜色值,这是个普遍的问题。
假设有三个变量 red,green,blue,每个变量里面保存一个 0 到 255 之间的数。
下面是这个公式:
color24 = red << 16 | green << 8 | blue;
加入透明度后,建立一个32位色彩值,公式如下:
color32 = alpha << 24 | red << 16 | green << 8 | blue;
位操作符是 << ,是一个按位左移操作符
比如,红色值(red)为 0xFF 或 255,可以由二进制表示为:
11111111
将它向左移动 16 位,结果是:
111111110000000000000000
绿色值(green)为 0x55(十进制 85)
蓝色值为 0xF3(十进制 243)
这样我们总共就拥有了三组数:
111111110000000000000000
000000000101010100000000
000000000000000011110011
使用或(OR)运算,符号是 | 。它会将两组数的每个二进制位进行比较,如果两个之中有一个数为1,那么结果就为 1,如果两个数都为 0,那么结果就为 0。
重要:::
var color24:Number = 0xFF << 16 | 0x55 << 8 | 0xF3; 或者:
var color24:Number = 255 << 16 | 85 << 8 | 243;
(使用二进制操作是 ActionScript 中最快的运算,因为它们属于低级运算。)
获取颜色值
假如有这样一个数 0xFF55F3,要从中提取 red, green, blue 的值。
red = color24 >> 16;
green = color24 >> 8 & 0xFF;
blue = color24 & 0xFF;
& (And)操作符
如果两个都是1那么结果就为 1,如果其中有一个为 0,那么结果就为 0。
绘图对象
直接访问绘图方法,我们可以这样写: mySprite.graphics.lineTo(100, 100);
使用 clear 删除绘制
这个命令中对其它 graphics 绘制的图像不起作用。。。。这个是什么意思。我要验证――
大概写了一个画线
package {
import flash.display.Sprite;
import flash.events.*;
import flash.utils.Timer
public class DrawingApp extends Sprite {
var button:Sprite=new Sprite()
var b:Number
var c:Number
public function DrawingApp() {
init();
button.buttonMode=true
button.graphics.beginFill(0x000000)
button.graphics.drawCircle(0,0,20)
button.graphics.endFill()
addChild(button)
//graphics.lineStyle(line(1))
graphics.lineStyle(1)
}
/*private function line(a:Number){
}*/
private function onclick(e:MouseEvent):void{
graphics.clear()
//graphics.lineStyle(line(1))
graphics.lineStyle(1)
}
private function init(){
stage.addEventListener(MouseEvent.MOUSE_DOWN,ondown)
stage.addEventListener(MouseEvent.MOUSE_UP,onup)
}
private function ondown(e:MouseEvent):void{
graphics.moveTo(mouseX,mouseY)
stage.addEventListener(MouseEvent.MOUSE_MOVE,onmove)
}
private function onup(e:MouseEvent):void{
stage.removeEventListener(MouseEvent.MOUSE_MOVE,onmove)
button.addEventListener(MouseEvent.CLICK,onclick)
}
private function onmove(e:MouseEvent):void{
graphics.lineTo(mouseX,mouseY)
}
}
}
其中 private function line(a:Number){
}
做为一个扩展
希望以后可以写成随鼠标按下时间,越长则a值越大
使用 curveTo 绘制曲线
curveTo(x1, y1, x2, y2),
起点:上一次画线的终点/ moveTo 命令指定画笔的起点/第一次画线默认的起点为0,0。
curveTo 函数中包括两个点。
第一个是控制点影响曲线的形状,
另一个是曲线的终点。
x1 = xt * 2 – (x0 + x2) / 2;
y1 = yt * 2 – (y0 + y2) / 2;
(xt,yt是控制点的实际位置,即mouseX,mouseY)
――常识:API 是什么,它是应用程序接口(Application Programming Interface)的缩写。总的来说,API 是指在程序中使用的一些属性和方法来访问某些相关的行为和属性。
FLASH的色彩知识:
将十六进制转换为十进制:trace(0xAC05A2);
将十进制转换为十六进制要用到 toString(16)函数,如:
trace((11273634).toString(16));使用这个数,要加上0x。
色彩值永远都是正数,并有可能超出 int 的值域范围,所以要使用 uint 来存储它们。
色彩合成
如何将红、绿、蓝三种颜色值组成一个有效的颜色值,这是个普遍的问题。
假设有三个变量 red,green,blue,每个变量里面保存一个 0 到 255 之间的数。
下面是这个公式:
color24 = red << 16 | green << 8 | blue;
加入透明度后,建立一个32位色彩值,公式如下:
color32 = alpha << 24 | red << 16 | green << 8 | blue;
位操作符是 << ,是一个按位左移操作符
比如,红色值(red)为 0xFF 或 255,可以由二进制表示为:
11111111
将它向左移动 16 位,结果是:
111111110000000000000000
绿色值(green)为 0x55(十进制 85)
蓝色值为 0xF3(十进制 243)
这样我们总共就拥有了三组数:
111111110000000000000000
000000000101010100000000
000000000000000011110011
使用或(OR)运算,符号是 | 。它会将两组数的每个二进制位进行比较,如果两个之中有一个数为1,那么结果就为 1,如果两个数都为 0,那么结果就为 0。
重要:::
var color24:Number = 0xFF << 16 | 0x55 << 8 | 0xF3; 或者:
var color24:Number = 255 << 16 | 85 << 8 | 243;
(使用二进制操作是 ActionScript 中最快的运算,因为它们属于低级运算。)
获取颜色值
假如有这样一个数 0xFF55F3,要从中提取 red, green, blue 的值。
red = color24 >> 16;
green = color24 >> 8 & 0xFF;
blue = color24 & 0xFF;
& (And)操作符
如果两个都是1那么结果就为 1,如果其中有一个为 0,那么结果就为 0。
绘图对象
直接访问绘图方法,我们可以这样写: mySprite.graphics.lineTo(100, 100);
使用 clear 删除绘制
这个命令中对其它 graphics 绘制的图像不起作用。。。。这个是什么意思。我要验证――
大概写了一个画线
package {
import flash.display.Sprite;
import flash.events.*;
import flash.utils.Timer
public class DrawingApp extends Sprite {
var button:Sprite=new Sprite()
var b:Number
var c:Number
public function DrawingApp() {
init();
button.buttonMode=true
button.graphics.beginFill(0x000000)
button.graphics.drawCircle(0,0,20)
button.graphics.endFill()
addChild(button)
//graphics.lineStyle(line(1))
graphics.lineStyle(1)
}
/*private function line(a:Number){
}*/
private function onclick(e:MouseEvent):void{
graphics.clear()
//graphics.lineStyle(line(1))
graphics.lineStyle(1)
}
private function init(){
stage.addEventListener(MouseEvent.MOUSE_DOWN,ondown)
stage.addEventListener(MouseEvent.MOUSE_UP,onup)
}
private function ondown(e:MouseEvent):void{
graphics.moveTo(mouseX,mouseY)
stage.addEventListener(MouseEvent.MOUSE_MOVE,onmove)
}
private function onup(e:MouseEvent):void{
stage.removeEventListener(MouseEvent.MOUSE_MOVE,onmove)
button.addEventListener(MouseEvent.CLICK,onclick)
}
private function onmove(e:MouseEvent):void{
graphics.lineTo(mouseX,mouseY)
}
}
}
其中 private function line(a:Number){
}
做为一个扩展
希望以后可以写成随鼠标按下时间,越长则a值越大
使用 curveTo 绘制曲线
curveTo(x1, y1, x2, y2),
起点:上一次画线的终点/ moveTo 命令指定画笔的起点/第一次画线默认的起点为0,0。
curveTo 函数中包括两个点。
第一个是控制点影响曲线的形状,
另一个是曲线的终点。
x1 = xt * 2 – (x0 + x2) / 2;
y1 = yt * 2 – (y0 + y2) / 2;
(xt,yt是控制点的实际位置,即mouseX,mouseY)
2008年9月25日星期四
这两天一直困在颜色的问题里
关于颜色的公式
取色器先到这里。用是可以用了。功能还不完善。算法也没搞清。过一段时间再来看
下面是核心算法
下面是头晕算法--
function hslToRgb(H,S,L) {
var p1,p2;
var rgb=new Array(3);
if (L <= 0.5) {
p2 = L*(1+S);
} else {
p2 = L+S-(L*S);
}
p1=2 * L - p2;
if (S == 0) {
rgb.r=L;
rgb.g=L;
rgb.b=L;
} else {
rgb.r=toRgb(p1,p2,H + 120);
rgb.g=toRgb(p1,p2,H);
rgb.b=toRgb(p1,p2,H - 120);
}
rgb.r*= 255;
rgb.g*= 255;
rgb.b*= 255;
var _rgb=Math.round(rgb.r) * 256 * 256 + Math.round(rgb.g) * 256 + Math.round(rgb.b);
return _rgb;
}
function toRgb(q1,q2,hue) {
if (hue > 360) {
hue=hue - 360;
}
if (hue < 0) {
hue=hue + 360;
}
if (hue < 60) {
return (q1+(q2-q1)*hue/60);
} else if (hue < 180) {
return q2;
} else if (hue < 240) {
return (q1+(q2-q1)*(240-hue)/60);
} else {
return q1;
}
}
调用的时候生成是的6*11的矩阵
private function colors() {
for (var i:uint=0; i<6; i++) {
var _colorBlack:__color=new __color(hslToRgb(0,0,1-i*.2));
pick.addChild(_colorBlack);
_colorBlack.y=i*17;
for (var j:uint=0; j<10; j++) {
var _color:__color=new __color(hslToRgb(36*j,1,.8-i*.1));
pick.addChild(_color);
_color.x=j*17+17;
_color.y=i*17;
}
}
}
P。S。 googleRR 的时间怪怪的
取色器先到这里。用是可以用了。功能还不完善。算法也没搞清。过一段时间再来看
下面是核心算法
下面是头晕算法--
function hslToRgb(H,S,L) {
var p1,p2;
var rgb=new Array(3);
if (L <= 0.5) {
p2 = L*(1+S);
} else {
p2 = L+S-(L*S);
}
p1=2 * L - p2;
if (S == 0) {
rgb.r=L;
rgb.g=L;
rgb.b=L;
} else {
rgb.r=toRgb(p1,p2,H + 120);
rgb.g=toRgb(p1,p2,H);
rgb.b=toRgb(p1,p2,H - 120);
}
rgb.r*= 255;
rgb.g*= 255;
rgb.b*= 255;
var _rgb=Math.round(rgb.r) * 256 * 256 + Math.round(rgb.g) * 256 + Math.round(rgb.b);
return _rgb;
}
function toRgb(q1,q2,hue) {
if (hue > 360) {
hue=hue - 360;
}
if (hue < 0) {
hue=hue + 360;
}
if (hue < 60) {
return (q1+(q2-q1)*hue/60);
} else if (hue < 180) {
return q2;
} else if (hue < 240) {
return (q1+(q2-q1)*(240-hue)/60);
} else {
return q1;
}
}
调用的时候生成是的6*11的矩阵
private function colors() {
for (var i:uint=0; i<6; i++) {
var _colorBlack:__color=new __color(hslToRgb(0,0,1-i*.2));
pick.addChild(_colorBlack);
_colorBlack.y=i*17;
for (var j:uint=0; j<10; j++) {
var _color:__color=new __color(hslToRgb(36*j,1,.8-i*.1));
pick.addChild(_color);
_color.x=j*17+17;
_color.y=i*17;
}
}
}
P。S。 googleRR 的时间怪怪的
关于取色器
今天下午在论坛里提了一个问题
高手真多
颜色填充问题
我在循环里生成六个矩形
这六个矩形要用不同的颜色(但是这六个颜色是渐变的)来填充
比如像这样
for(var i:uint=0;i<6;i++){
graphics.beginFill(color);
graphics.drawRect(0,0,8);
graphics.endFill();
}
里面的color要写成什么样,才能让它是渐变色。直接用RGB来表示简单,还是用HSL表示简单。
我想先让它是同色相的,比如从白的0xffffff,到灰的0xcccccc到0x999999到0x666666到0x333333最后刚好到黑的0x000000
可以了之后再加一个循环,写不同色相的渐变。
不知道我有没有把问题说清楚。麻烦各位高人指点。
里面的color要写成什么样,才能让它是渐变色???
=========================================
一牛人给了答案:
package ziv.utils {
/**
* @Class: ziv.utils.ColorUtil
* @Author ziv.yuan
* @Version: ver 1.0
* @Describe:
*
* @Usage:
*
*/
public class ColorUtil {
public static function getColorBetween(ca:Number=0xFFFFFF, cb:Number=0x0, percent:Number=0.5):Number {
var coa:Object = getColorObject(ca);
var cob:Object = getColorObject(cb);
var cre:Object = getColorObject(0);
percent = percent > 1 ? 1 : percent < 0 ? 0: percent;
cre["R"] = Math.round((cob["R"]-coa["R"])*percent) + coa["R"];
cre["G"] = Math.round((cob["G"]-coa["G"])*percent) + coa["G"];
cre["B"] = Math.round((cob["B"]-coa["B"])*percent) + coa["B"];
return cre["R"]<<16|cre["G"]<<8|cre["B"];
}
public static function getColorObject(c:Number):Object {
var rc:Object = {};
rc["R"] = c >> 16 & 0xFF;
rc["G"] = c >> 8 & 0xFF;
rc["B"] = c & 0xFF;
return rc;
}
}
}
根据百分比取中间色的类
LZ的6个颜色分别是
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 0/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 1/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 2/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 3/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 4/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 5/5);
还是不懂算法--可怜的
高手真多
颜色填充问题
我在循环里生成六个矩形
这六个矩形要用不同的颜色(但是这六个颜色是渐变的)来填充
比如像这样
for(var i:uint=0;i<6;i++){
graphics.beginFill(color);
graphics.drawRect(0,0,8);
graphics.endFill();
}
里面的color要写成什么样,才能让它是渐变色。直接用RGB来表示简单,还是用HSL表示简单。
我想先让它是同色相的,比如从白的0xffffff,到灰的0xcccccc到0x999999到0x666666到0x333333最后刚好到黑的0x000000
可以了之后再加一个循环,写不同色相的渐变。
不知道我有没有把问题说清楚。麻烦各位高人指点。
里面的color要写成什么样,才能让它是渐变色???
=========================================
一牛人给了答案:
package ziv.utils {
/**
* @Class: ziv.utils.ColorUtil
* @Author ziv.yuan
* @Version: ver 1.0
* @Describe:
*
* @Usage:
*
*/
public class ColorUtil {
public static function getColorBetween(ca:Number=0xFFFFFF, cb:Number=0x0, percent:Number=0.5):Number {
var coa:Object = getColorObject(ca);
var cob:Object = getColorObject(cb);
var cre:Object = getColorObject(0);
percent = percent > 1 ? 1 : percent < 0 ? 0: percent;
cre["R"] = Math.round((cob["R"]-coa["R"])*percent) + coa["R"];
cre["G"] = Math.round((cob["G"]-coa["G"])*percent) + coa["G"];
cre["B"] = Math.round((cob["B"]-coa["B"])*percent) + coa["B"];
return cre["R"]<<16|cre["G"]<<8|cre["B"];
}
public static function getColorObject(c:Number):Object {
var rc:Object = {};
rc["R"] = c >> 16 & 0xFF;
rc["G"] = c >> 8 & 0xFF;
rc["B"] = c & 0xFF;
return rc;
}
}
}
根据百分比取中间色的类
LZ的6个颜色分别是
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 0/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 1/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 2/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 3/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 4/5);
ColorUtil.getColorBetween(0xFFFFFF, 0x0, 5/5);
还是不懂算法--可怜的
AS3一些网摘 关于SETTER/GETTER
从天地会一个贴子里看到的
解答了我关于SETTER/GETTER的疑惑
原文:http://www.asarea.cn/showdiary.jsp?id=155
这是我总结的一些
setter和getter的妙用
以前在写c++代码时经常在想java怎么那么傻,搞个什么setter和getter出来,既然留了门,那不就等于public么,不过最近在as里用起来,感觉有些地方还是很不错的。
A、setter或者getter一个不是普通的成员变量,假定某类中有一个sprite,我们总是要在类内部获取该sprite的高、宽,每次都***.width, ***.height岂不是很累,我们可以
private function get ...():Number{return ***.width};
以后直接...即可,代码看起来也要舒服很多。
B、setter不一定要和某成员变量联系起来,譬如
public function set data(...)...
,我们可以在set中做很多工作,譬如把data转换为我们需要的数据,根据数据刷新显示等等,不一定是要有一个data属性与之相对应!
当然还有很多,连flex的数据绑定就是setter的强大功力体现,自己慢慢体会吧
======================================
getXX()来代替 get XX(),效率也高点~
只不过带空格的,使用的时候是 xx=myClass.XX
不带空格的,使用的时候是 xx=myClass.getXX()
==================================================================
其实用private+ getter setter是为了增强封装性!
你想,如果把变量暴露给外部使用,假如后期,需求
上要对这个变量先进行些处理,那你就得改N个你
调用它的地方,而如果是用了getter和setter,那你
只要改这两个方法就可以 ...
=================================================================
要用get、set
1需要创建只读或只写属性的时候用,访问控制
2除了提供属性访问,还要做额外事情,例如计访问属性的次数、trace等等,灵活扩展
一种情况要注意
本着类不能太裸露的原则,不要滥用get、set
解答了我关于SETTER/GETTER的疑惑
原文:http://www.asarea.cn/showdiary.jsp?id=155
这是我总结的一些
setter和getter的妙用
以前在写c++代码时经常在想java怎么那么傻,搞个什么setter和getter出来,既然留了门,那不就等于public么,不过最近在as里用起来,感觉有些地方还是很不错的。
A、setter或者getter一个不是普通的成员变量,假定某类中有一个sprite,我们总是要在类内部获取该sprite的高、宽,每次都***.width, ***.height岂不是很累,我们可以
private function get ...():Number{return ***.width};
以后直接...即可,代码看起来也要舒服很多。
B、setter不一定要和某成员变量联系起来,譬如
public function set data(...)...
,我们可以在set中做很多工作,譬如把data转换为我们需要的数据,根据数据刷新显示等等,不一定是要有一个data属性与之相对应!
当然还有很多,连flex的数据绑定就是setter的强大功力体现,自己慢慢体会吧
======================================
getXX()来代替 get XX(),效率也高点~
只不过带空格的,使用的时候是 xx=myClass.XX
不带空格的,使用的时候是 xx=myClass.getXX()
==================================================================
其实用private+ getter setter是为了增强封装性!
你想,如果把变量暴露给外部使用,假如后期,需求
上要对这个变量先进行些处理,那你就得改N个你
调用它的地方,而如果是用了getter和setter,那你
只要改这两个方法就可以 ...
=================================================================
要用get、set
1需要创建只读或只写属性的时候用,访问控制
2除了提供属性访问,还要做额外事情,例如计访问属性的次数、trace等等,灵活扩展
一种情况要注意
本着类不能太裸露的原则,不要滥用get、set
一个很好玩的颜色代码:
var setBtnColor:ColorTransform=new ColorTransform();
在调用函数里写:
setBtnColor.color=0x123456;
selectColor.transform.colorTransform=setBtnColor;
就可以改变名为selectColor
当然,你把0x123456换成一个变量
就可以动态改变颜色
在调用函数里写:
setBtnColor.color=0x123456;
selectColor.transform.colorTransform=setBtnColor;
就可以改变名为selectColor
当然,你把0x123456换成一个变量
就可以动态改变颜色
卡在颜色这里了
2008年9月24日星期三
《making things move》笔记(第三章)(2)
双角波形
一种思想:
设置两套数值 angle1 和 angle2,
为它们各自增加一个中心点(center)和速度(speed)值。
用一个正弦波作为一种属性,另一个正弦波作为另一种属性,比如位置或缩放。
从 Random.as 文档类开始,这里面拥有两个角度(angle),两个速度(speed)和两个中心点(center),将其中一个角(angle1)作为小球的X坐标,另一个角(angle2)作为Y坐标。运行程序时,就像只虫子在房间里飞
将ball替换成点。可以画出轨迹。
xpos=centerX+Math.sin(angleX)*range;
ypos=centerY+Math.sin(angleY)*range;
angleX+=xspeed;
angleY+=yspeed;
graphics.lineTo(xpos,ypos)
轨迹图――
圆形运动
在执行物体移动的动画时,完全可以使用余弦来代替正弦。
实际上,余弦和正弦协同工作时,才能形成一个更加有用的功能:使物体沿圆形运动
记住用正弦函数计算 y ,用余弦函数计算 x。
ball.x = centerX + Math.cos(angle) * radius;
ball.y = centerY + Math.sin(angle) * radius;
angle += speed;
椭圆运动
。如果让x和y运动的大小相同,那么就得到一个圆。如果想得到一个椭圆形,我们只需要在计算x和y位置时使用不同的半径值: radiusX 和 radiusY 。
ball.x = centerX + Math.cos(angle) * radiusX;
ball.y = centerY + Math.sin(angle) * radiusY;
angle += speed;
勾股定理
在 Flash 中,最常见的情况是我们只知道两条直角边的长度要求出斜边的长度。比如,求出两点间的距离。
dx = x2 – x1;
dy = y2 – y1;
dist = Math.sqrt(dx*dx + dy*dy);
在学到碰撞检测时,我们会发现内置的碰撞检测(hit testing)方法存在着先天不足,然后会看到使用勾股定理公式完成基于距离(distance-based)碰撞检测方法。它还非常适合用于计算重力或弹力等,因为这些力的大小与两个物体之间的距离成正比。
===========================================
本章重要公式
基本三角函数的计算:
角的正弦值 = 对边 / 斜边
角的余弦值 = 邻边 / 斜边
角的正切值 = 对边 / 邻边
角度制与弧度制的相互转换:
弧度 = 角度 * Math.PI / 180
角度 = 弧度 * 180 / Math.PI
向鼠标旋转(或向某点旋转):
// substitute mouseX, mouseY with the x, y point to rotate to
dx = mouseX - sprite.x;
dy = mouseY - sprite.y;
sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;
创建波形:
// assign value to x, y or other property of sprite or movie clip,
// use as drawing coordinates, etc.
public function onEnterFrame(event:Event){
value = center + Math.sin(angle) * range;
angle += speed; }
创建圆形:
// assign position to x and y of sprite or movie clip,
// use as drawing coordinates, etc.
public function onEnterFrame(event:Event){
xposition = centerX + Math.cos(angle) * radius;
yposition = centerY + Math.sin(angle) * radius;
angle += speed; }
创建椭圆:
// assign position to x and y of sprite or movie clip,
// use as drawing coordinates, etc.
public function onEnterFrame(event:Event){
xposition = centerX + Math.cos(angle) * radiusX;
yposition = centerY + Math.sin(angle) * radiusY;
angle += speed; }
计算两点间距离:
// points are x1, y1 and x2, y2
// can be sprite / movie clip positions, mouse coordinates, etc.
dx = x2 – x1;
dy = y2 – y1;
dist = Math.sqrt(dx*dx + dy*dy);
一种思想:
设置两套数值 angle1 和 angle2,
为它们各自增加一个中心点(center)和速度(speed)值。
用一个正弦波作为一种属性,另一个正弦波作为另一种属性,比如位置或缩放。
从 Random.as 文档类开始,这里面拥有两个角度(angle),两个速度(speed)和两个中心点(center),将其中一个角(angle1)作为小球的X坐标,另一个角(angle2)作为Y坐标。运行程序时,就像只虫子在房间里飞
将ball替换成点。可以画出轨迹。
xpos=centerX+Math.sin(angleX)*range;
ypos=centerY+Math.sin(angleY)*range;
angleX+=xspeed;
angleY+=yspeed;
graphics.lineTo(xpos,ypos)
轨迹图――
圆形运动
在执行物体移动的动画时,完全可以使用余弦来代替正弦。
实际上,余弦和正弦协同工作时,才能形成一个更加有用的功能:使物体沿圆形运动
记住用正弦函数计算 y ,用余弦函数计算 x。
ball.x = centerX + Math.cos(angle) * radius;
ball.y = centerY + Math.sin(angle) * radius;
angle += speed;
椭圆运动
。如果让x和y运动的大小相同,那么就得到一个圆。如果想得到一个椭圆形,我们只需要在计算x和y位置时使用不同的半径值: radiusX 和 radiusY 。
ball.x = centerX + Math.cos(angle) * radiusX;
ball.y = centerY + Math.sin(angle) * radiusY;
angle += speed;
勾股定理
在 Flash 中,最常见的情况是我们只知道两条直角边的长度要求出斜边的长度。比如,求出两点间的距离。
dx = x2 – x1;
dy = y2 – y1;
dist = Math.sqrt(dx*dx + dy*dy);
在学到碰撞检测时,我们会发现内置的碰撞检测(hit testing)方法存在着先天不足,然后会看到使用勾股定理公式完成基于距离(distance-based)碰撞检测方法。它还非常适合用于计算重力或弹力等,因为这些力的大小与两个物体之间的距离成正比。
===========================================
本章重要公式
基本三角函数的计算:
角的正弦值 = 对边 / 斜边
角的余弦值 = 邻边 / 斜边
角的正切值 = 对边 / 邻边
角度制与弧度制的相互转换:
弧度 = 角度 * Math.PI / 180
角度 = 弧度 * 180 / Math.PI
向鼠标旋转(或向某点旋转):
// substitute mouseX, mouseY with the x, y point to rotate to
dx = mouseX - sprite.x;
dy = mouseY - sprite.y;
sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;
创建波形:
// assign value to x, y or other property of sprite or movie clip,
// use as drawing coordinates, etc.
public function onEnterFrame(event:Event){
value = center + Math.sin(angle) * range;
angle += speed; }
创建圆形:
// assign position to x and y of sprite or movie clip,
// use as drawing coordinates, etc.
public function onEnterFrame(event:Event){
xposition = centerX + Math.cos(angle) * radius;
yposition = centerY + Math.sin(angle) * radius;
angle += speed; }
创建椭圆:
// assign position to x and y of sprite or movie clip,
// use as drawing coordinates, etc.
public function onEnterFrame(event:Event){
xposition = centerX + Math.cos(angle) * radiusX;
yposition = centerY + Math.sin(angle) * radiusY;
angle += speed; }
计算两点间距离:
// points are x1, y1 and x2, y2
// can be sprite / movie clip positions, mouse coordinates, etc.
dx = x2 – x1;
dy = y2 – y1;
dist = Math.sqrt(dx*dx + dy*dy);
《making things move》笔记(第三章)(1)
我们所讨论的角度,对于计算机来说,就是弧度。
公式:
弧度(radians) = 角度(degrees) * Math.PI /180
角度(degrees) = 弧度(radians) * 180 / Math.PI
FLASH坐标系:
Flash 是基于视频屏幕的坐标系,0,0 点为左上角,如图3-4。X值从左向右不断增大,但Y轴是相反的,
正值向下,负值向上。
所以,角度的计算在 Flash 中是颠倒的。顺时针旋转角度为正角。逆时针就意味着为负角。
三角函数
ActionScript 拥有一套用于计算不同三角关系的三角函数:
正弦,余弦,正切,反正弦,反余弦和反正切
正弦(Sine)
一个角的正弦值等于该角的对边与斜边的比,在 ActionScript中,使用 Math.sin(angle) 函数来表示。(angle: 将结果转换为弧度制)
Eg: Math.sin(30 * Math.PI / 180)
余弦(Cosine)
在 Flash 中,使用 Math.cos(angle) 就可以计算余弦值,余弦的定义为角的邻边与斜边之比
正切(Tangent)
Math.tan(angle)。它反应的是对边与邻边之间的关系
在 ActionScript 中,这个函数并不常用,而使用正弦和余弦的时候要多一些。另外,反正切函数却是非常有用的,后面会讲到,这里请大家记住正切函数的比例关系。
反正弦(Arcsine)和反余弦(Arccosine)
Math.asin(ratio) 和 Math.acos(ratio)
Eg:
Math.asin(0.5) * 180 / Math.PI
Math.acos(0.865) * 180 / Math.PI
反正切(Arctangent)
反正切简单地说就是正切函数的反函数。
Math.atan(ratio)
Math.atan2(y,x),这是 Flash 的另一个反正切函数,两个参数:对边长度与邻边长度。
旋转(Rotation)
var dx:Number = mouseX - arrow.x;
var dy:Number = mouseY - arrow.y;
var radians:Number = Math.atan2(dy, dx);
arrow.rotation = radians * 180 / Math.PI;
把这段代码放入enterFrame事件里。
波形
平滑的上下运动
Math.sin(angle):
如果想让物体上下或左右移动,那么就要用到这个函数。
考虑:使用 0~1~-1~0 的变化来实现这个动画,并且反复地使用这个波形。
例如。一个球类ball
ball.y = stage.stageHeight / 2 + Math.sin(angle) * 50;
ball的Y轴在(舞台宽度)/2的上下五十范围变化
利用这些,再加上X轴方向的速度,可以完成波形运动
ball.x += xspeed;
ball.y = centerY + Math.sin(angle) * range;
angle += yspeed;
ball.scaleX = ball.scaleY = centerScale + Math.sin(angle) * range正弦波还可以在 alpha,rotation 等属性中应用。
公式:
弧度(radians) = 角度(degrees) * Math.PI /180
角度(degrees) = 弧度(radians) * 180 / Math.PI
FLASH坐标系:
Flash 是基于视频屏幕的坐标系,0,0 点为左上角,如图3-4。X值从左向右不断增大,但Y轴是相反的,
正值向下,负值向上。
所以,角度的计算在 Flash 中是颠倒的。顺时针旋转角度为正角。逆时针就意味着为负角。
三角函数
ActionScript 拥有一套用于计算不同三角关系的三角函数:
正弦,余弦,正切,反正弦,反余弦和反正切
正弦(Sine)
一个角的正弦值等于该角的对边与斜边的比,在 ActionScript中,使用 Math.sin(angle) 函数来表示。(angle: 将结果转换为弧度制)
Eg: Math.sin(30 * Math.PI / 180)
余弦(Cosine)
在 Flash 中,使用 Math.cos(angle) 就可以计算余弦值,余弦的定义为角的邻边与斜边之比
正切(Tangent)
Math.tan(angle)。它反应的是对边与邻边之间的关系
在 ActionScript 中,这个函数并不常用,而使用正弦和余弦的时候要多一些。另外,反正切函数却是非常有用的,后面会讲到,这里请大家记住正切函数的比例关系。
反正弦(Arcsine)和反余弦(Arccosine)
Math.asin(ratio) 和 Math.acos(ratio)
Eg:
Math.asin(0.5) * 180 / Math.PI
Math.acos(0.865) * 180 / Math.PI
反正切(Arctangent)
反正切简单地说就是正切函数的反函数。
Math.atan(ratio)
Math.atan2(y,x),这是 Flash 的另一个反正切函数,两个参数:对边长度与邻边长度。
旋转(Rotation)
var dx:Number = mouseX - arrow.x;
var dy:Number = mouseY - arrow.y;
var radians:Number = Math.atan2(dy, dx);
arrow.rotation = radians * 180 / Math.PI;
把这段代码放入enterFrame事件里。
波形
平滑的上下运动
Math.sin(angle):
如果想让物体上下或左右移动,那么就要用到这个函数。
考虑:使用 0~1~-1~0 的变化来实现这个动画,并且反复地使用这个波形。
例如。一个球类ball
ball.y = stage.stageHeight / 2 + Math.sin(angle) * 50;
ball的Y轴在(舞台宽度)/2的上下五十范围变化
利用这些,再加上X轴方向的速度,可以完成波形运动
ball.x += xspeed;
ball.y = centerY + Math.sin(angle) * range;
angle += yspeed;
ball.scaleX = ball.scaleY = centerScale + Math.sin(angle) * range正弦波还可以在 alpha,rotation 等属性中应用。
《making things move》笔记(第一、二章)
onEnterFrame是这本书内容基础。
开始看到一个很有意思的地方:
1.创建一个新的 FLA 文件,并在舞台上绘制一些图形。
2.选中图形按下 F8 键转换为元件。
3.在转换为元件窗口中输入一个名称,并设置为影片剪辑类型。
4.选择为 ActionScript 导出。
随意输入一个类名,不必担心没有这个类,然后点击确定。这个地方很有趣,Flash 找不到这个类,它就会自动生成一个类,并对其进行编译。并不是说 Flash 会创建一个 ActionScript 类文件,但它会在 SWF 中,生成一串字节代码表示一个继承自 Sprite 或 MovieClip 的类。
如,你的类名为 Ball。在文档类或时间轴上,可以这么写:
var ball:Ball = new Ball(); addChild(ball);
这样就在舞台上创建了一个库中的元件
以前我也会这么用。但都是多此一举再建一个空类。原来根本不需要。
--------------------------------
第一、二章讲的都是基础。比较简单。
--------------------------------
开始看到一个很有意思的地方:
1.创建一个新的 FLA 文件,并在舞台上绘制一些图形。
2.选中图形按下 F8 键转换为元件。
3.在转换为元件窗口中输入一个名称,并设置为影片剪辑类型。
4.选择为 ActionScript 导出。
随意输入一个类名,不必担心没有这个类,然后点击确定。这个地方很有趣,Flash 找不到这个类,它就会自动生成一个类,并对其进行编译。并不是说 Flash 会创建一个 ActionScript 类文件,但它会在 SWF 中,生成一串字节代码表示一个继承自 Sprite 或 MovieClip 的类。
如,你的类名为 Ball。在文档类或时间轴上,可以这么写:
var ball:Ball = new Ball(); addChild(ball);
这样就在舞台上创建了一个库中的元件
以前我也会这么用。但都是多此一举再建一个空类。原来根本不需要。
--------------------------------
第一、二章讲的都是基础。比较简单。
--------------------------------
2008年9月17日星期三
2008年9月16日星期二
生成验证码代码
算法:使用FOR循环生成四次随机数。如果随机数是偶数,转化为一个数字。反之,转化为一个字母。
private function GenerateCheckCode():String{
var ran:Number
var number:Number
var code:String
var checkCode:String=""
for (var i:int=0;i<4;i++){
ran=Math.random()
number=Math.round(ran*10000)
if(number%2==0)
code=String.fromCharCode(48+(number%10))
else
code=String.fromCharCode(65+(number%26))
checkCode+=code
}
return checkCode
}
private function GenerateCheckCode():String{
var ran:Number
var number:Number
var code:String
var checkCode:String=""
for (var i:int=0;i<4;i++){
ran=Math.random()
number=Math.round(ran*10000)
if(number%2==0)
code=String.fromCharCode(48+(number%10))
else
code=String.fromCharCode(65+(number%26))
checkCode+=code
}
return checkCode
}
完全手册 FLEX3.0 RIA开发详解 笔记1
ALT+/ 打开代码提示添加注释:
第十四章 FLEX常用组件P180
1.按扭组件Button
2.下拉框组件ComboBox应用于选择一项数据源。属于多值组件eg:有XML id="myXML" 则 dataProvider="{myXML.item.@label}"labelField属性指明下拉框数据绑定至数据源的某一字段,配合dataProvider使用 dataProvider="{myXML.item}" labelField="lable"
3.图象组件Image
4.标签组件Lable显示单行文本
5.多行文本组件TextArea
6.输入框组件TextInput
7.文本编辑组件RichTextEditor
FLEX3.0中不能生成新页面,可以生成新状态(State)
第十四章 FLEX常用组件P180
1.按扭组件Button
2.下拉框组件ComboBox应用于选择一项数据源。属于多值组件
3.图象组件Image
4.标签组件Lable显示单行文本
5.多行文本组件TextArea
6.输入框组件TextInput
7.文本编辑组件RichTextEditor
FLEX3.0中不能生成新页面,可以生成新状态(State)
2008年9月12日星期五
2008年9月11日星期四
2008年9月4日星期四
创建BitmapData对象
8.1 创建BitmapData对象
var bitmap:BitmapData=new BitmapData(100,100,true,0x00ffffff)
//添加到显示列表中.addChild( ) 方法添加的对象必须是flash.display.DisplayObject的子类才行,
而BitmapData 类继承自Object,所以不能直接加到列表中。要加到可视化对象列表中,可使用flash.display.Bitmap类,它是DisplayObject.类的子类,实际上是
BitmapData的一个包装类,允许BitmapData可被显示。
var image:Bitmap=new Bitmap(bitmap)addChild(image)
8.4问题我要载入外部图片作为BitmapData处理
解决办法使用flash.display.Loader 类载入图片,当图片载入完成时,通过loader的content 属性property,它就是个Bitmap。访问Bitmap的bitmapData 属性就在访问载入的图片
讨论通过Loader类载入外部位图。通过URLRequest 对象和位图的URL,监听loader的complete事件确定是否载入完成:
package {import flash.display.Sprite;import flash.display.Loader;import flash.events.Event;import flash.net.URLRequest;public class BitmapLoader extends Sprite {private var _loader:Loader = new Loader( );public function BitmapLoader( ) {_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);_loader.load(new URLRequest("image.jpg"));}}}public function onComplete(event:Event):void {var image:Bitmap = Bitmap(_loader.content);var bitmap:BitmapData = image.bitmapData;addChild(image);}
Bitmap(bitmapData:BitmapData = null, pixelSnapping:String = "auto", smoothing:Boolean = false)
初始化 Bitmap 对象以引用指定的 BitmapData 对象。
var bitmap:BitmapData=new BitmapData(100,100,true,0x00ffffff)
//添加到显示列表中.addChild( ) 方法添加的对象必须是flash.display.DisplayObject的子类才行,
而BitmapData 类继承自Object,所以不能直接加到列表中。要加到可视化对象列表中,可使用flash.display.Bitmap类,它是DisplayObject.类的子类,实际上是
BitmapData的一个包装类,允许BitmapData可被显示。
var image:Bitmap=new Bitmap(bitmap)addChild(image)
8.4问题我要载入外部图片作为BitmapData处理
解决办法使用flash.display.Loader 类载入图片,当图片载入完成时,通过loader的content 属性property,它就是个Bitmap。访问Bitmap的bitmapData 属性就在访问载入的图片
讨论通过Loader类载入外部位图。通过URLRequest 对象和位图的URL,监听loader的complete事件确定是否载入完成:
package {import flash.display.Sprite;import flash.display.Loader;import flash.events.Event;import flash.net.URLRequest;public class BitmapLoader extends Sprite {private var _loader:Loader = new Loader( );public function BitmapLoader( ) {_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);_loader.load(new URLRequest("image.jpg"));}}}public function onComplete(event:Event):void {var image:Bitmap = Bitmap(_loader.content);var bitmap:BitmapData = image.bitmapData;addChild(image);}
Bitmap(bitmapData:BitmapData = null, pixelSnapping:String = "auto", smoothing:Boolean = false)
初始化 Bitmap 对象以引用指定的 BitmapData 对象。
订阅:
博文 (Atom)