2008年10月16日星期四

《making things move》笔记(第十章)

第十章 坐标旋转及角度反弹

简单的坐标旋转
角度应用弧度制来表示。
代码的结构如下所示:
vr = 0.1;
angle = 0;
radius = 100;
centerX = 250;
centerY = 200;
// 在 enterFrame 处理函数中:
sprite.x = centerX + cos(angle) * radius;
sprite.y = centerY + sin(angle) * radius;
angle += vr;

高级坐标旋转
如果物体要绕着某一点旋转,并且以物体本身的位置作为旋转的起点

x1 = cos(angle) * x - sin(angle) * y;
y1 = cos(angle) * y + sin(angle) * x;


坐标旋转:
x1 = Math.cos(angle) * x - Math.sin(angle) * y;
y1 = Math.cos(angle) * y + Math.sin(angle) * x;

反坐标旋转:
x1 = Math.cos(angle) * x + Math.sin(angle) * y;
y1 = Math.cos(angle) * y - Math.sin(angle) * x;

《making things move》笔记(第九章)

--竟然十天没有看这本书了

hitTest 总结
hitTest 的基本设置:
■ 对于矩形影片,使用 hitTestObject(displayObject)。
■ 对于非常小的影片,使用 hitTestPoint(x, y, true)(注意将 shapeFlag 设置为 true)。
■ 对于非常不规则的影片图形,如果不要求非常精确或自定义一些解决方法的话,那么也可以使用 hitTestPoint(x, y, true)。

距离碰撞检测
处理圆形时效果最好
两个物体间距离的方法,
var dx:Number = sprite2.x - sprite1.x;
var dy:Number = sprite2.y - sprite1.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);


例:
private function onEnterFrame(event:Event):void {

var dx:Number = ball2.x - ball1.x;
var dy:Number = ball2.y - ball1.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
if (dist < ball1.radius + ball2.radius) {
trace("hit");
}
}


基本的多物体碰撞检测
numSprites = 6;
for (i = 0; i < numSprites - 1; i++) {
spriteA = sprites[i];
for (j = i + 1; j < numSprites; j++) {
spriteB = sprites[j];
if (spriteA.hitTestObject(spriteB)) {
// do whatever
}
}
}

Math.cos 和 Math.sin 求出目标点:
var angle:Number = Math.atan2(dy, dx);
var tx:Number = ball0.x + Math.cos(angle) * minDist;
var ty:Number = ball0.y + Math.sin(angle) * minDist;
但是大家不要忘记,正弦是对边与斜边之比,而余弦是邻边与斜边之比。
请注意,该角的对边就是 dy,邻边就是 dx,而斜边就是 dist。
所以,我们实际上可以将这三行代码缩短为两行:
var tx:Number = ball0.x + dx / dist * minDist;
var ty:Number = ball0.y + dy / dist * minDist;

距离碰撞检测: // 从 spriteA 和 spriteB 开始 // 如果使用一个空白影片,或影片没有半径(radius)属性 166
// 可以用宽度与高度除以 2。 var dx:Number = spriteB.x - spriteA.x; var dy:Number = spriteB.y - spriteA.y; var dist:Number = Math.sqrt(dx * dx + dy * dy); if (dist < spriteA.radius + spriteB.radius) { // 处理碰撞 }
多物体碰撞检测: var numObjects:uint = 10; for (var i:uint = 0; i < numObjects - 1; i++) { // 使用变量 i 提取引用 var objectA = objects[i]; for (var j:uint = i+1; j //使用变量 j 提取引用 var objectB = objects[j]; // 在 objectA 与 objectB 之间进行碰撞检测 } }

2008年10月7日星期二

《making things move》笔记(第八章)

简单缓动,长形:
var dx:Number = targetX - sprite.x;
var dy:Number = targetY - sprite.y;
vx = dx * easing; vy = dy * easing;
sprite.x += vx;
sprite.y += vy;


简单缓动,中形:
vx = (targetX - sprite.x) * easing;
vy = (targetY - sprite.y) * easing;
sprite.x += vx;
sprite.y += vy;


简单缓动,短形:
sprite.x += (targetX - sprite.x) * easing;
sprite.y += (targetY - sprite.y) * easing;


简单弹性,长形:
var ax:Number = (targetX - sprite.x) * spring;
var ay:Number = (targetY - sprite.y) * spring;
vx += ax;
vy += ay;
vx *= friction;
vy *= friction;
sprite.x += vx;
sprite.y += vy;



简单弹性,中形:
vx += (targetX - sprite.x) * spring;
vy += (targetY - sprite.y) * spring;
vx *= friction;
vy *= friction;
sprite.x += vx;
sprite.y += vy;


简单弹性,短形:
vx += (targetX - sprite.x) * spring;
vy += (targetY - sprite.y) * spring;
sprite.x += (vx *= friction);
sprite.y += (vy *= friction);



偏移弹性运动:
var dx:Number = sprite.x - fixedX;
var dy:Number = sprite.y - fixedY;
var angle:Number = Math.atan2(dy, dx);
var targetX:Number = fixedX + Math.cos(angle) * springLength;
var targetY:Number = fixedX + Math.sin(angle) * springLength;

2008年10月5日星期日

《making things move》笔记(第六章)

设置边界
播放器窗口改变大小后希望舞台的尺寸与播放器尺寸相匹配
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

影片的左上边界将为零,而右下边界将为 stage.stageWidth 和 stage.stageHeight。
如下:
private var left:Number = 0;
private var top:Number = 0;
private var right:Number = stage.stageWidth;
private var bottom:Number = stage.stageHeight;

看它们是否仍在这个空间内,这里可以使用 if 语句
if(ball.x > stage.stageWidth) {
// do something
}
else if(ball.x < 0) {
// do something
}
if(ball.y > stage.stageHeight) {
// do something
}
else if(ball.y < 0)
{ // do something
}
移除对象
1. removeChild(对象名),删除影片或显示对象,会将对象实例从舞台上移除。请注意,被移除的显示对象仍然存在,只是看不到而已。如果要将该对象彻底删除,还应该调用 delete 对象名 将其完全删除。
2. removeEventListener(Event.ENTER_FRAME, onEnterFrame);

因为注册点在中心,所以,可以将宽度的一半保存为 radius 属性。
代码如下:
if(ball.x - ball.radius > stage.stageWidth || ball.x + ball.radius < 0 || ball.y - ball.radius > stage.stageHeight || ball.y + ball.radius < 0) {
removeChild(ball);
}


var ball:Ball=Ball(balls[i]);????????????????????????????????
移除对象
for (var i:Number=balls.length - 1; i > 0; i--) { var ball:Ball=Ball(balls[i]); 97
ball.x+= ball.vx; ball.y+= ball.vy; if (ball.x - ball.radius > stage.stageWidth || ball.x + ball.radius < 0 || ball.y - ball.radius > stage.stageHeight || ball.y + ball.radius < 0) { removeChild(ball); balls.splice(i,1);

重置对象
if (ball.x - ball.radius > stage.stageWidth || ball.x + ball.radius < 0 || ball.y - ball.radius > stage.stageHeight || ball.y + ball.radius < 0) { ball.x = stage.stageWidth / 2; ball.y = stage.stageHeight; ball.vx = Math.random() * 2 - 1; ball.vy = Math.random() * -10 - 10; }

屏幕环绕
var left:Number = 0; var right:Number = stage.stageWidth; var top:Number = 0; var bottom:Number = stage.stageHeight; if (ship.x - ship.width / 2 > right) { ship.x = left - ship.width / 2; } else if (ship.x + ship.width / 2 < left) { ship.x = right + ship.width / 2; } if (ship.y - ship.height / 2 > bottom) { ship.y = top - ship.height / 2; } else if (ship.y < top - ship.height / 2) { ship.y = bottom + ship.height / 2; }

反弹
如果物体超出了左、右边界,只需要使它的 x 速度向量取反。如果超出了上、下边界,只需要让 y 速度向量取反
:vx *= -1 或 vy *= -1。

摩擦力,正确的方法
摩擦力是与速度向量相反的力
var speed:Number = Math.sqrt(vx * vx + vy * vy);
var angle:Number = Math.atan2(vy, vx);
然后就可以从速度向量中减去速度。如果摩擦力大于速度,速度就变为零,计算代码如下: if (speed > friction) {
speed -= friction;
} else {
speed = 0;
}
正弦和余弦将角速度转换回 vx 和 vy,如下:
vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;

摩擦力,简便的方法
vx *= friction; 106
vy *= friction;

本章重要公式

移除出界对象:
if(sprite.x - sprite.width / 2 > right || sprite.x + sprite.width / 2 < left || sprite.y – sprite.height / 2 > bottom || sprite.y + sprite.height / 2 < top) { // 移除影片的代码
}

重置出界对象:
if(sprite.x - sprite.width / 2 > right || sprite.x + sprite.width / 2 < left || sprite.y – sprite.height / 2 > bottom || sprite.y + sprite.height / 2 < top) {
// 重置影片的位置和速度
}

屏幕环绕出界对象:
if (sprite.x - sprite.width / 2 > right) {
sprite.x = left - sprite.width / 2;
} else if (sprite.x + sprite.width / 2 < left) {
sprite.x = right + sprite.width / 2;
} if (sprite.y – sprite.height / 2 > bottom) {
sprite.y = top – sprite.height / 2;
} else if (sprite.y + sprite.height / 2 < top) {
sprite.y = bottom + sprite.height / 2;
}

摩擦力应用(正确方法):
speed = Math.sqrt(vx * vx + vy * vy);
angle = Math.atan2(vy, vx);
if (speed > friction) {
speed -= friction;
} else {
speed = 0;
}
vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;

摩擦力应用(简便方法):
vx *= friction;
vy *= friction;

《making things move》笔记(第五章)

本章重要公式

角速度转换为 x,y 速度向量:
vx = speed * Math.cos(angle);
vy = speed * Math.sin(angle);

角加速度(作用于物体上的 force )转换为 x,y 加速度:
ax = force * Math.cos(angle);
ay = force * Math.sin(angle);

将加速度加入速度向量:
vx += ax;
vy += ay;

将速度向量加入坐标:
movieclip._x += vx;
sprite.y += vy;

2008年9月30日星期二

《making things move》笔记(第四章)(3)(有小结公式)

颜色转换
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月27日星期六

[千斤顶]一天一个类

一天一个类
改从顶级包里的类开始

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。

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 的时候,可以使用下列过程:

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);

《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 等属性中应用。

《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);

这样就在舞台上创建了一个库中的元件


以前我也会这么用。但都是多此一举再建一个空类。原来根本不需要。




--------------------------------

第一、二章讲的都是基础。比较简单。

--------------------------------

2008年9月17日星期三

Flex登陆框实例

" layout="absolute" creationComplete="initApp()">



























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
}

完全手册 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)

2008年9月12日星期五

2008年9月11日星期四

变成FLEX啦

至今天可以说写AS3两个月了刚好两个月。觉得学得挺烂的。公司的一个项目,源代码在我手上,前前后后研究了好久,看得懂但是死都写不出来。这段时间觉得停在一个地方,进不了。主要是自己太懒了。书也没看代码也没写。经理说让我写一个模板,我来负责这一块的。好在刚开始还有一个人带我。好在这个项目不会急。不然我就上树了。
经理今天下午给了我一本书。借我。不是给我。FLEX3.0的。我不知道拿来干麻。我要先学习一下。
那么学习吧。

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 对象。

2008年8月17日星期日

as3入门+进阶参考书

从7.11开始学AS3
到现在快四十天了
不知道会了多少。
电子版的参考书倒是下了不少。但是很多没有中文只是英文原版的
要的人可以跟我要随便给我是好人反正都是网上搜的 = =
哈哈,我的四级外加三级考六级都过不了的英语水平要大爆发了
人家说入门可以看三本,是
AS3殿堂之路 / ACTIONSCRIPT 3.0 COOKBOOK
essential ActionScript 3.0
还有making things move
殿堂之路买了,别的太穷了买不起,叹气
然后下到了
actionscript3 bible
as3.0组件详细使用与开发教程
大话设计模式
ActionScript 3.0 Design.Patterns
ActionScript 3.0 Game Programming
ActionScript 3.0 Design Patterns
Head.First.设计模式.中文版 141M
最后有一本[Adobe.Flash.CS3以假乱真动画艺术设计].Focal.Press.How.to.Cheat.in.Flash.CS3,是一本讲怎么画出动画,粗粗地翻了看看,感觉很不错。我还是比较喜欢做平面设计哦哦哦哦哦
哎呀我不知道 啦我不知道啦。
我不知道要看什么啦
睡觉的时候在想要看什么明天
大便的时候在想要看什么等下
写博的时候在想要看什么写完
。。。
要是让老婆知道的话会打死我的呀哦哦哦哦
=========================
我要找歌来听哟
明天去公司要问好几个问题哟
我是不是也要去开个豆瓣大人跟老婆凑一对啊,烦
她看过那么多书还有那么多小人书
我都没有
羞愧
=========================
再绕回来
我本来不是编程的料[现在也不是 = =]
还在上学的时候,学C学汇编学数据库学VB.NET学数据结构学单片机还学了什么我也不记得了。反正这些编程的课我是一节也没有听过,现在好了吧。现在好了吧。现在好了吧。要从头开始了吧
好了我去很帅地看英文版的Essential.ActionScript.3.0

2008年8月12日星期二

组件的简单运用

1.先建一个XML放着。内容:
source="pic/pic1.jpg">Description of image
1source="pic/pic2.jpg">Description of image
2>Description of image 3

2.建一个example.as和pic文件夹,文件夹里放三张图,命名为pic1,pic2,pic3example.as的代码如下:package {import flash.display.Sprite;import flash.events.MouseEvent;import fl.controls.CheckBox;import fl.controls.ColorPicker;import fl.controls.ComboBox;import fl.controls.Slider;import flash.text.TextField;import flash.display.Graphics;import flash.events.Event;import flash.display.Shape;import fl.events.SliderEvent;import flash.net.URLRequest;import flash.net.URLLoader;import flash.display.Loader;public class example extends Sprite { var ck:CheckBox; var cp:ColorPicker; var sl:Slider; var cb:ComboBox; var tf1:TextField; var tf2:TextField; var sp:Loader; var color:int=0x000000; var xmloader:URLLoader; var xml:XML; var xmlList:XMLList; var rec:Shape=new Shape; public function example() { drawrec(); creatck(); creatcp(); creatsl(); creatcb(); creatsp(); } function creatsl() { sl=new Slider ; sl.move(48,150); sl.maximum=1; sl.minimum=0; sl.snapInterval=0.1; sl.tickInterval=0.1; addChild(sl); sl.addEventListener(SliderEvent.CHANGE,sliderChanged); } function sliderChanged(e:SliderEvent):void { rec.alpha=sl.value; } function creatsp() { xmloader=new URLLoader(); var request:URLRequest=new URLRequest("data.xml"); xmloader.load(request); xmloader.addEventListener(Event.COMPLETE, sploaded); } function sploaded(e:Event):void { xml = XML(e.target.data); xmlList = xml.children(); sp = new Loader(); sp.x=230; sp.y=60; sp.load(new URLRequest(xmlList[0].attribute("source"))); addChild(sp); } function drawrec() { rec.graphics.beginFill(color); rec.graphics.drawRect(220,50,450,335); rec.graphics.endFill(); } function creatck() { ck=new CheckBox ; ck.label="显示背景"; ck.move(40,66); addChild(ck); ck.addEventListener(MouseEvent.CLICK,ckclick); } function ckclick(e:MouseEvent):void { if (ck.selected) { addChildAt(rec,0); } else { removeChild(rec); } } function creatcp() { cp=new ColorPicker ; cp.move(44,96); addChild(cp); cp.addEventListener(Event.RENDER,colorChange); } function colorChange(e:Event):void { rec.graphics.clear(); color=cp.selectedColor; drawrec(); } function creatcb() { cb=new ComboBox(); cb.addItem({label:"pic1"}); cb.addItem({label:"pic2"}); cb.addItem({label:"pic3"}); cb.move(45,200); addChild(cb); cb.addEventListener(Event.CHANGE,picchange); } function picchange(e:Event):void { if (cb.selectedItem.label=="pic1") { sp.load(new URLRequest(xmlList[0].attribute("source"))); } if (cb.selectedItem.label=="pic2") { sp.load(new URLRequest(xmlList[1].attribute("source"))); } if (cb.selectedItem.label=="pic3") { sp.load(new URLRequest(xmlList[2].attribute("source"))); } }}}

2008年8月11日星期一

看半天帮助做的组件DataGrid运用

效果:http://up.qzone.net.cn/qzone.net.cn/20080811032030_a.swf
组件运用创建 DataGrid 实例并侦听其事件
步骤:1.将 DataGrid 组件添加到库中。 2.将该代码作为 DataGridExample.as 另存到 FLA 文件所在的同一目录中。 3.将 FLA 文件中的 Document 类设置为 DataGridExample。
代码:package {import flash.display.Sprite;import flash.events.Event;import fl.data.DataProvider;import fl.events.DataGridEvent;import fl.controls.DataGrid;import flash.text.TextField;import flash.text.TextFieldAutoSize;
public class DataGridExample extends Sprite { var tfn:TextField; var tfnu:TextField; var tfe:TextField; var dp:DataProvider; var dg:DataGrid;
public function DataGridExample() { creatdg(); creattf();
} function creatdg() { dp=new DataProvider(); dp.addItem({Name:"John Alpha",Number:"555-123-0101",Email:"jalpha@fictitious.com"}); dp.addItem({Name:"Mary Bravo",Number:"555-372-3322",Email:"mbravo@fictitious.com"}); dp.addItem({Name:"Trevor Gamma",Number:"555-485-1212",Email:"tgamma@fictitious.com"}); dg=new DataGrid(); dg.move(10, 10); dg.width = 500; dg.rowCount = 3;
dg.columns=["Name","Number","Email"]; dg.dataProvider=dp; addChild(dg); dg.addEventListener(Event.CHANGE,grid); } function creattf() { tfn=new TextField(); tfn.x=10; tfn.y=100; addChild(tfn); tfnu=new TextField(); tfnu.x=10; tfnu.y=115; addChild(tfnu); tfe=new TextField(); tfe.x=10; tfe.y=130; addChild(tfe); tfn.autoSize = TextFieldAutoSize.LEFT; tfnu.autoSize = TextFieldAutoSize.LEFT; tfe.autoSize = TextFieldAutoSize.LEFT;
} function grid(e:Event):void {
tfn.text="Name:"+e.target.selectedItem.Name; tfnu.text="Number:"+e.target.selectedItem.Number; tfe.text="Email:"+e.target.selectedItem.Email; }}}

2008年8月9日星期六

AS3呀

这周回家了一趟。
学AS3的事情就放了一周。
重新再看那本殿堂之路。这是第三遍了。
下周一上班的时候要开始做开发。课件的模板。
其实我不知道自己会不会。哎。。

2008年8月1日星期五

AS3格式化文本

格式化文本:
1.使用HTML标签
field.html=true;
field.htmlText="Bold text""Underlined text"

2.使用TextFormat对象进行格式化
var formatter:TextFormat=new TextFormat();
formatter.bold=trueformatter.color=0xffffff
formatter.blockIndent=5
field.setTextFormat(formatter)
for examplefield.text="this is a sample"field.setTextFormat(formatter)

2008年7月31日星期四

AS3通信过程

var loader:URLLoader=new URLLoader();
//...var request:URLRequest=new URLRequest(targetURL)
laoder.load(request)

2008年7月30日星期三

在类文件中生成指定库元件的实例

//在库里建了一个类,不用手工把这个类的实例加到舞台上,而用代码的方法如下:
//
//假设这个类取名为Ball,基类是MovieClip//

private var __ball:Class;
public function XX(){initView();
var ball:MovieClip=new __ball();
}
function initView(){
__ball = getDefinitionByName("Ball") as Class;
}
======================================================


下午把书本看完了。HOHO。那些数学公式都忘得差不多了。动画的不好做。。
所有跟命名空间有关的都被我跳过。所有跟异常和错误有关的也都被我跳过。以后再说。

不小心过了十二点

所以说的是昨天的事情
昨天就看书了。看书看书看书。我真乖
好了,去看BAIDU知道了。
问了一个自家SS的问题,给了八十分,心疼呐心疼,虽然我不知道那分是拿来做甚的

2008年7月28日星期一

现在还只能停留在入门级=.,= 入门的下雪练习

文档类AS。(回家让老婆表扬一下)代码如下:FLASH:http://up.qzone.net.cn/flash/20080728112742_main.swf

package com.mysnow{
import flash.display.MovieClip;
import flash.events.Event;
import com.mysnow.clip.snow;
public class snowing extends MovieClip {
var i:uint;
public function snowing() {
this.addEventListener(Event.ENTER_FRAME,snowfall);
}
//_snow.addEventListener(Event.ENTER_FRAME,snowfall);
function snowfall(evt:Event):void {
var _snow:snow=new snow;
_snow.x=Math.random() * 550;
_snow.y=0;
_snow.scaleX=0.2 + Math.random();
_snow.scaleY=_snow.scaleX;
_snow.alpha=Math.random()+0.5;
addChild(_snow);
i++;
if (i>600) {
this.removeChildAt(1);
i=600;
}
}
}
}

================================================================================
今天白天看了Array.String.RegExp.总的一句话,看是看了,但是不知道以后拿来干什么用= =
接下来看XML,然后就可以做AS3+XML相册了。哦耶




=========================现在是晚上了====================

看完了XML。挖神速。
相册晚一点再看看吧
因为我现在要看电影了
可惜的是爆米花给吃完了
原来我做的背景太小了。在老婆的宽屁股本本上显不出来右边两个小人。哭
算啦咱准备一下去看片吧

2008年7月27日星期日

星期天在家



然后看AS3的书吧
永远也分不清什么时候用public 还是 private


===========复合,继承===============
复合,直接在新类中创建现有的Class的对像,成为新类的一部分
继承,声明一个新类做为现有类的子类。
复合:有一个原有类的对象。比如车有轮胎
继承:是一个原有类的特殊种类。比如猫是动物里的一种
一般来说,尽量使用复合少用继承。

=====================================

生成随机颜色:Math.random()*0xFFFFFF;

================= 到目前为此只会做这个= = 最简单的鼠标跟随=================
fla里新建影片剪辑,放到舞台上,实例名mc吧
建个as,
package{
import flash.display.MovieClip
import flash.events.Event
public class mouse extends MovieClip{
public function mouse(){
mc.addEventListener(Event.ENTER_FRAME,mouseFun)
}
function mouseFun(evt:Event):void {
/*mc.x=mouseX+90 mc.y=mouseY+20*/
mc.x+=(mouseX-mc.x)/3+30 mc.y+=(mouseY-mc.y)/3
}
}

2008年7月26日星期六

AS3专用


今天在老婆愤怒地指导下愤怒地做了一个FLASH小游戏。

结果反正是没达到目。
PS:我什么时候才能变成AS3高手?!

LP:做梦的时候。

截图如右


挖。贴图这么小。BSBSBS
贴代码备忘

package { //主文档的代码。还有不行的地方。也许哪一天我就知道怎么做了。哼。得意~
import flash.display.MovieClip;
import flash.events.*;import flash.display.Sprite;
import flash.utils.Timer;
import BigHuman;import ball;
public class Human extends MovieClip {
private var human:BigHuman=new BigHuman();
private var t1:Timer;
var speed:uint= 5;
private var i:uint;
public static var creatballFun:Function;
public function Human() {
creatballFun=creatball;
human.x=185;
human.y=350;
addChild(human);
t1=new Timer(200);
t1.start();
t1.addEventListener(TimerEvent.TIMER,ballout);
human.addEventListener(MouseEvent.MOUSE_DOWN,downhandler);
human.addEventListener(MouseEvent.MOUSE_UP,uphandler);
}
function downhandler(evt:MouseEvent):void {
human.startDrag();
}
function uphandler(evt:MouseEvent):void {
human.stopDrag();
}
function creatball(setX:int,setY:int) {
var balls:ball=new ball(setX,setY);
/*addChild(balls);
if(balls.hitTestObject(human)){ trace("OVER")} trace("1")*/
//好像想让上面那hitTextObject能用。还得用到BitmapDate类。可是我不会。。
}
function ballout(evt:TimerEvent):void {
var _setX:int=0;
var _setY:int=0; for (i=0; i<15;>
creatball(_setX,_setY);
_setX=stage.stageWidth*Math.random();
_setY-=150*Math.random();
t1.stop();
}
}
}
}
package { //ball类的代码
import flash.display.MovieClip;
import flash.events.*;
import flash.utils.Timer;import Human;
public class ball extends MovieClip {
var t:Timer;
public function ball(a:int,b:int) {
this.x=a;
this.y=b;
t=new Timer(300);
t.start();
t.addEventListener(TimerEvent.TIMER,getspeed);
}
function getspeed(e:Event):void {
this.y+=10;
if (this.y>600) {
parent.removeChild(this); t.stop();
Human.creatballFun(Math.random()*400-200,Math.random()*600-400)
}
}
}
}
BigHuman是空类。
建了影片剪辑Human跟ball扔进库里加了链接。
最后说一句:
我什么时候变成AS3高手呀?!