自由动作编程通常涉及使用动作序列和规则来控制物体或角色在虚拟环境中的行为。以下是一个简单的自由动作编程的例子,使用ActionScript 3(AS3)编写,实现一个鱼儿随鼠标自由游动的场景:
初始化
创建数组来存储鱼的各个部分(如鱼头、鱼鳍、鱼尾)。
设置鱼的初始位置。
添加动作和规则
定义一系列动作,如移动、旋转等。
定义规则,指定何时执行这些动作。
事件驱动
使用鼠标事件(如鼠标移动)来触发动作的执行。
```actionscript
// 初始化,创建数组
var N = 20;
var x = new Array();
var y = new Array();
var fish = new Array();
// 设置鱼的初始位置
for (var i = 0; i < N; i++) {
var mc:MovieClip;
if (i == 0) mc = attachMovie("鱼头", "fish_" + i, this.getNextHighestDepth());
else if (i == 5) mc = attachMovie("鱼鳍", "fish_" + i, this.getNextHighestDepth());
else mc = attachMovie("鱼尾", "fish_" + i, this.getNextHighestDepth());
mc._x = x[i];
mc._y = y[i];
mc._alpha = 100 * (1 - i / N);
mc._xscale = mc._yscale = 100 - i * 2;
fish[i] = mc;
}
// 设置目标位置
var dest_x = _xmouse;
var dest_y = _ymouse;
// 添加鼠标移动事件监听器
var mouseListener = new Object();
mouseListener.mouseMove = function(event:MouseEvent):void {
dest_x = event.stageX;
dest_y = event.stageY;
}
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseListener);
// 定义移动动作
function moveFish(mc:MovieClip, dx:Number, dy:Number):void {
mc.x += dx;
mc.y += dy;
}
// 每帧更新鱼的位置
function update():void {
for (var i = 0; i < N; i++) {
var mc = fish[i];
var dx = dest_x - mc.x;
var dy = dest_y - mc.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// 如果鱼距离目标位置较近,则直接移动到目标位置
if (distance < 10) {
mc.x = dest_x;
mc.y = dest_y;
} else {
// 否则,平滑移动
var speed = 2;
moveFish(mc, dx / distance * speed, dy / distance * speed);
}
}
requestAnimationFrame(update);
}
update();
```
解释
初始化
创建了20个鱼的实例,每个实例代表鱼的一部分(鱼头、鱼鳍、鱼尾)。
设置每个部分的初始位置和透明度。
事件驱动
添加了一个鼠标移动事件监听器,当鼠标移动时,更新目标位置`dest_x`和`dest_y`。
动作和规则
定义了一个`moveFish`函数,用于移动鱼的部分。
在`update`函数中,计算每个鱼部分当前位置到目标位置的距离,并根据距离决定是直接移动到目标位置还是平滑移动。
每帧更新
使用`requestAnimationFrame`来每帧更新鱼的位置,实现平滑的动画效果。
通过这种方式,你可以实现一个简单的自由动作编程效果,使鱼能够根据鼠标的位置自由移动。你可以根据需要扩展这个例子,添加更多的动作和规则,以实现更复杂的行为逻辑。