2008年9月27日星期六

《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。

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)

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 的时间怪怪的

关于取色器

今天下午在论坛里提了一个问题
高手真多


颜色填充问题
我在循环里生成六个矩形
这六个矩形要用不同的颜色(但是这六个颜色是渐变的)来填充
比如像这样
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

一个很好玩的颜色代码:

var setBtnColor:ColorTransform=new ColorTransform();


在调用函数里写:
setBtnColor.color=0x123456;
selectColor.transform.colorTransform=setBtnColor;
就可以改变名为selectColor
当然,你把0x123456换成一个变量
就可以动态改变颜色

卡在颜色这里了

从 HSL 到 RGB 的转换
给定 HSL 空间中的 (h, s, l) 值定义的一个顏色,带有 h 在指示色相角度的值域 [0, 360) 中,分别表示饱和度和亮度的 s 和 l 在值域 [0, 1] 中,相应在 RGB 空间中的 (r, g, b) 三原色,带有分别对应于红色、绿色和蓝色的 r, g 和 b 也在值域 [0, 1] 中,它们可计算為:

首先,如果 s = 0,则结果的顏色是非彩色的、或灰色的。在这个特殊情况,r, g 和 b 都等於 l。注意 h 的值在这种情况下是未定义的。

当 s ≠ 0 的时候,可以使用下列过程: