とりあえず丸くした forked from: 重い+動作不良
ついでにボールをShape継承にした。
他にもいくつか修正入れたが、壁を毎回描き直しているっぽいのをinit内に移動するのが一番利いた←
/**
* Copyright felprere ( http://wonderfl.net/user/felprere )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/pggf
*/
// forked from dannnn's 重い+動作不良
package
{
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Graphics;
import flash.events.Event;
import flash.events.KeyboardEvent;
import net.hires.debug.Stats;
/**
* ...
* @author
*/
[SWF(width = "465", height = "465", frameRate = "30", backgroundColor="0x000000")]
public class ball_1 extends Sprite
{
//public var background:Sprite;
public var N:int = 10;
public var xx:int = 0;
public var yy:int = 1;
public var R:Number = 5.0;
public var Rr:Number = 10.0;
public var aa:inte = new inte();
public var line:Sprite = new Sprite();
private var wall:Shape = new Shape();
private var bm:Vector.<Ball> = new Vector.<Ball>(N, true);
public function ball_1():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
this.graphics.beginFill(0x1D4E20,1.0);
this.graphics.drawRect(0,0,465,465);
this.graphics.endFill();
bm[0] = new Ball(0xFFFFFF);
bm[1] = new Ball(0xFFFF00);
bm[2] = new Ball(0x0000FF);
bm[3] = new Ball(0xFF0000);
bm[4] = new Ball(0xFF00FF);
bm[5] = new Ball(0xFF7F00);
bm[6] = new Ball(0x00FF00);
bm[7] = new Ball(0xCC4C33);
bm[8] = new Ball(0x333333);
bm[9] = new Ball(0x7F7F00);
addChild( new Stats() );
addChild(bm[0]);
addChild(bm[1]);
addChild(bm[2]);
addChild(bm[3]);
addChild(bm[4]);
addChild(bm[5]);
addChild(bm[6]);
addChild(bm[7]);
addChild(bm[8]);
addChild(bm[9]);
init_a();
addEventListener(Event.ENTER_FRAME, run_a);
}
private function init_a():void
{
//intitial posion and velocity
bm[0].x = 116 + 80; //width/4 statsの横幅70
bm[0].y = 348; //width*3/4
bm[1].x = 116 + 80 + Math.random();
bm[1].y = 116 + Math.random();
bm[2].x = 116 + 80 - 4 * Rr * Math.cos(60 * Math.PI / 180) + Math.random();
bm[2].y = 116 - 4 * Rr * Math.sin(60 * Math.PI / 180) + Math.random();
bm[3].x = 116 + 80 + Math.random();
bm[3].y = 116 - 8 * Rr * Math.sin(60 * Math.PI / 180) + Math.random();
bm[4].x = 116 + 80 + 4 * Rr * Math.cos(60 * Math.PI / 180) + Math.random();
bm[4].y = 116 -4 * Rr * Math.sin(60 * Math.PI / 180) + Math.random();
bm[5].x = 116 + 80 - 2 * Rr * Math.cos(60 * Math.PI / 180) + Math.random();
bm[5].y = 116 - 2 * Rr * Math.sin(60 * Math.PI / 180) + Math.random();
bm[6].x = 116 + 80 + 2 * Rr * Math.cos(60 * Math.PI / 180) + Math.random();
bm[6].y = 116 - 2 * Rr * Math.sin(60 * Math.PI / 180) + Math.random();
bm[7].x = 116 + 80 - 2 * Rr * Math.cos(60 * Math.PI / 180) + Math.random();
bm[7].y = 116 - 6 * Rr * Math.sin(60 * Math.PI / 180) + Math.random();
bm[8].x = 116 + 80 + 2 * Rr * Math.cos(60 * Math.PI / 180) + Math.random();
bm[8].y = 116 - 6 * Rr * Math.sin(60 * Math.PI / 180) + Math.random();
bm[9].x = 116 + 80 + Math.random();
bm[9].y = 116 - 4 * Rr * Math.sin(60 * Math.PI / 180) + Math.random();
aa.init(bm);
paint_a();
stage.addEventListener(KeyboardEvent.KEY_DOWN, move);
}
private function move(event:KeyboardEvent):void
{
if (event.keyCode == 37 || event.keyCode == 65)
aa.Qd[0][xx] -= 15; //left
if (event.keyCode == 38 || event.keyCode == 87)
aa.Qd[0][yy] -= 15; //up
if (event.keyCode == 39 || event.keyCode == 68)
aa.Qd[0][xx] += 15; //right
if (event.keyCode == 40 || event.keyCode == 83)
aa.Qd[0][yy] += 15; //down
if (event.keyCode == 82) //'r'
init_a();
}
private function run_a(event:Event):void
{
var i:int;
aa.run(bm);
}
private function paint_a():void
{
line.graphics.lineStyle(1, 0x924949);
line.graphics.moveTo(5, 5);
line.graphics.lineTo(5, 460);
line.graphics.lineTo(232, 460);
line.graphics.lineTo(232, 5);
line.graphics.lineTo(5, 5);
line.x = 80;
addChild(line);
var g:Graphics = wall.graphics;
g.beginFill(0x924949);
g.drawRect(0 , 0, 237, 5);
g.drawRect(0 , 0, 5, 465);
g.drawRect(232 , 0, 5, 465);
g.drawRect(0 , 460, 237, 5);
g.endFill();
wall.x = 80;
addChild(wall);
}
}
}
import flash.utils.IDataInput;
import flash.display.Shape;
class Ball extends Shape{
function Ball(color:uint){
this.graphics.beginFill(color);
this.graphics.drawCircle(0, 0, 5);
this.graphics.endFill();
}
}
class inte {
public var dt:Number = 0.01;
public var q:int = 0;
public var N:int = 10;
public var Q:Array;
public var Qd:Array;
public var Qd01:Array;
public var Qd02:Array;
public var Qd03:Array;
public function inte()
{
Q = new Array(N);
Qd = new Array(N);
Qd01 = new Array(N);
Qd02 = new Array(N);
Qd03 = new Array(N);
for (var i:int = 0; i < N; i++) {
Q[i] = new Vector.<Number>(3, true);
Qd[i] = new Vector.<Number>(3, true);
Qd01[i] = new Vector.<Number>(3, true);
Qd02[i] = new Vector.<Number>(3, true);
Qd03[i] = new Vector.<Number>(3, true);
}
}
public function init(bm:Vector.<Ball>):void{
for(var i:int = 0; i < N; i++){
Q[i][0] = bm[i].x;
Q[i][1] = bm[i].y;
Qd[i][0] = 0.0;
Qd[i][1] = 0.0;
for(var j:int = 0; j < 3; j++){
Qd01[i][j] = 0;
Qd02[i][j] = 0;
Qd03[i][j] = 0;
}
}
}
public function run(bm:Vector.<Ball>):void{
q += 1;
const xx:int = 0;
const yy:int = 1;
for(var i:int = 0; i < N; i++){
bm[i].x = Q[i][xx];
bm[i].y = Q[i][yy];
inte_a(q, Qd[i][xx], Q, i, xx);
inte_a(q, Qd[i][yy], Q, i, yy);
}
if(q > 3){ q = 4; }
const e:Number = 1.0;
const R:Number = 5.0;
const frameRight:Number = 232.0 + 80 - R;
const frameLeft:Number = 10.0 + 80;
const frameBottom:Number = 465.0 - R;
const frameTop:Number = 10.0 ;
for(i = 0; i < N; i++){
if(Q[i][xx] > frameRight){
Qd[i][xx] = - Qd[i][xx];
//Q[i][xx] = frameRight;
}
if(Q[i][xx] < frameLeft){
Qd[i][xx] = - Qd[i][xx];
//Q[i][xx] = frameLeft;
}
if(Q[i][yy] > frameBottom){
Qd[i][yy] = - Qd[i][yy];
//Q[i][yy] = frameBottom;
}
if(Q[i][yy] < frameTop){
Qd[i][yy] = - Qd[i][yy];
//Q[i][yy] = frameTop;
}
for(var j:int = i+1; j < N; j++){
var px:Number = Q[j][xx] - Q[i][xx];
var py:Number = Q[j][yy] - Q[i][yy];
var d:Number = Math.sqrt((px * px) + (py * py));
var p_2:Number = d * d;
if(d < 2 * R){
var ap:Number = Qd[i][xx] * px + Qd[i][yy] * py;
var tempvx:Number = Qd[i][xx] - 2 * ap / p_2 * px;
var tempvy:Number = Qd[i][yy] - 2 * ap / p_2 * py;
Qd[i][xx] = Qd[j][xx];
Qd[i][yy] = Qd[j][yy];
Qd[j][xx] = tempvx ;
Qd[j][yy] = tempvy ;
}
}
}
}
public function inte_a(q:int, Qd:Number, Q:Array, a:int, xyz:int):void
{
var l1:Number, l2:Number, l3:Number, l4:Number;
if(q==1||q==2||q==3){
l1 = dt * Qd;
l2 = dt * (Qd + l1/2);
l3 = dt * (Qd + l2/2);
l4 = dt * (Qd + l3);
this.Qd[a][xyz] = Qd ;
Q[a][xyz] = Q[a][xyz] + (l1 + 2*l2 + 2*l3 + l4)/6;
if(q==1) {
Qd01[a][xyz] = Qd[a][xyz];
}
if(q==2) {
Qd02[a][xyz] = Qd01[a][xyz];
}
if(q==3) {
Qd03[a][xyz] = Qd02[a][xyz];
}
}
else{
this.Qd[a][xyz] = Qd ;
Q[a][xyz] = Q[a][xyz] + ( 55*this.Qd[a][xyz] - 59*Qd01[a][xyz] + 37*Qd02[a][xyz] - 9*Qd03[a][xyz] )*dt/24;
}
Qd03[a][xyz] = Qd02[a][xyz];
Qd02[a][xyz] = Qd01[a][xyz];
Qd01[a][xyz] = this.Qd[a][xyz];
}
}