forked from: forked from: forked from: forked from: forked from: [study] - 重力

by gaina
♥0 | Line 122 | Modified 2010-06-18 13:15:49 | MIT License
play

ActionScript3 source code

/**
 * Copyright gaina ( http://wonderfl.net/user/gaina )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/xGVj
 */

// forked from tinystudio's forked from: forked from: forked from: forked from: [study] - 重力
// forked from tinystudio's forked from: forked from: forked from: [study] - 重力
// forked from gaina's forked from: forked from: [study] - 重力
// forked from tinystudio's forked from: [study] - 重力
// forked from gaina's [study] - 重力
package  
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.*;
	
	
	[SWF(height=465,width=465)]
	import flash.text.TextField;
	public class BallThrower extends Sprite
	{
		private var sp:Sprite;
		private var ball:Ball;
		
		private var ground:Bitmap;
		private var wall:Bitmap;
		private var goal:Bitmap;
		
		//右上に放り投げる。
		private var _vx:Number = 10;
		private var _vy:Number = -20;
		
		//重力。小さな値にすると月面みたいに。
		private var _grav:Number = 1;
		
		//カウント用
		private var tf:TextField;
		private var count:uint=0;
		
		public function BallThrower ()
		{
			wall = new Bitmap(new BitmapData(165, stage.stageHeight, true, 0xFFFFFF00));
			wall.x = 300;
			wall.y = 0;
			addChild(wall);
			
			ground = new Bitmap(new BitmapData(stage.stageWidth, 1000, true,0xFF00ff00));
			ground.x = 0;
			ground.y = stage.stageHeight - 5;
			addChild(ground);
			
			tf=new TextField();
			addChild(tf);
			
			init();
		}
		
		private function addGravity(e:Event):void {
			var simulate:Object = ball.simulate(ball.vectorX*-0.009,_grav);
			sp.x = simulate.x;
			sp.y = simulate.y;
			
			tf.text="入った?\n"+count.toString();
			
			if (ground.hitTestObject(sp))
			{
				//床に当たった場合は反射する
				ball.addVector(0, ball.vectorY * -1.8);
			}
			else{
				//下向きの力を加えることで重力を表現
				ball.addVector(0, _grav);
			}

			//壁に当たったら、逆に力を反射させる
			if (wall.hitTestObject(sp) || sp.x <=0)
			{
				ball.addVector(ball.vectorX * -1.9, 0);
			}
			
			if (goal.hitTestObject(sp))
			{
				count++
			}

			//vectorXの反対方向の力を加えることで摩擦を表現
			ball.addVector(ball.vectorX*-0.009,0);
			ball.update();
			sp.x = ball.x;
			sp.y = ball.y;
		}
		
		private function init() :void {
			ball = new Ball(10, 300);
			
			sp = new Sprite();
			sp.graphics.beginFill(0);
			sp.graphics.drawCircle(0, 0, 5);
			sp.graphics.endFill();
			addChild(sp);
			
			ball.addVector(_vx,_vy);
			addEventListener(Event.ENTER_FRAME, addGravity);
			
			//高さを大きくするとカウントアップの値が大きくなる
			goal=new Bitmap(new BitmapData(30,5,true,0xFFFF0000));
			goal.x=wall.x-goal.width;
			goal.y=200;
			addChild(goal);
			
			stage.addEventListener(MouseEvent.CLICK, onClick);
		}
		
		private function onClick(e:MouseEvent):void 
		{
			removeEventListener(Event.ENTER_FRAME, addGravity);
			removeChild(sp);
			sp = null;
			count=0;
			init();
		}
	}

}

class Ball
	{
		private var _vectorX:Number = 0;
		private var _vectorY:Number = 0;
		private var _x:Number = 0;
		private var _y:Number = 0;
		

		public function Ball(x:Number, y:Number){
			this._x = x;
			this._y = y;
		}
		
		public function addVector(vectorX:Number=0, vectorY:Number=0):void
		{
			this._vectorX += vectorX;
			this._vectorY += vectorY;
		}
		
		public function update():void{
			this._x += this._vectorX;
			this._y += this._vectorY
		}
		
		public function get vectorX ():Number {
			return this._vectorX;
		}
	
		public function get vectorY():Number {
			return this._vectorY;
		}
		
		public function get x():Number {
			return this._x;
		}
		
		public function get y():Number {
			return this._y;
		}
		public function simulate(vectorX:Number=0, vectorY:Number=0):Object{
			this._x;
			return {x:this._x + this._vectorX + vectorX,y:this._y + this._vectorY + vectorY};
		}	
	}