kansen
forked from 3D rotation 01 (diff: 199)
重いです シュミレーションチックなflashです。 赤が感染者で半径5pxの中に入ると一定の割合で感染します 感染者は1秒(33フレーム)で治ります。 壁では跳ね返ります。
ActionScript3 source code
/**
* Copyright katsumi ( http://wonderfl.net/user/katsumi )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/h9yX
*/
//重いです
//シュミレーションチックなflashです。
//赤が感染者で半径5pxの中に入ると一定の割合で感染します
//感染者は1秒(33フレーム)で治ります。
//壁では跳ね返ります。
package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
public class FlashTest extends Sprite {
private var kosu:Number=200; //粒の数
private var dot:Array;
private var rate:Number=50; //感染率
private var init_num:Number=1; //最初の感染者の数
private var SW:Number;
private var SH:Number;
private var screen:Sprite;
public function FlashTest() {
SW=stage.stageWidth;
SH=stage.stageHeight;
dot=new Array();
screen = new Sprite();
screen.graphics.clear();
screen.x=0;
screen.y=0;
this.addChild(screen);
for(var i:Number=0;i<kosu;i++){
if(i<init_num){
dot.push(new Particle(1));
}else{
dot.push(new Particle(0));
}
dot[i].x = SW*Math.random();
dot[i].y = SH*Math.random();
this.addChild(dot[i]);
}
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void {
var kenko:Array=new Array();
var kansen:Array=new Array();
screen.graphics.clear();
screen.graphics.beginFill(0x0000ff,0.2);
for(var i:Number=0;i<kosu;i++){
dot[i].x+=dot[i].u;
dot[i].y+=dot[i].v;
boundary2(i);
dot[i].chg_v();
if(dot[i].state==1){
dot[i].kaihuku();
kansen.push(dot[i]);
}else{
kenko.push(dot[i]);
}
}
for(var j:Number=0;j<kansen.length;j++){
for(i=0;i<kenko.length;i++){
if(kenko[i].hitTestObject(kansen[j])){
if(100*Math.random()<rate){
kenko[i].kansen();
}
}
}
}
}
private function boundary(i:Number):void{
if(dot[i].x<0){
dot[i].x+=SW;
}else if(dot[i].x>SW){
dot[i].x-=SW;
}
if(dot[i].y<0){
dot[i].y+=SH;
}else if(dot[i].y>SH){
dot[i].y-=SH;
}
}
private function boundary2(i:Number):void{
//剛体壁境界
if(dot[i].x<0){
dot[i].x=0;
dot[i].chg_v2()
}else if(dot[i].x>SW){
dot[i].x=SW;
dot[i].chg_v2()
}
if(dot[i].y<0){
dot[i].y=0;
dot[i].chg_v2()
}else if(dot[i].y>SH){
dot[i].y=SH;
dot[i].chg_v2()
}
}
}
}
import flash.display.*;
class Particle extends Sprite {
public var state:Number;
public var u:Number;
public var v:Number;
private var v_size:Number;
private var v_theta:Number;
private var day:Number;
public function Particle(state:Number=0){
this.state=state;
this.v_size = Math.random()*5;
this.v_theta = Math.random()*360;
this.u = v_size*Math.cos(v_theta*Math.PI/180);
this.v = v_size*Math.sin(v_theta*Math.PI/180);
this.graphics.clear();
this.graphics.lineStyle(0,0,0);
if(state==0){
this.graphics.beginFill(0x00ffff);
}else{
this.graphics.beginFill(0xff0000,0);
this.graphics.drawCircle(0,0,10);
this.graphics.beginFill(0xff0000);
this.day=33;
}
this.graphics.drawCircle(0,0,2);
this.graphics.endFill();
}
public function kansen():void{
this.state=1;
this.graphics.clear();
this.graphics.beginFill(0xff0000,0);
this.graphics.drawCircle(0,0,10);
this.graphics.beginFill(0xff0000);
this.graphics.drawCircle(0,0,2);
this.graphics.endFill();
this.day=33;
}
public function chg_v():void{
this.v_theta += Math.random()*45-22.5;
//this.v_size += Math.random()*1-0.5;
this.u = v_size*Math.cos(v_theta*Math.PI/180);
this.v =v_size*Math.sin(v_theta*Math.PI/180);
}
public function chg_v2():void{
this.v_theta += 180;
this.u = v_size*Math.cos(v_theta*Math.PI/180);
this.v =v_size*Math.sin(v_theta*Math.PI/180);
}
public function kaihuku():void{
this.day-=1;
if(day==0){
this.state=0;
this.graphics.clear();
this.graphics.beginFill(0x00ffff);
this.graphics.drawCircle(0,0,2);
this.graphics.endFill();
}
}
}
