Показать сообщение отдельно
Старый 22.04.2012, 21:23
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 10  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Возвращаясь к вопросу.

С секторами получилось отлично. Теперь хочу позиционировать текстовые поля также как спицы рулеточного колеса - ровно посредине каждого сектора, а получается все криво. Или надписи не отцентрованы по секторам или вообще пропадает половина. Вот скрин:

[IMG]http://*************/clip/m0/1335111274-clip-59kb.jpg[/IMG]

Класс сектора:
Код AS3:
package comps
{
	import flash.display.Loader;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.filters.GlowFilter;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.net.URLRequest;
	import flash.text.AntiAliasType;
	import flash.text.Font;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;
	import flash.geom.Vector3D;
	import spark.effects.Rotate;
 
	public class Sector extends Sprite
	{
		public var value:String;
		public var names:String;
		public var color:uint;
		private var imageX1:Number;
		private var imageY1:Number;
		private var imageX2:Number;
		private var imageY2:Number;
		[Embed(source="font/SEGOEUIB.TTF", fontFamily="SegoeUI", mimeType="application/x-font", embedAsCFF="false", advancedAntiAliasing="true")]
		private var MoolEmbed:Class;
 
		public function Sector(tip:String, rot:Number, centerX:Number, centerY:Number, innerRadius:Number, outerRadius:Number, startAngle:Number, arcAngle:Number, val:Number, color:uint, alpha:Number, url:String, value:Number, steps:int=20)
		{
			Font.registerFont(MoolEmbed);
			var myArc:Sprite = new Sprite();
			myArc.graphics.lineStyle(2);
			myArc.graphics.beginFill(color, alpha);
			drawSolidArc (myArc,centerX, centerY, innerRadius, outerRadius, startAngle, arcAngle, url, steps);
			myArc.graphics.endFill();
 
			this.addChild(myArc);
 
				var myFormat:TextFormat = new TextFormat();
				myFormat.size = 20;
				myFormat.align = TextFormatAlign.CENTER;
				myFormat.font = 'SegoeUI';
				myFormat.bold = true;
 
				var myText:TextField = new TextField();
				myText.defaultTextFormat = myFormat;
				myText.setTextFormat(myFormat);
				myText.embedFonts = true;
				myText.antiAliasType = AntiAliasType.ADVANCED;
				myText.text = url;
				this.addChild(myText);
 
				myText.wordWrap = true;
				myText.width = 200;
				myText.height = 20;
//В общем мне нужен совет по этой части кода, как правильно вращать этот текст чтобы он был оцентрован по сектору.
				textRotation(myText, rot*(22 - value)-rot);
				trace (rot*value + " " + value);
				myText.x = imageX1 + 0.01 * (imageX2 - imageX1);
				myText.y = imageY1 + 0.01 * (imageY2 - imageY1);
 
				var myGlow:GlowFilter = new GlowFilter();
				myGlow.color = 0xFFFFFF; 
				myGlow.blurX = 20; 
				myGlow.blurY = 20; 
				myGlow.strength = 2;
				myText.filters = [myGlow];
		}
 
		private function textRotation (target:TextField, angle:Number):void{
			var point:Point=new Point(target.x + target.width/2, target.y + target.height/2);
 
			var m:Matrix=target.transform.matrix;
			m.tx -= point.x;
			m.ty -= point.y;
			m.rotate (angle*(Math.PI/180));
			m.tx += point.x;
			m.ty += point.y;
			target.transform.matrix=m;
		}
 
		private function drawSolidArc (drawObj:Object, centerX:Number, centerY:Number, innerRadius:Number, outerRadius:Number, startAngle:Number, arcAngle:Number, url:String, steps:int=20):void {
			var twoPI:Number = 2 * Math.PI;
			var angleStep:Number = arcAngle/steps;
			var angle:Number, i:int, endAngle:Number;
			var xx:Number = centerX + Math.cos(startAngle * twoPI) * innerRadius;
			var yy:Number = centerY + Math.sin(startAngle * twoPI) * innerRadius;
			var xxInit:Number=xx;
			var yyInit:Number=yy;
			drawObj.graphics.moveTo(xx,yy);
			for(i=1; i<=steps; i++) {
				angle = (startAngle + i * angleStep) * twoPI;
				xx = centerX + Math.cos(angle) * innerRadius;
				yy = centerY + Math.sin(angle) * innerRadius;
				drawObj.graphics.lineTo(xx,yy);
				if (i==steps*0.5){
					imageX1 = xx;
					imageY1 = yy;
				}
			}
			endAngle = startAngle + arcAngle;
			for(i=0;i<=steps;i++) {
				angle = (endAngle - i * angleStep) * twoPI;
				xx = centerX + Math.cos(angle) * outerRadius;
				yy = centerY + Math.sin(angle) * outerRadius;
				drawObj.graphics.lineTo(xx,yy);
				if (i==steps*0.5){
					imageX2 = xx;
					imageY2 = yy;
				}
			}
			drawObj.graphics.lineTo(xxInit,yyInit);
		}
	}
}
Рисуем колесо:
Код AS3:
sectorsNum = tarotAC.length;
				for (var i:int = 0; i < sectorsNum; i++){
					var arcAngle:Number = - 1/sectorsNum;
					var startAngle:Number = arcAngle*i;
					var arc:Sector = new Sector(mode, 360/sectorsNum, 0, 0, stageW*0.1, stageW*0.5, startAngle, arcAngle, Number(sectorsNum - i), tarotAC.getItemAt(i).color, 1, tarotAC.getItemAt(i).datas, tarotAC.getItemAt(i).url);
					con.addChild(arc);
				}
Что посоветуете? Спасибо.
__________________
In Code We Trust