スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | | スポンサー広告

ポテンシャル関数を使ってマウスカーソル追尾

ボールがマウスカーソルを追尾します。ただし、近づきすぎると逆に遠ざかろうとします。




























Adobe Flash Player を取得






いわゆるマウスストーカーなのですが、ボールとマウスカーソルの間に働く力をレナードジョーンズポテンシャル関数を使って求めて、それによってボールを動かしています。

ボールにかかる力 = - a / d^m + b / d^n

といったカンジの式でa, b, m, nは定数、dはマウスカーソルとボールの距離です。
力が正なら引力、負なら斥力になります。

サンプルでは、フレーム毎にボールの速度ベクトルに上記の式で求めた力を加算してボールの次の位置を決定しています。

サンプルのActionScriptは以下です。第一フレームのアクションとして記述しています。

import flash.display.Sprite;
import flash.events.Event;

// パラメータ
var a:Number = 300000;
var b:Number = 10000;
var m:Number = 3;
var n:Number = 2;
// 最大速度
var vMax:Number = 10;
// 速度の減衰率
var vRatio:Number = 0.995;
// 物体の半径
var r:Number = 10;

// 速度ベクトルのx成分
var vx:Number = 0.0;
// 速度ベクトルのy成分
var vy:Number = 0.0;

// 物体を生成する
var obj:Sprite = new Sprite();
obj.graphics.lineStyle(0, 0x0000FF);
obj.graphics.beginFill(0x9999FF);
obj.graphics.drawCircle(0, 0, r);
obj.graphics.endFill();
obj.x = Math.random() * stage.stageWidth;
obj.y = Math.random() * stage.stageHeight;
obj.addEventListener(Event.ENTER_FRAME,
function (e:Event):void {
// マウスカーソルと物体との距離を算出する
var dx:Number = mouseX - obj.x;
var dy:Number = mouseY - obj.y;
var d:Number = Math.sqrt(dx * dx + dy * dy);
// マウスカーソルに触れていたら移動しない
if (d < r) {
vx = 0;
vy = 0;
return;
}
// ポテンシャル関数でかかっている力を算出する
var p:Number = - a / Math.pow(d, m) + b / Math.pow(d, n);
var px:Number = p * dx / d;
var py:Number = p * dy / d;
// 速度を減衰させる
vx *= vRatio;
vy *= vRatio;
// 速度ベクトルに力を加算する
vx += px;
vy += py;
// 速度を最大値以内にする
var v:Number = Math.sqrt(vx * vx + vy * vy);
var vr:Number = 0;
if (v > vMax) {
vr = vMax / v;
vx *= vr;
vy *= vr;
}
// 速度ベクトルにしたがって位置を更新する
obj.x += vx;
obj.y += vy;
// ステージの端で跳ね返る
if (obj.x < 0) {
obj.x = -obj.x;
vx *= -1;
} else if (obj.x > stage.stageWidth) {
obj.x = stage.stageWidth * 2 - obj.x;
vx *= -1;
}
if (obj.y < 0) {
obj.y = - obj.y;
vy *= -1;
} else if (obj.y > stage.stageHeight) {
obj.y = stage.stageHeight * 2 - obj.y;
vy *= -1;
}
});
addChild(obj);


最初に各種パラメータを定義しています。a, b, m, nは上の方に書いてる式で使います。

vMaxはボールの最大速度です。1フレームでの最大移動距離で、あまり速く動かれるとワケがわからないので制限を加えています。

vRatioはフレーム毎の速度の減衰です。抵抗的なモノです。

ボールのx方向成分の速度、y方向成分の速度をvx, vyに保持するようにします。
前フレームでの速度+今フレームでかかった力による速度。というカンジで速度を変化させます。

objがマウスカーソルを追尾するボールです。Spriteに円を描いています。
objにEvent.ENTER_FRAMEイベントハンドラをつけて、この中で移動処理をしています。

フレーム毎の移動処理は、マウスカーソルとボールの距離からボールにかかる力をポテンシャル関数で求めて、x方向成分y方向成分それぞれをvx, vyに加算。
vx, vyをx, yに加算して移動。という流れになっています。

ただし、マウスカーソルがボールに触れている状態ではボールは停止。速度はvMaxで定義した制限以内に抑える。ステージの端にいったら跳ね返る。
といった制限を加えています。すぐにどっかに飛んでって見失うので。

スポンサーサイト

テーマ:Flash - ジャンル:コンピュータ

2010.10.29 | | Comments(2) | Trackback(0) | Flash CS5

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

2011-03-25 金 00:34:50 | | # [ 編集]

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

2013-02-13 水 18:21:16 | | # [ 編集]

コメントの投稿


秘密にする

«  | HOME |  »

プロフィール

HundredthMonkey

Author:HundredthMonkey
プログラマ。

ブロとも申請フォーム

この人とブロともになる

メールフォーム

名前:
メール:
件名:
本文:

ブログ内検索


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。