|
|
|||||
[+ 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> 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); } } 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 учитывая то что кадры я неиспользую вообще. 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); } } } 4)Как организовать прелоадер? Последний раз редактировалось savva; 02.08.2011 в 15:09. |
|
|||||
Banned
|
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> 4) Используйте поиск |
|
|||||
[+ 06.08.11]
Регистрация: Jul 2011
Сообщений: 79
|
ТО бишь мне придётся для всех action делать проверку ? То есть иметь параметр with =" какой объект" type=" какое действие "(проверка поворот,движение,скачок и т.д.) а если несколько типов то бишь сначала поворот потом движение? а потом параметры если поворот то сохранять то-то?
то бишь я буду в классе actions (допустим) иметь туеву хучу public параметров в стиле и прочее А эти TweenLite TweenMax работаю с 3D объектами? Я уже искал прелоадер,но там везде делается через мувик.Мне это показалось не удобным. |
|
|||||
Banned
|
Цитата:
Цитата:
Цитата:
|
|
|||||
[+ 06.08.11]
Регистрация: Jul 2011
Сообщений: 79
|
А как мне узнавать какие действия производить если я не буду иметь столько переменных?
Ещё вопрос появился,можно ли динамически генерировать события? вот я набросал класс примерно 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; } } } То есть вот статическое создание 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); } private function ClickLeft(e:MouseEvent):void { for (var i:Number = 0; i < CamArray.length; i++) { CamArray[i].y -= 50; } } Update Спасибо за TweenLite, то что нужно! Последний раз редактировалось savva; 02.08.2011 в 16:31. |
|
|||||
Banned
|
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 } |
|
|||||
[+ 06.08.11]
Регистрация: Jul 2011
Сообщений: 79
|
Ну допустим что количество MouseEvent известно
а количество кнопок не известно,как в этом случае быть с case ? |
|
|||||
Banned
|
На все объекты ты должен иметь конкретные ссылки. Например хранить их в массиве и делать проверку по массиву в цикле.
Соответственно ты записываешь в массив (а лучше Vector - типизированный массив) экземпляры класса Action. Последний раз редактировалось toFL; 02.08.2011 в 18:20. |
|
|||||
[+ 06.08.11]
Регистрация: Jul 2011
Сообщений: 79
|
У меня class actionitem является параметром MenuItem где и создаётся,для парсера у меня есть отдельный класс,я туда добавил функцию ParceMyMenu и передаю в конструктор MenuItem где вызываю конструктор ActionItem.
На преоладер я так ничего и не нашёл,везде делают с movieclip и метатегом [frame] Добавлено через 17 часов 24 минуты Вопрос сюда же. Про TweenLite. Как динамически добавлять координатыв твин? То есть я вот разработал функцию 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 } } } } } } } CamArray[z].x += buttonlist[i].Action.MoveCoord.x; CamArray[z].y += buttonlist[i].Action.MoveCoord.y; ; 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}); // Такое не работает,но нужно что-то подобное .... if(isTwening() { var object:Object=e.target as object; object.removeeventListner(MouseEvent.ONCLICK,MouseClick); } Ща буду смотреть в доках Последний раз редактировалось savva; 03.08.2011 в 12:20. |
Часовой пояс GMT +4, время: 19:09. |
|
« Предыдущая тема | Следующая тема » |
|
|