エビフライミサイル クリックで加速します nemu90kWw forked:4favorite:11lines:294license : All rights reserved modified : 2009-01-23 07:30:55 Embed Tweet //クリックで加速します package { import flash.display.*; import flash.events.*; [SWF(width="240", height="240", backgroundColor="0x188000", frameRate="60")] public class FLIFLIXX extends Sprite { private var ebifly:Ebifly = new Ebifly(); public function FLIFLIXX() { Mouse.setListener(stage); ebifly.x = 120; ebifly.y = 120; addChild(ebifly); } } } import flash.display.*; import flash.events.*; class Ebifly extends Sprite { private var count:int = 0; private var currentframe:int = 0; private var vx:Number = 0, vy:Number = 0; private var sx:Number = 0, sy:Number = 0; private var angle:Number, prevangle:Number; private var wait:Boolean = true; function Ebifly() { addEventListener(Event.ENTER_FRAME, onEnterFrame); } public function onEnterFrame(e:Event):void { if(count % 3 == 0) { nextFrame(); var bearing:Number; prevangle = angle; if(getDistance(Mouse.x-x, Mouse.y-y) > 20) { angle = getAngle(Mouse.x-x, Mouse.y-y); //相対角度を取得 bearing = MathEx.getBearing(prevangle, angle); } else { bearing = 0; } if(wait == true) { if(Mouse.isDown == true) {wait = false;} } else { //加速 var speed:Number; if(Mouse.isDown) {speed = 1.7;} else {speed = 0.9;} vx += MathEx.getVectorX(angle, speed); vy += MathEx.getVectorY(angle, speed); //減速 var brake:Number; if(Mouse.isDown) {brake = 1.05 + (Math.abs(bearing)/80);} else {brake = 1.12 + (Math.abs(bearing)/260);} vx /= brake; vy /= brake; } //煙 if(count % 6 == 0 && Mouse.isDown) { var smoke:Smoke = new Smoke(); smoke.x = x-4+Math.random()*8; smoke.y = y-4+Math.random()*8; smoke.angle = angle-8+Math.random()*16; smoke.speed = (-10-2+Math.random()*4)/3; smoke.ax = (vx / 2)/3; smoke.ay = (vy / 2)/3; parent.addChild(smoke); } sx = (sx * 3 + (1.1-getDistance(vx, vy)*0.02) + 1) / 5; sy = (sy * 3 + (0.8+getDistance(vx, vy)*0.04) + 1) / 5; } else if(getDistance(Mouse.x-x, Mouse.y-y) > 20) { angle = getAngle(Mouse.x-x, Mouse.y-y); } x += vx/3; y += vy/3; if(currentframe < 5) {scaleX = sx;} else {scaleX = -sx;} scaleY = sy; rotation = angle * (360/256); count++; } public function getAngle(x:Number, y:Number):Number { return (Math.atan2(y, x)*128/Math.PI)+64; } public function getDistance(x:Number, y:Number):Number { return Math.sqrt((x)*(x)+(y)*(y)); } private function nextFrame():void { if(currentframe == 7) {currentframe = 0;} else {currentframe++;} var g:Graphics = graphics; g.clear(); //後ろ switch(currentframe) { case 0: g.beginFill(0xF83038); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([-6.3, -2.0, -13.2, 11.8, -4, 3.8])); g.endFill(); g.beginFill(0xF83038); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([6.3, -2.0, 13.2, 11.8, 4, 3.8])); g.endFill(); break; case 1: case 7: g.beginFill(0xF83038); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([-8.5, -2.0, -15, 11, -5.7, 3.5])); g.endFill(); g.beginFill(0xE02030); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([4.8, -2.0, 10.7, 12, 2.6, 4.0])); g.endFill(); break; case 2: case 6: break; case 3: case 5: g.beginFill(0xE02030); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([1.8, -2.0, 4.7, 13.2, 0, 4.5])); g.endFill(); break; case 4: g.beginFill(0xE02030); g.drawPath(Vector.<int>([1,2,2,2]), Vector.<Number>([0, 2, -1.1, 4.4, 0, 13.2, 1.1, 4.4])); g.endFill(); break; } //本体 g.beginFill(0xF8FF80); g.drawPath(Vector.<int>([1,2,2,2,2,2,2,2,2]), Vector.<Number>([0, -12, 5, -8.4, 6, 1.9, 4.2, 5.2, 1.4, 6.5, -1.4, 6.5, -4.2, 5.2, -6, 1.9, -5, -8.4])); g.endFill(); //前側 switch(currentframe) { case 0: g.beginFill(0xFF4840); g.drawPath(Vector.<int>([1,2,2,2]), Vector.<Number>([0, 1.5, -1.5, 4.4, 0, 13.2, 1.5, 4.4])); g.endFill(); break; case 1: case 7: g.beginFill(0xFF4840); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([1.8, -1.4, -0.3, 4.5, 4.7, 13.2])); g.endFill(); break; case 2: case 6: g.beginFill(0xFF4840); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([-9.3, -2.1, -16.2, 10.6, -6.5, 3.1])); g.endFill(); g.beginFill(0xFF4840); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([3.1, -1.4, 8.4, 12.9, 1.1, 4.5])); g.endFill(); break; case 3: case 5: g.beginFill(0xFF4840); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([-8.5, -2, -15.7, 10.9, -5.7, 3.5])); g.endFill(); g.beginFill(0xFF4840); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([4.8, -1.7, 10.7, 12, 2.6, 4])); g.endFill(); break; case 4: g.beginFill(0xFF4840); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([-6.3, -2.0, -13.8, 11.8, -4, 3.8])); g.endFill(); g.beginFill(0xFF4840); g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([6.3, -2.0, 13.8, 11.8, 4, 3.8])); g.endFill(); break; } } } class Smoke extends Sprite { private var count:int = 0; private var currentframe:int = 0; public var angle:Number = 0, speed:Number = 0; public var ax:Number = 0, ay:Number = 0; function Smoke() { addEventListener(Event.ENTER_FRAME, onEnterFrame); } public function onEnterFrame(e:Event):void { x += MathEx.getVectorX(angle, speed) + ax; y += MathEx.getVectorY(angle, speed) + ay; if(count % 3 == 0) { nextFrame(); if(currentframe == 7) { removeEventListener(Event.ENTER_FRAME, onEnterFrame); parent.removeChild(this); return; } } count++; } private function nextFrame():void { var g:Graphics = graphics; g.clear(); switch(currentframe) { case 0: g.beginFill(0xFFFFFF); g.drawCircle(0, 0, 6); g.endFill(); break; case 1: g.beginFill(0xFFFFFF); g.drawCircle(0, 0, 4); g.endFill(); break; case 2: g.lineStyle(4.5, 0xFFFFFF); g.drawCircle(0, 0, 3.75); break; case 3: g.lineStyle(2.5, 0xFFFFFF); g.drawCircle(0, 0, 5.75); break; case 4: g.lineStyle(1.5, 0xFFFFFF); g.drawCircle(0, 0, 7.25); break; case 5: g.lineStyle(0.75, 0xFFFFFF); g.drawCircle(0, 0, 8); break; } currentframe++; } } class MathEx { public static function getVectorX(dir:Number, speed:Number):Number { return Math.cos(Math.PI/128*(dir+192))*speed; } public static function getVectorY(dir:Number, speed:Number):Number { return Math.sin(Math.PI/128*(dir+192))*speed; } public static function getBearing(dir1:Number, dir2:Number):Number { var d1:Number = normalizeAngle(dir1); var d2:Number = normalizeAngle(dir2); if(d2-128 > d1) {d1 += 256;} if(d2+128 < d1) {d1 -= 256;} return d1-d2; } public static function normalizeAngle(dir:Number):Number { if (dir < -128) {dir = 256 - (-dir % 256);} return (dir + 128) % 256 - 128; } } class Mouse { public static var x:Number = 0; public static var y:Number = 0; public static var isDown:Boolean = false; public static function setListener(stage:Stage):void { stage.mouseChildren = false; stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private static function onMouseMove(event:Event):void { x = event.target.mouseX; y = event.target.mouseY; } private static function onMouseDown(event:Event):void {isDown = true;} private static function onMouseUp(event:Event):void {isDown = false;} } Code Fullscreen Preview Fullscreen tjoen anvide24 AI_615 fallen Nao_u paO shinsui Waiting_wt o8que mautop : anglefollower,mathmouse k0rin : この操作系いいなー/アニメーション手付けで驚いた。 angle follower, math mouse drawPath beginFill endFill nextFrame drawCircle stage mouseChildren scaleX clear graphics Math.abs rotation addEventListener scaleY removeChild MouseEvent.MOUSE_MOVE mouseY MouseEvent.MOUSE_UP Math.PI mouseX sort new page view favorite forked pv0 forked from: エビフライミサイル pushka1971 forked:0 favorite:0lines:294 (diff:1) pv333 forked from: エビフライミサイル nedric forked:0 favorite:0lines:294 (diff:1) pv431 forked from: エビフライミサイル shinsui forked:0 favorite:0lines:293 (diff:33) pv608 forked from: エビフライミサイル mash forked:0 favorite:0lines:318 (diff:46)