トップページ > Flash入門 > 電場と電位flash(1)
※画像ファイル“ClearBall_red.png”,“ClearBall_blue.pngが必要です。
//************************************************************************
//2012/03/09
//電場とポテンシャル
//Proggramed by Koten-Kairoya
//************************************************************************
package
{
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TextEvent;
import Atom;
import flash.text.*;
//画面サイズと背景色,フレームレートを設定
[SWF(width = "500", height = "600", frameRate = "60", backgroundColor = "0xf0f8ff")]
public class Main extends Sprite
{
//画像ファイルを読み込む
[Embed(source = "./ClearBall_blue.png")]
public var ClearBall_blue:Class;
public var electron_Img:Bitmap = new ClearBall_blue();
[Embed(source = "./ClearBall_red.png")]
public var ClearBall_red:Class;
public var atom_Img:Bitmap = new ClearBall_red();
//−電荷量の絶対値
public var minus_Q:Number = 1;
//+電荷量
public var plus_Q:Number = 1;
//誘電率(引力係数)
public var k:Number = 100;
//ポテンシャルのグラフ用スプライト
public var sp2:Sprite = new Sprite();
//実空間の部分を覆うスプライト
public var sp_wall:Sprite = new Sprite();
//仕切り線用スプライト
public var sp1:Sprite = new Sprite();
//+の電荷のクラスをインスタンス化
public var atom:Atom = new Atom();
//−の電荷をインスタンス化
public var electron:Electron = new Electron();
//Electronの速度
public var v_e:Number = 2;
//作用する力
public var force:Number = 0.1;
//角度用変数
public var rad:Number = 0;
//Electronをう動かす場合の一時保存用変数
public var temp_x:Number = 0;
public var temp_y:Number = 0;
//ポテンシャルのグラフ関係の変数
public var pot_amplitude:Number = 10000;
public var pot_offset:Number = 15;
public var pot_width:Number = 5
public var atom_width:Number = 15
//デバッグ用
//public var spdebug:Sprite = new Sprite();
//main関数
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
//コンストラクタ
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
//ポテンシャルのグラフ用スプライトを表示
drawPotential(-335);
sp2.x = -335;
addChild(sp2);
addChild(atom_Img);
atom_Img.y = 170;
atom_Img.x = 150;
addChild(electron_Img);
electron_Img.y = 100;
electron_Img.x = 350;
//実空間の部分を覆う
sp_wall.graphics.beginFill(0xfffffcc,1);
sp_wall.graphics.drawRect(0, 200, 500, 600);
sp_wall.graphics.endFill();
addChild(sp_wall);
//区切り線を描画
sp1.graphics.lineStyle(5, 0x696969);
sp1.graphics.moveTo(0, 200);
sp1.graphics.lineTo(500, 200);
addChild(sp1);
//電荷の画像を表示
electron.move(350,400);
atom.move(150, 400);
addChild(atom.sprite);
addChild(electron.sprite);
//ENTER_FRAMEイベントを登録
this.stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
//各イベントリスナを登録
atom.sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
electron.sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
//============================================================
//テキスト
var tf_pot:TextField = new TextField();
var tf_real:TextField = new TextField();
var format:TextFormat = new TextFormat();
tf_pot.y = 10;
tf_real.y = 210;
tf_pot.autoSize = TextFieldAutoSize.LEFT;
tf_real.autoSize = TextFieldAutoSize.LEFT;
format.size = 16;
format.color = 0x000000;
tf_pot.defaultTextFormat = format;
tf_real.defaultTextFormat = format;
tf_real.text = "実空間";
tf_pot.text = "ポテンシャル(電位)";
addChild(tf_pot);
addChild(tf_real);
}
//============================================================----
//ポテンシャルのグラフを描画する関数
private function drawPotential(pos:int):void
{
sp2.graphics.clear();
sp2.graphics.lineStyle(2, 0x000000);
for (var i:int = atom_width; i <500; i++ )
{
//左側
sp2.graphics.moveTo((i + pot_width), calcPot("left", i) );
sp2.graphics.lineTo((i + 1 + pot_width), calcPot("left", i + 1));//pot_amplitude * 1 / ((500+atom_width-i) - 1) + pot_offset );
//右側
sp2.graphics.moveTo((i + 500 - pot_width - atom_width), calcPot("right", i));//pot_amplitude * (1/i) + pot_offset);
sp2.graphics.lineTo((i + 500 - pot_width - atom_width) + 1, calcPot("right", i+1));//pot_amplitude * (1/(i+1)) + pot_offset );
}
sp2.x = pos;
}
//ポテンシャルのグラフを生成する関数
private function calcPot(pos:String, x:Number):Number
{
if (pos == "left")
{
return pot_amplitude * 1 / (500 + atom_width - x) + pot_offset;
}
else if (pos == "right")
{
return pot_amplitude * (1 / x) + pot_offset;
}
else
{
return 0;
}
}
//フレームごとの処理
private function onEnterFrame(e:Event ):void
{
temp_x = Math.pow(atom.x - electron.x, 2);
temp_y = Math.pow(atom.y - electron.y, 2);
if (electron.x - atom.x > 0)
{
electron_Img.x = Math.sqrt(temp_x + temp_y) + atom.x;
electron_Img.y = calcPot("right", electron_Img.x - sp2.x - 500 + 45) - 30;
}
else
{
electron_Img.x = atom.x - Math.sqrt(temp_x + temp_y) ;
electron_Img.y = calcPot("left", electron_Img.x - sp2.x) - 30;
}
//ドラッグ中の場合はポテンシャルのグラフを動かすのみ。
//−電荷が動く処理はしないでreturnする
if (electron.dragFlag == true || atom.dragFlag == true)
{
sp2.x = ( (atom.x - 485) );
atom_Img.x = atom.x;
return;
}
//electronとatomの画像が重ならないかチェック
if (Math.sqrt( Math.pow((electron.x - atom.x),2) + Math.pow((electron.y - atom.y),2) ) < 31)
{
//加速度と速度を元に戻す
force = 0;
v_e = 0;
temp_x = atom.x - 30 * Math.cos(rad);
temp_y = atom.y - 30 * Math.sin(rad);
electron.move(temp_x, temp_y);
//trace("return")
return;
}
force += k/(Math.pow( (electron.x - atom.x),2) + Math.pow((electron.y - atom.y),2));
v_e += force;
//============================================================
//x,y距離を出しておく
temp_x = atom.x -electron.x;
temp_y = atom.y - electron.y;
//ElectronからAtomを見た角度を計算
rad = Math.atan2(temp_y, temp_x);
//新しいelectronの座標
temp_x = electron.x + v_e*Math.cos(rad);
temp_y = electron.y + v_e * Math.sin(rad);
//Electronを動かす
electron.move(temp_x, temp_y);
//============================================================
}
private function onMouseDown(e:MouseEvent):void
{
v_e = 0;
force = 0;
}
}
}
※画像ファイル“ClearBall_blue.png”が必要です。
package
{
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.events.Event;
import flash.events.MouseEvent;
public class Electron
{
//画像を読み込み
[Embed(source = "./ClearBall_blue.png")]
public var ClearBall_blue:Class;
public var electron_Img:Bitmap = new ClearBall_blue();
//ドラッグ用スプライト
public var sprite:Sprite = new Sprite();
//ドラッグ時の境界
public var top:int = 200;
public var bottom:int = 600;
public var left:int = 0;
public var right:int = 470;
//スプライトの座標
public var x:Number = 0;
public var y:Number = 0;
//ドラッグ中フラグ
public var dragFlag:Boolean = false;
public function Electron()
{
//スプライトに画像を貼りつける
sprite.addChild(electron_Img);
//イベントリスナに登録
sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
sprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
sprite.addEventListener(Event.ENTER_FRAME, onEnterFrame);
sprite.addEventListener(MouseEvent.ROLL_OUT, onMouseRollout);
sprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
public function move(new_x:Number, new_y:Number):void
{
sprite.x = new_x;
sprite.y = new_y;
this.x = new_x;
this.y = new_y;
}
private function onEnterFrame(e:Event):void
{
this.x = sprite.x;
this.y = sprite.y;
}
private function onMouseDown(e:MouseEvent):void
{
dragFlag = true;
sprite.startDrag();
}
private function onMouseUp(e:MouseEvent):void
{
if (dragFlag == true)
{
dragFlag = false;
sprite.stopDrag();
}
}
private function onMouseRollout(e:MouseEvent):void
{
//sprite.stopDrag();
}
private function onMouseMove(e:MouseEvent):void
{
if (x < left )
{
x = left;
move(x, y);
dragFlag = false;
sprite.stopDrag();
}
if (x > right )
{
x = right;
move(x, y);
dragFlag = false;
sprite.stopDrag();
}
if (y < top)
{
y = top;
move(x, y);
dragFlag = false;
sprite.stopDrag();
}
if (y > bottom)
{
y = bottom;
move(x, y);
dragFlag = false;
sprite.stopDrag();
}
}
}
}
※画像ファイル“ClearBall_red.png”が必要です。
package
{
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.events.Event;
import flash.events.MouseEvent;
public class Atom
{
//画像を読み込み
[Embed(source = "./ClearBall_red.png")]
public var ClearBall_red:Class;
public var atom_Img:Bitmap = new ClearBall_red();
//ドラッグ用スプライト
public var sprite:Sprite = new Sprite();
//ドラッグ時の境界
public var top:int = 200;
public var bottom:int = 600;
public var left:int = 0;
public var right:int = 500;
//スプライトの座標
public var x:Number = 0;
public var y:Number = 0;
public var dragFlag:Boolean = false;
public function Atom()
{
//スプライトに画像を貼りつける
sprite.addChild(atom_Img);
//イベントリスナに登録
sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
sprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
sprite.addEventListener(Event.ENTER_FRAME, onEnterFrame);
sprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
public function move(new_x:int, new_y:int):void
{
sprite.x = new_x;
sprite.y = new_y;
}
private function onEnterFrame(e:Event):void
{
this.x = sprite.x;
this.y = sprite.y;
}
private function onMouseDown(e:MouseEvent):void
{
dragFlag = true;
sprite.startDrag();
}
private function onMouseUp(e:MouseEvent):void
{
dragFlag = false;
sprite.stopDrag();
}
private function onMouseMove(e:MouseEvent):void
{
if (x < left )
{
x = left;
move(x, y);
dragFlag = false;
sprite.stopDrag();
}
if (x > right )
{
x = right;
move(x, y);
dragFlag = false;
sprite.stopDrag();
}
if (y < top)
{
y = top;
move(x, y);
dragFlag = false;
sprite.stopDrag();
}
if (y > bottom)
{
y = bottom;
move(x, y);
dragFlag = false;
sprite.stopDrag();
}
}
}
}