トップページ > 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(); } } } }