Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.04.2012, 11:49
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 1  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию Как создавать колесо типа рулетки?

Требуется создать компонент, который представляет из себя круг разделенный на сектора. Каждый сектор должен быть отдельным элементом, т. к. он взаимодействует с другим Flex компонентом (шарик) например через hitTest, имеет свой цвет и текст направленный по радиусу (иногда и иконкой/картинкой). Все это должно создаваться из XML-данных (каждый итем это отдельный сектор с цветом, надписью (иногда и иконкой/картинкой) и разными свойствами сектора).

Посоветуйте, как лучше все организовать и может быть есть примеры?
__________________
In Code We Trust

Старый 18.04.2012, 12:09
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 2  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
у тебя если шарик будет между полями останавливаться то хиттест будет срабатывать для 2-х полей... я бы посоветовал не делать так сложно, а нарисовать одну картинку с полем и вычислять положение шарика математически через atan2

Старый 18.04.2012, 12:35
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 3  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Цитата:
у тебя если шарик будет между полями останавливаться то хиттест будет срабатывать для 2-х полей...
Мне это и нужно. Я потом буду считать кол-во хиттестов для каждого из полей.

Вот нашел два примера: http://www.kirupa.com/forum/showthre...ing-pie-slices
http://deviltechie.wordpress.com/201...sing-flex-as3/

По сути они одинаковы, но в первом случае образуются какие-то сегменты, т. е. окружность становится не плавной, становится угловатой и этот эффект на каждом секторе увеличивается.

А второй пример выдает вообще странную ошибку:
1084: Syntax error: expecting rightparen before theta.
Код AS3:
for (var theta:Number = startAngle; theta < endAngle; theta += Math.min(step, endAngle – theta)) {
					holder.graphics.lineTo(xpos + segmentRadius * Math.cos(theta), ypos + segmentRadius * Math.sin(theta));
				}
Откуда там взяться этой ошибке... При этом практически идентичный код в первом варианте этой ошибки не выдает.

Добавлено через 4 минуты
Мне вот сейчас пришла идея. А что если использовать флексовский компонент Pie Chart, я как-то использовал его для кругового таймера.
Вот как регистрировать соприкосновения шарика и секторов в этом случае?
__________________
In Code We Trust

Старый 18.04.2012, 12:50
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 4  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
не проще считать в градусах сколько шарик пролетел?

Старый 18.04.2012, 12:57
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 5  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Цитата:
не проще считать в градусах сколько шарик пролетел?
Не можешь пояснить?
Вот у меня компонент - окружность разбитая на сектора. Как можно математически определить находится ли в текущем кадре шарик над сектором? А если учесть, что окружность должна ещё и вращаться.
Мне кажется хиттест проще.
__________________
In Code We Trust

Старый 18.04.2012, 14:04
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 6  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
находишь угол между центром рулетки и шариком (с помощью atan2), потом находишь угол на который повернулось колесо рулетки и определяешь в каком секторе находится шарик... но если ты считаешь все секторы которые пересекает шарик, то конечно банальное сравнение координат через хиттест, проще чем арктангенс =)

Старый 18.04.2012, 15:08
NikolyA вне форума Посмотреть профиль Отправить личное сообщение для NikolyA Найти все сообщения от NikolyA
  № 7  
Ответить с цитированием
NikolyA
 
Аватар для NikolyA

Регистрация: Dec 2006
Сообщений: 1,764
Цитата:
Сообщение от anmelegov Посмотреть сообщение
находишь угол между центром рулетки и шариком (с помощью atan2), потом находишь угол на который повернулось колесо рулетки и определяешь в каком секторе находится шарик... но если ты считаешь все секторы которые пересекает шарик, то конечно банальное сравнение координат через хиттест, проще чем арктангенс =)
а теперь что сказал, изобрази программным способом
__________________
а за окном атлантический океан!

Старый 18.04.2012, 15:21
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
по поводу рисования
http://flasher.ru/forum/showpost.php...21&postcount=8
__________________
Reality.getBounds(this);

Старый 18.04.2012, 22:01
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 9  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
вот еще один пример создания на флеше вращающегося колеса, на мой взгляд удобного с точки зрения юзабилити, надеюсь пригодится.

Старый 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

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:25.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.