forked from: forked from: forked from: forked from: forked from: [study] - 重力
♥0 |
Line 122 |
Modified 2010-06-18 13:15:49 |
MIT License
archived:2017-03-20 00:55:10
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};
}
}