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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.08.2011, 14:36
savva вне форума Посмотреть профиль Отправить личное сообщение для savva Найти все сообщения от savva
  № 1  
Ответить с цитированием
savva
[+ 06.08.11]

Регистрация: Jul 2011
Сообщений: 79
По умолчанию Menu XML и кнопки

Здравствуйте.

Есть XML menu
Код:
<menu>
    <item x="0" y="10" z="0" width="100" height="50">Вверх</item>
    <item x="0" y="70" z="0" width="100" height="50">Вниз</item>
    <item x="0" y="130" z="0" width="100" height="50">Вправо</item>
    <item x="0" y="190" z="0" width="100" height="50">Влево</item>
  </menu>
Парситстся всё это дело следующим образом
Код AS3:
		private function ParseMyMenu(_menu:XMLList):void
		{
			for (var i:Number = 0; i < _menu.length(); i++)
			{
				var object:Object = _menu[i];
				trace(object);
				trace(object.@x);
				trace(object.@y);
				trace(object.@z);
				var m:MenuItem = new MenuItem(object, object.@x, object.@y, object.@z, object.@height, object.@width);
				menulist.push(m);
			}
		}
Далее передаётся в класс Menu2D и там происходит добавление кнопок на сцену.

1)Вопрос состоит в следующем,как в XML задать список действий для кнопки (например повернуть камеру) и как это распознать в парсере?Пример Желателен.

Второй вопрос.
Есть XML объектов
Код:
<objects>
			<object x="0" y="0" z="0" event="true" visible="true">
				<name>rocket</name>
				<model>parsingmodel/raketa.A3D</model>
				<textures>
					<texture x="-1536.21" y="0" z="70.2191">
						<texturesrc>parsingmodel/rocket_rkn_02_white.jpg</texturesrc>
						<color>0x0000FF</color>
						<textureobj>Golova_L</textureobj>
						<text>parsingmodel/golova.txt</text>
					</texture>
					<texture x="-608.596" y="0" z="70.2191">
						<texturesrc>parsingmodel/rocket_rkn_03.jpg</texturesrc>
						<color>0xF010FF</color>
						<textureobj>blok-2</textureobj>
						<text>parsingmodel/golova.txt</text>
					</texture>
					<texture x="1086.21" y="0" z="70.2191">
						<texturesrc>parsingmodel/rocket_rkn_03.jpg</texturesrc>
						<color>0x0020FF</color>
						<textureobj>blok-3</textureobj>
						<text>parsingmodel/golova.txt</text>
					</texture>
					<texture x="1395.67" y="0" z="72.024">
						<texturesrc>parsingmodel/rocket_rkn_03.jpg</texturesrc>
						<color>0xFF300F</color>
						<textureobj>BlokiBVGD</textureobj>
						<text>parsingmodel/golova.txt</text>
					</texture>
					<texture x="200.0" y="0" z="-140.656">
						<texturesrc>parsingmodel/ustanovshik.jpg</texturesrc>
						<color>0xFF4000</color>
						<textureobj>ustanovshi</textureobj>
						<text>parsingmodel/golova.txt</text>
					</texture>
				</textures>
			</object>
			<object x="1" y="1" z="1" event="false" visible="true">
				<name>angar</name>
				<model>parsingmodel/angar.A3D</model>
				<textures>
					<texture x="-1717.7996826171875" y="-202.47897338867188" z="-751.5587768554688">
						<texturesrc>parsingmodel/Angar_01.jpg</texturesrc>
						<textureobj>Box01</textureobj>
						<text>null</text>
					</texture>
				</textures>
			</object>
	</objects>
Который тоже парсится всё нормально работает.
2)Вопрос такого же типа,нужно для каждого объекта задать действие(или даже список действий,например плавный переход на 100 по координате х потом 300 по координате у),как это распознать в парсере и сохранить?(Нужно именно универсальность,чтобы можно было задать 1 действие или 50 и они сохранялись в класс ObjecItem после парсера и передавались в класс сцена)А потом ещё передать в кнопку?

3)Как сделать так чтобы объекты перемещались плавно во времени?С помощью таймера или с помощью OnEnterFrame?

Не хочу плодить темы,поэтому задам вопрос сюда.Хочу приделать прелоадер,поскольку я работаю в 3D, у меня Menu(2D) отображается раньше чем появляются 3D объекты. Искал по форуму ничего,из того что мне нужно не нашёл,поскольку в мой проект я не знаю как засунуть Frame учитывая то что кадры я неиспользую вообще.
Код AS3:
package 
{
	import alternativa.engine3d.core.ProjectionTransform3D;
	import flash.display.SimpleButton;
	import flash.display.Sprite;
	import flash.display.Stage3D;
	import flash.events.Event;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.display.InteractiveObject;
	import flash.geom.Vector3D;
	import flash.utils.ByteArray;
	import flash.display.Stage;
	import Scene;
	import parsxml.ObjItem;
 
	public class Main extends Sprite	
	{
	 [Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class; 
	 private var sc:Scene;
		public function Main()
		{
			var file:ByteArray = ((new EmbedModel()) as ByteArray);
			var str:String = file.readUTFBytes( file.length );
			var xml:XML = new XML( str );
			sc = new Scene(xml);
			stage.addChild(sc);
		}
	}
}
Вся инициализация,парсирование,добавление производится в классе Scene.
4)Как организовать прелоадер?


Последний раз редактировалось savva; 02.08.2011 в 15:09.
Старый 02.08.2011, 15:35
toFL вне форума Посмотреть профиль Найти все сообщения от toFL
  № 2  
Ответить с цитированием
toFL
Banned

Регистрация: May 2011
Адрес: +48° 27' 57.93", +35° 2' 46.02"
Сообщений: 447
Записей в блоге: 2
Отправить сообщение для toFL с помощью Skype™
1), 2)
Код:
<menu>
    <item x="0" y="10" z="0" width="100" height="50">
        <text>Вверх</text>
        <actions>
            <action type="camera" angle="90"/>
            <action type="animation" alpha="50" x="300"/>
        </actions>
    </item>
</menu>
3) TweenLite, TweenMax

4) Используйте поиск

Старый 02.08.2011, 15:44
savva вне форума Посмотреть профиль Отправить личное сообщение для savva Найти все сообщения от savva
  № 3  
Ответить с цитированием
savva
[+ 06.08.11]

Регистрация: Jul 2011
Сообщений: 79
ТО бишь мне придётся для всех action делать проверку ? То есть иметь параметр with =" какой объект" type=" какое действие "(проверка поворот,движение,скачок и т.д.) а если несколько типов то бишь сначала поворот потом движение? а потом параметры если поворот то сохранять то-то?

то бишь я буду в классе actions (допустим) иметь туеву хучу public параметров в стиле
Код:
isCamera:Boolean
needAction:Boolean;
isRotation:Boolean
isMove:Boolean;
angle:
coords:Vecto3D;
и прочее

А эти TweenLite TweenMax работаю с 3D объектами?

Я уже искал прелоадер,но там везде делается через мувик.Мне это показалось не удобным.

Старый 02.08.2011, 16:02
toFL вне форума Посмотреть профиль Найти все сообщения от toFL
  № 4  
Ответить с цитированием
toFL
Banned

Регистрация: May 2011
Адрес: +48° 27' 57.93", +35° 2' 46.02"
Сообщений: 447
Записей в блоге: 2
Отправить сообщение для toFL с помощью Skype™
Цитата:
ТО бишь мне придётся для всех action делать проверку ? То есть иметь параметр with =" какой объект" type=" какое действие "(проверка поворот,движение,скачок и т.д.) а если несколько типов то бишь сначала поворот потом движение? а потом параметры если поворот то сохранять то-то?
Я думаю можно иметь один класс для парсинга ваших Actions. Передавать ему ноду и объект (просто Object, JSON и т.п.) в который он все будет правильно записывать. И иметь второй (или несколько) класс, который все это дело будет обрабатывать.

Цитата:
то бишь я буду в классе actions (допустим) иметь туеву хучу public параметров в стиле
Нет, столько переменных это слишком.

Цитата:
А эти TweenLite TweenMax работаю с 3D объектами?
Он работает с любыми параметрами объекта. Хоть свои set-терты пиши.

Старый 02.08.2011, 16:09
savva вне форума Посмотреть профиль Отправить личное сообщение для savva Найти все сообщения от savva
  № 5  
Ответить с цитированием
savva
[+ 06.08.11]

Регистрация: Jul 2011
Сообщений: 79
А как мне узнавать какие действия производить если я не буду иметь столько переменных?

Ещё вопрос появился,можно ли динамически генерировать события?

вот я набросал класс примерно
Код AS3:
package parsxml 
{
	import flash.geom.Vector3D;
	/**
	 * ...
	 * @author sa
	 */
	public class ActionItem 
	{
		public var ObjName:String;
		public var IsMove:Boolean;
		public var IsRotation:Boolean;
		public var MoveCoord:Vector3D;
		public var AngleX:Number;
		public var AngleY:Number;
		public var AngleZ:Number;	
 
		public function ActionItem(_objname:String, _ismove:String, _isrotation:String,_coordX:Number, _coordY:Number,
		_coordZ:Number,_anglex:Number,_angley:Number,_anglez:Number ) 
		{
			ObjName = _objname;
			if (_ismove == "true")
			{
				IsMove = true;
			}
			else
			{
				IsMove = false;
			}
			if (_isrotation == "true")
			{
				IsRotation = true;
			}
			else
			{
				IsRotation = false;
			}
			MoveCoord = new Vector3D(_coordX, _coordY, _coordZ);
			AngleX = _anglex;
			AngleY = _angley;
			AngleZ = _anglez;
		}
 
	}
 
}
Теперь нужно исходя из этих данных генерировать события.
То есть вот статическое создание
Код AS3:
	private function AddButton(_item:MenuItem):void
		{
			var b:Button = new Button();
			b.label = _item.Label;
			if (b.label == "Animation")
			{
				b.addEventListener(MouseEvent.CLICK, ClickAnimation);
			}
			if (b.label == "Up")
			{
				b.addEventListener(MouseEvent.CLICK, ClickUp);
			}
			if (b.label == "Down")
			{
				b.addEventListener(MouseEvent.CLICK, ClickDown);
			}
			if (b.label == "Right")
			{
				b.addEventListener(MouseEvent.CLICK, ClickRight);
			}
			if (b.label == "Left")
			{
				b.addEventListener(MouseEvent.CLICK, ClickLeft);
			}
			trace(b.hasEventListener(MouseEvent.CLICK));
			b.x = _item.Coord.x;
			b.y = _item.Coord.y;
			b.z = _item.Coord.z;
			b.height = _item.Height;
			b.width = _item.Width;
			stage.addChild(b);
		}
А хочется чтобы все функции типа
Код AS3:
		private function ClickLeft(e:MouseEvent):void
		{
			 for (var i:Number = 0; i < CamArray.length; i++)
			 {
				CamArray[i].y -= 50;	
			 }
 
		}
Генерировались сами. И названия были типа onMouseClick+имя кнопки (e:MouseEvent) и так далее.


Update Спасибо за TweenLite, то что нужно!


Последний раз редактировалось savva; 02.08.2011 в 16:31.
Старый 02.08.2011, 17:25
toFL вне форума Посмотреть профиль Найти все сообщения от toFL
  № 6  
Ответить с цитированием
toFL
Banned

Регистрация: May 2011
Адрес: +48° 27' 57.93", +35° 2' 46.02"
Сообщений: 447
Записей в блоге: 2
Отправить сообщение для toFL с помощью Skype™
Код AS3:
public function mouseEvent (event:MouseEvent):void
{
	// смотрим что за событие
	switch (event.type)
	{
		case MouseEvent.CLICK:
			//кликнули
			break;
		case MouseEvent.MOUSE_OVER:
			//навели мышкой
			break;
		case MouseEvent.MOUSE_OUT:
			//увели мышку
			break;
	}
	// смотрим какой объект послал событие
	switch (event.target)
	{
		case button1:
			//объект button1
		case button2:
			//объект button2
	}
	// на основании этих данных, дергайте ваши Actions
}

Старый 02.08.2011, 18:11
savva вне форума Посмотреть профиль Отправить личное сообщение для savva Найти все сообщения от savva
  № 7  
Ответить с цитированием
savva
[+ 06.08.11]

Регистрация: Jul 2011
Сообщений: 79
Ну допустим что количество MouseEvent известно

а количество кнопок не известно,как в этом случае быть с case ?

Старый 02.08.2011, 18:13
toFL вне форума Посмотреть профиль Найти все сообщения от toFL
  № 8  
Ответить с цитированием
toFL
Banned

Регистрация: May 2011
Адрес: +48° 27' 57.93", +35° 2' 46.02"
Сообщений: 447
Записей в блоге: 2
Отправить сообщение для toFL с помощью Skype™
На все объекты ты должен иметь конкретные ссылки. Например хранить их в массиве и делать проверку по массиву в цикле.

Код AS3:
if (buttonList[i] == event.target)
{
    (actionsList[i] as Action).execute();
}
Код AS3:
package
{
	public class Action
	{
 
		public function Action()
		{
			// constructor code
		}
 
		public function execute ():void
		{
			// действия
		}
 
		public function parseParams (xml:XMLNode):void
		{
			// парсим <actions>
		}
	}
 
}
Соответственно ты записываешь в массив (а лучше Vector - типизированный массив) экземпляры класса Action.


Последний раз редактировалось toFL; 02.08.2011 в 18:20.
Старый 02.08.2011, 18:53
savva вне форума Посмотреть профиль Отправить личное сообщение для savva Найти все сообщения от savva
  № 9  
Ответить с цитированием
savva
[+ 06.08.11]

Регистрация: Jul 2011
Сообщений: 79
У меня class actionitem является параметром MenuItem где и создаётся,для парсера у меня есть отдельный класс,я туда добавил функцию ParceMyMenu и передаю в конструктор MenuItem где вызываю конструктор ActionItem.

На преоладер я так ничего и не нашёл,везде делают с movieclip и метатегом [frame]

Добавлено через 17 часов 24 минуты
Вопрос сюда же. Про TweenLite.

Как динамически добавлять координатыв твин?
То есть я вот разработал функцию
Код AS3:
private function OnClick(e:MouseEvent):void
		{
			var isit:Boolean=false;
			var object:Object = e.target as Object;
			for (var i:Number = 0; i < buttonlist.length; i++)
			{
				if (object.name == buttonlist[i].Label)
				{
					if (buttonlist[i].Action.ObjType == "Camera3D")
					{
						for (var z:Number = 0; z < CamArray.length; z++)
						{
							if (buttonlist[z].Action.ObjName == CamArray[z].name)
							{
								if (buttonlist[z].Action.IsMove)
								{
 
									CamArray[z].x += buttonlist[i].Action.MoveCoord.x;
									CamArray[z].y += buttonlist[i].Action.MoveCoord.y;
									CamArray[z].z += buttonlist[i].Action.MoveCoord.z;
									isit = true;
								}
								if (buttonlist[z].Action.IsRotation)
								{
										CamArray[z].rotationX += buttonlist[i].Action.MoveCoord.AngleX;
										CamArray[z].rotationY += buttonlist[i].Action.MoveCoord.AngleY;
										CamArray[z].rotationZ += buttonlist[i].Action.MoveCoord.AngleZ;
										isit = true;
								}
							}
							if (isit)
							{
								return
							}
						}
					}
					else
					{
						if (buttonlist[i].Action.ObjType == "Object3D")
						{
							trace(buttonlist[i].Action.ObjType);
							for (var q:Number = 0; q < ContArray.length; q++)
							{
								trace(ContArray.length);
								trace(buttonlist[q].Action.ObjName);
								trace(buttonlist[i].Action.ObjName);
									trace(ContArray[q].name);
								if (buttonlist[i].Action.ObjName == ContArray[q].name)
								{
									trace(buttonlist[q].Action.ObjName);
									trace(ContArray[q].name);
									if (buttonlist[i].Action.IsMove)
									{
											trace(buttonlist[i].Action.MoveCoord);
											ContArray[q].x += buttonlist[i].Action.MoveCoord.x;
											ContArray[q].y += buttonlist[i].Action.MoveCoord.y;
											ContArray[q].z += buttonlist[i].Action.MoveCoord.z;
											isit = true;
									}
									if (buttonlist[i].Action.IsRotation)
									{
											ContArray[q].rotationX += buttonlist[i].Action.AngleX;
											ContArray[q].rotationY += buttonlist[i].Action.AngleY;
											ContArray[q].rotationZ += buttonlist[i].Action.AngleZ;
											isit = true;
									}
								}
								if (isit)
								{
									return
								}
							}
						}
					}
				}
			}
		}
Теперь вместо нужно вместо
Код AS3:
CamArray[z].x += buttonlist[i].Action.MoveCoord.x;
CamArray[z].y += buttonlist[i].Action.MoveCoord.y;
;
Нужно вставить твин что-бы плавно происходило движение.А в твин как я понял нужно конечное значение координаты перемещения (то есть то,куда попадёт объект),а у меня в action.MoveCoord хранится смещение(то есть то насколько объект должен сместиться при клике).
Код AS3:
var End:vector3D=new Vector3D(CamArray[z].x += buttonlist[i].Action.MoveCoord.x,CamArray[z].y += buttonlist[i].Action.MoveCoord.y,
CamArray[z].z += buttonlist[i].Action.MoveCoord.z);
to=new TweenLite(CamArray[z],3,{End.x,End.z});  // Такое не работает,но нужно что-то подобное
Ещё нужно добавить функцию проверкичто-то типа
Код AS3:
....
if(isTwening()
{
var object:Object=e.target as object;
object.removeeventListner(MouseEvent.ONCLICK,MouseClick);
}
Чтобы нельзя было повторно нажать кнопку пока не выполнится перемещение.
Ща буду смотреть в доках


Последний раз редактировалось savva; 03.08.2011 в 12:20.
Создать новую тему Ответ Часовой пояс GMT +4, время: 20:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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