砲台と弾丸 砲台と弾丸 2010/08/22 Zier 速度とかメモリとか全く考慮せず、思うがままに即興で作ったコードです。 つい勢いでやってしまった。後悔は(ry zier forked:0favorite:0lines:148license : MIT License modified : 2010-08-22 17:53:33 Embed Tweet /* 砲台と弾丸 2010/08/22 Zier 速度とかメモリとか全く考慮せず、思うがままに即興で作ったコードです。 つい勢いでやってしまった。後悔は(ry */ package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; [SWF(width=465, height=465, framerate=60)] public class Main extends Sprite { private static const SCREEN_WIDTH: int = 465 private static const SCREEN_HEIGHT: int = 465 private var turret: Turret = null private var me: MouseEvent = null private var trigger: Boolean = false private var bullets: Array = [] public function Main():void { graphics.beginFill(0x0) graphics.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) graphics.endFill() turret = new Turret(SCREEN_WIDTH / 2, SCREEN_HEIGHT) turret.addEventListener(Turret.ADD_BULLET, onAddBullet) addChild(turret) addEventListener(Event.ENTER_FRAME, onEnterFrame) stage.addEventListener(MouseEvent.MOUSE_DOWN, function(): void { trigger = true } ) stage.addEventListener(MouseEvent.MOUSE_UP, function(): void { trigger = false } ) } private var nextAddBullet: Bullet = null; private function onAddBullet(e: BulletEvent): void { nextAddBullet = new Bullet(turret.x + e.pos, turret.y, mouseX, mouseY) } private var frameProcessing: Boolean = false private function onEnterFrame(e: Event): void { if (frameProcessing) return frameProcessing = true if (null != nextAddBullet) { bullets.push(nextAddBullet) addChild(nextAddBullet) nextAddBullet = null } turret.frameAction(trigger) var i: int for (i = 0; i < bullets.length; i++) { var bullet: Bullet = bullets[i] if (null != bullet) { if (bullet.frameAction()) { removeChild(bullet) bullets[i] = null } } } i = bullets.length while (0 < i--) { if (null == bullets[i]) bullets.splice(i, 1) } frameProcessing = false } } } import flash.events.Event import flash.display.Sprite import flash.geom.Point class BulletEvent extends Event { private var _pos: int = 0 public function get pos(): int { return _pos } public function BulletEvent(type:String, pos: int, bubbles:Boolean = false, cancelable:Boolean = false) { super(type, bubbles, cancelable); _pos = pos; } } // 弾丸 class Bullet extends Sprite { private var t: Point private var d: Point private static const BULLET_SIZE: int = 3 public function Bullet(_x: int, _y: int, _tx: int, _ty: int): void { graphics.beginFill(0xFFFFFF) graphics.drawEllipse(-BULLET_SIZE/2, -BULLET_SIZE/2, BULLET_SIZE, BULLET_SIZE) graphics.endFill() x = _x y = _y t = new Point(_tx, _ty) d = t.subtract(new Point(x, y)) d.normalize(10) frameAction() } public function frameAction(): Boolean { x += d.x y += d.y var cx: Boolean = (0 <= d.x) ? t.x <= x : x <= t.x; var cy: Boolean = (0 <= d.y) ? t.y <= y : y <= t.y; return (cx && cy) } } // 砲身 class Barrel extends Sprite { private static const BARREL_LENGTH: int = 20 private var _pos: int = 0 private var _loading: int = 0 public function get pos(): int { return _pos } public function loading(): Boolean { return 0 < _loading } public function Barrel(pos: int = 0) { _pos = pos } public function frameAction(): void { if (0 < _loading) _loading -= 2 var d: Point = new Point(mouseX, mouseY) d.normalize(BARREL_LENGTH - _loading) graphics.clear() graphics.lineStyle(2, 0xc0c0c0) graphics.moveTo(_pos, 0) graphics.lineTo(d.x + _pos, d.y) } public function shot(): void { _loading = 8 } } // 砲塔 class Turret extends Sprite { public static const ADD_BULLET: String = "addBullet" private static const SIZE: int = 25 private var barrels: Array = [] private var actionIndex: int = 0 private var _loading: int = 0 public function Turret(_x: int, _y: int): void { x = _x y = _y barrels.push(new Barrel(-3)) barrels.push(new Barrel(0)) barrels.push(new Barrel(+3)) for each (var barrel: Barrel in barrels) addChild(barrel) var armor: Sprite = new Sprite() with (addChild(armor)) { graphics.beginFill(0xe0e0e0) graphics.drawEllipse(-SIZE/2, -SIZE/2, SIZE, SIZE) graphics.endFill() } } public function loading(): Boolean { return 0 < _loading } public function shot(): void { if (loading()) return actionIndex = (actionIndex + 1) % barrels.length var barrel: Barrel = barrels[actionIndex] if (barrel.loading()) return barrel.shot() _loading = 3; dispatchEvent(new BulletEvent(ADD_BULLET, barrel.pos)) } public function frameAction(trigger: Boolean): void { if (0 < _loading) _loading -= 1 if (trigger) shot() for each (var barrel: Barrel in barrels) barrel.frameAction() } } Code Fullscreen Preview Fullscreen cancelable bubbles Boolean type normalize mouseY mouseX subtract dispatchEvent Point addChild removeChild splice addEventListener Event push Event.ENTER_FRAME length String Array