目玉キョロキョロブログパーツ

2009年 1月 27日

ある制作会社からの依頼でブログパーツを制作した。

AS2書き出しのプレーヤーv8に設定されたプロジェクトで、Function レイヤーの1フレーム目に次のような関数群を使って待機中に目がキョロキョロする挙動を表現している。また、Actions レイヤーフレーム1に書いてある変数は省略している。最終的には playSnakeEyes 関数を一定時に処理を行うようにして完成する。

// Make eyes snake.
function playSnakeEyes() {
 if (movMode == false) {
  if (randRange(0, 9) % 3 == 0 || randRange(0, 9) % 3 == 1) {// SNAKE
   var randX:Number = randRange(0, Stage.width);
   var randY:Number = randRange(0, Stage.height);
   var pos_right:Object = getPos(rightEye, {x:randX, y:randY});
   var pos_left:Object = getPos(leftEye, {x:randX, y:randY});
  } else if (randRange(0, 9) % 3 == 2 && snakeCount % 3 == 2) {// LONPARI
   var pos_right:Object = getPos(rightEye, {x:(rightEye.x - 10), y:rightEye.y});
   var pos_left:Object = getPos(leftEye, {x:(leftEye.x + 10), y:leftEye.y});
 }
 setEyes({right:pos_right, left:pos_left}); }
 snakeCount++;
}
 
// Generate randomized number.
function randRange(min:Number, max:Number):Number {
 var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
 return randomNum;
}
 
// Set positions of instance for eyes.
function setEyes(pos:Object):Void {
 var movRate:Number = randRange(1, 9) / 10;
 rightEye_mc.onEnterFrame = function():Void  {
  var xRate:Number = (pos.right.x - this._x) * movRate;
  var yRate:Number = (pos.right.y - this._y) * movRate;
  this._x += xRate;
  this._y += yRate;
  if (Math.abs(xRate) < 0.1 && Math.abs(yRate) < 0.1) {
   this._x = pos.right.x;
   this._y = pos.right.y;
   delete this.onEnterFrame;
  }
 };
 leftEye_mc.onEnterFrame = function():Void  {
  var xRate:Number = (pos.left.x - this._x) * movRate;
  var yRate:Number = (pos.left.y - this._y) * movRate;
  this._x += xRate;
  this._y += yRate;
  if (Math.abs(xRate) < 0.1 && Math.abs(yRate) < 0.1) {
   this._x = pos.left.x;
   this._y = pos.left.y;
   delete this.onEnterFrame;
  }
 };
}
// Get positions of instance for eyes from position of mouse cursor.
function getPos(eye:Object, pts:Object):Object {
 var xdiff:Number = pts.x - eye.x;
 var ydiff:Number = pts.y - eye.y;
 var radius:Number = Math.min(Math.max(Math.sqrt(xdiff * xdiff + ydiff * ydiff) / distanceFromEye, 0), MAXeyeMovement);
 var angle:Number = Math.atan2(ydiff, xdiff);
 return {x:(Math.cos(angle) * radius * ovality + eye.x), y:(Math.sin(angle) * radius + eye.y)};
}

AS3用にクラス化するかどうかは次の案件に委ねられている。
// 誰かお願いします。:-)