forked from: 固定弾幕回避学習結果再生機
forked from 固定弾幕回避学習結果再生機 (diff: 1)
ActionScript3 source code
/**
* Copyright uwi ( http://wonderfl.net/user/uwi )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/s8Yh
*/
// forked from uwi's 固定弾幕回避学習結果再生機
// forked from uwi's GAで固定弾幕回避学習
package {
import com.flashdynamix.utils.SWFProfiler;
import flash.text.TextField;
import flash.display.*;
import flash.filters.*;
import flash.geom.*;
import flash.events.*;
import flash.ui.*;
import flash.utils.getTimer;
public class GAReplayer extends Sprite {
private var _bullets : Array;
private var _ct : int;
private var _myx : Point;
private var _nhit : int;
private const R_BULLET : Number = 10.0;
private const R_ME : Number = 5.0;
private const INFD : Number = (R_BULLET + R_ME) * (R_BULLET + R_ME);
private var _tf : TextField;
private var _space : BitmapData;
private var _bgspace : BitmapData;
private var _shapeself : Shape;
private var _bmdbullet : BitmapData;
// ここに回避パターンを書く
private var _avptn : String = "658701555028870016338851773121884401445661188877334888333333078770011624422711263180470805521437540008774580000007766600552250044440002288806660075540000554224006666433357711388704550022130338100088000000777000000000000221111611137778333235571666555505000000000000000000666000000000000000000000000005";
private const P0 : Point = new Point(0, 0);
private const WEAKBLUR : BitmapFilter = new BlurFilter(2.0, 2.0);
public function GAReplayer() {
Wonderfl.capture_delay(5);
SWFProfiler.init(this);
// 宇宙
_space = new BitmapData(465, 465, false, 0x000000);
var bmpspace : Bitmap = new Bitmap(_space);
addChild(bmpspace);
var shs : Shape = new Shape();
var mat : Matrix = new Matrix();
mat.createGradientBox(465, 465, 0, 0, 0);
shs.graphics.beginGradientFill(
"linear",
[0x333377, 0x000000],
[1, 1],
[0, 255],
mat
);
shs.graphics.drawRect(0, 0, 465, 465);
shs.graphics.endFill();
_bgspace = new BitmapData(465, 465, false, 0x000000);
_bgspace.draw(shs);
_shapeself = new Shape();
// 弾描画
var bevel : BitmapFilter = new GradientBevelFilter(4.0, 45, [0xffffff, 0x0000ff], [1.0, 1.0], [70, 255], 4.0, 4.0, 1, 2, "inner");
var sh : Shape = new Shape();
var g : Graphics = sh.graphics;
g.lineStyle(1.0, 0x999999);
g.beginFill(0xeeeeee);
g.drawCircle(R_BULLET, R_BULLET, R_BULLET);
g.endFill();
_bmdbullet = new BitmapData(R_BULLET * 2, R_BULLET * 2, true, 0x00000000);
_bmdbullet.draw(sh);
_bmdbullet.applyFilter(_bmdbullet, _bmdbullet.rect, P0, bevel);
_bmdbullet.applyFilter(_bmdbullet, _bmdbullet.rect, P0, WEAKBLUR);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
// デバッグ用
_tf = new TextField();
_tf.autoSize = "left";
// _tf.text = "" + _bmd.width + "\t" + _bmd.height;
_tf.textColor = 0xffffff;
_tf.borderColor = 0xffffff;
_tf.border = true;
addChild(_tf);
init();
}
private var _kf : uint = 0;
private var _state : int;
private function onKeyDown(e : KeyboardEvent) : void
{
if(e.keyCode == Keyboard.SPACE && _state == 1){
init();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
if(e.keyCode == Keyboard.DOWN){
_kf |= 1;
}else if(e.keyCode == Keyboard.UP){
_kf |= 2;
}else if(e.keyCode == Keyboard.RIGHT){
_kf |= 4;
}else if(e.keyCode == Keyboard.LEFT){
_kf |= 8;
}
}
private function onKeyUp(e : KeyboardEvent) : void
{
if(e.keyCode == Keyboard.DOWN){
_kf ^= 1;
}else if(e.keyCode == Keyboard.UP){
_kf ^= 2;
}else if(e.keyCode == Keyboard.RIGHT){
_kf ^= 4;
}else if(e.keyCode == Keyboard.LEFT){
_kf ^= 8;
}
}
private function init() : void
{
_myx = new Point(465 / 2, 465 / 2);
_bullets = [];
_ct = 0;
_nhit = 0;
_state = 0;
}
private function onEnterFrame(e : Event) : void
{
draw();
judge();
_ct++;
if(_ct % 7 == 0){
addBullet(0, 0, 5);
addBullet(200, 0, 5);
addBullet(465, 0, 5);
}
moveMe();
moveBullets();
_tf.text =
"time : " + _ct +
"\nhit : " + _nhit +
"\nbullets : " + _bullets.length +
"\n_kf : " + _kf;
}
// LRUD
private var mv : Array = [
null, [0, 6], [0, -6], null,
[6, 0], [4, 4], [4, -4], null,
[-6, 0], [-4, 4], [-4, -4], null,
null, null, null, null];
private const ST : Array = [
[0, 0],
[6, 0], [4, -4], [0, -6], [-4, -4],
[-6, 0], [-4, 4], [0, 6], [4, 4]
];
private function moveMe() : void
{
var step : int = (_ct - 1) / 3;
if(step >= _avptn.length){
_state = 1;
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
return;
}
_myx.x += ST[int(_avptn.charAt(step))][0];
_myx.y += ST[int(_avptn.charAt(step))][1];
/*
// 自機
if(mv[_kf]){
_myx.x += mv[_kf][0];
_myx.y += mv[_kf][1];
}
*/
}
private function moveBullets() : void
{
// 弾
for each(var b : Bullet in _bullets){
b.xx += b.vx;
b.xy += b.vy;
}
}
// 弾削除
private function removeBullet(i : int) : void
{
if(i < _bullets.length - 1){
_bullets[i] = _bullets.pop();
}else{
_bullets.pop();
}
}
// 当たり判定
private function judge() : void
{
for(var i : int = _bullets.length - 1;i >= 0;i--){
var b : Bullet = _bullets[i];
if(
(b.xx - _myx.x) * (b.xx - _myx.x) +
(b.xy - _myx.y) * (b.xy - _myx.y)
< INFD){
_nhit++;
removeBullet(i);
continue;
}
if(b.xx < 0 || b.xx > 465.0 || b.xy < 0 || b.xy > 465.0){
removeBullet(i);
}
}
if(_myx.x < 0 || _myx.x > 465.0 || _myx.y < 0 || _myx.y > 465.0){
_nhit+=10;
_myx.x = 465 / 2;
_myx.y = 465 / 2;
}
}
// 描画
private function draw() : void
{
_space.lock();
_space.fillRect(_space.rect, 0x000000);
// _space.copyPixels(_bgspace, _bgspace.rect, P0);
var g : Graphics = _shapeself.graphics;
g.clear();
// self
g.lineStyle(1.0, 0x333399);
g.beginFill(0x3333ff);
g.drawCircle(_myx.x, _myx.y, 5);
g.endFill();
_space.draw(_shapeself, null, null, BlendMode.ADD);
// bullets
for each(var b : Bullet in _bullets){
_space.copyPixels(_bmdbullet, _bmdbullet.rect,
new Point(b.xx - R_BULLET, b.xy - R_BULLET));
}
_space.unlock();
}
// 弾追加
private function addBullet(x : Number, y : Number, v : Number) : void
{
var r : Number = Math.sqrt((_myx.x - x) * (_myx.x - x) + (_myx.y - y) * (_myx.y - y));
var b : Bullet = new Bullet();
b.xx = x;
b.xy = y;
b.vx = v * (_myx.x - x) / r;
b.vy = v * (_myx.y - y) / r;
b.r = R_BULLET;
_bullets.push(b);
}
}
}
class Bullet
{
public var xx : Number;
public var xy : Number;
public var vx : Number;
public var vy : Number;
public var r : Number;
}