Flashで作る3Dのお勉強8 Flashで作る3Dのお勉強8 stageをクリックするとプレートがY軸に一回転して止まるように。コードが冗長…。 ta6b forked:1favorite:0lines:126license : MIT License modified : 2009-06-23 17:40:44 Embed Tweet //Flashで作る3Dのお勉強8 //stageをクリックするとプレートがY軸に一回転して止まるように。コードが冗長…。 package { import flash.display.Sprite; import flash.events.*; [SWF(backgroundColor=0xffffff, frameRate=60)] public class Lines3D2 extends Sprite { private var points:Array; private var numPoints:int = 4; private var fl:Number = 250; private var vpX:Number = stage.stageWidth / 2; private var vpY:Number = stage.stageHeight / 2; public function Lines3D2() { init(); } private function init():void { points = new Array(); points[0] = new Point3D( -100, -100, 0); points[1] = new Point3D( 100, -100, 0); points[2] = new Point3D( 100, 100, 0); points[3] = new Point3D( -100, 100, 0); for (var i:int = 0; i < numPoints; i++) { points[i].setVanishingPoint(vpX, vpY); points[i].setCenter(0, 0, 200); } addEventListener(Event.ENTER_FRAME, enterFrameHandler); stage.addEventListener(MouseEvent.CLICK, enterRotateY); } private function enterFrameHandler(e:Event):void { graphics.clear(); graphics.lineStyle(0); graphics.moveTo(points[0].screenX, points[0].screenY); for (var i:int = 1; i < numPoints; i++) { graphics.lineTo(points[i].screenX, points[i].screenY); } graphics.lineTo(points[0].screenX, points[0].screenY); } private function enterRotateY(e:MouseEvent):void { addEventListener(Event.ENTER_FRAME, rotateY1); } private function rotateY1(e:Event):void { var angleY:Number = 5*Math.PI/180; for (var i:int = 0; i < numPoints; i++) { var point:Point3D = points[i]; point.rotateY(angleY); } if (point.rotationY > Math.PI-angleY) { var sabun:Number = point.rotationY - Math.PI; for (i = 0; i < numPoints; i++) { point = points[i]; point.rotateY(sabun); } removeEventListener(Event.ENTER_FRAME, rotateY1); point.rotationY = 0; return; } trace(point.rotationY); } } } class Point3D { public var fl:Number = 250; public var _rotationY:Number = 0; private var vpX:Number = 0; private var vpY:Number = 0; private var cX:Number = 0; private var cY:Number = 0; private var cZ:Number = 0; private var x:Number = 0; private var y:Number = 0; private var z:Number = 0; public function Point3D(x:Number = 0, y:Number = 0, z:Number = 0) { this.x = x; this.y = y; this.z = z; } public function setVanishingPoint(vpX:Number, vpY:Number):void { this.vpX = vpX; this.vpY = vpY; } public function setCenter(cX:Number, cY:Number, cZ:Number = 0):void { this.cX = cX; this.cY = cY; this.cZ = cZ; } public function get screenX():Number { var scale:Number = fl / (fl + z + cZ); return vpX + cX + x * scale; } public function get screenY():Number { var scale:Number = fl / (fl + z + cZ); return vpY + cY + y * scale; } public function get rotationY():Number { return _rotationY; } public function set rotationY(angleY:Number):void { _rotationY = angleY; } public function rotateX(angleX:Number):void { var cosX:Number = Math.cos(angleX); var sinX:Number = Math.sin(angleX); var y1:Number = y * cosX - z * sinX; var z1:Number = z * cosX + y * sinX; y = y1; z = z1; } public function rotateY(angleY:Number):void { var cosY:Number = Math.cos(angleY); var sinY:Number = Math.sin(angleY); var x1:Number = x * cosY - z * sinY; var z1:Number = z * cosY + x * sinY; x = x1; z = z1; _rotationY += angleY; } public function rotateZ(angleZ:Number):void { var cosZ:Number = Math.cos(angleZ); var sinZ:Number = Math.sin(angleZ); var x1:Number = x * cosZ - y * sinZ; var y1:Number = y * cosZ + x * sinZ; x = x1; y = y1; } } Code Fullscreen Preview Fullscreen screenX rotationY screenY Math.cos Math.PI removeEventListener MouseEvent.CLICK Math.sin Event.ENTER_FRAME trace MouseEvent addEventListener Event Array Sprite int Number sort new page view favorite forked pv220 forked from: Flashで作る3Dのお勉強8 hacker_lpw4me25 forked:0 favorite:0lines:126 (diff:1)