![]() |
|
||||||||||
|
|||||
|
[+4 06.05.14]
|
Сразу начну с того, что с 3д движками никогда не работал , но тут решил одну штуку для себя запилить, а так как эта одна штука совсем простая, то разбираться во всем движке смысла не вижу, так как на будущее в 3д переходить не собираюсь. Движок ( как я понял единственный развивающийся еще ) был выбран Away 3d .
Задача приблизительно следующая, создается сетка объектов, считай 2мерная матрица, как доска шахмат. Каждый из квадратиков может повернуться , а на противоположной стороне какая то графика. Представим обычный Flip карты 2х сторонней. Собственно вопрос, как создать такую сетку в авай 3д. Поскольку я нуб, изначально мне показалось, что для каждого такого спрайта3д - придется делать отдельный вьюпорт и настраивать камеру, если это не так, и можно обойтись одной камерой и вьюпортом, посоветуйте как. Спасибо. ( а если пример с кодом покажите, вообще цены вам нет ) К сожалению в нете пример не нашел ![]()
__________________
Марк Tween |
|
|||||
|
Регистрация: Nov 2013
Сообщений: 86
|
Вообще, я тоже нуб, но в Away давно копаюсь, поэтому набросал вам небольшой код:
Главный класс: package { import away3d.cameras.Camera3D; import away3d.containers.Scene3D; import away3d.containers.View3D; import away3d.entities.Mesh; import away3d.materials.ColorMaterial; import away3d.materials.TextureMaterial; import away3d.primitives.CubeGeometry; import flash.display.Sprite; import flash.events.Event; /** * ... * @author FlasherEgor */ public class Test1 extends Sprite { private var scene:Scene3D; private var camera:Camera3D; private var view:View3D; //Хранить квадратики. private var squares:Vector.<Square> = new Vector.<Square>(); public function Test1() { //Сначала все создаем. scene = new Scene3D(); camera = new Camera3D(); view = new View3D(scene, camera); addChild(view); //Создаем квадратики. Можно их в какой-то "2мерной матрице" хранить, но я выбрал вектор, чтобы не заморачиваться. for (var ix:int = 0; ix <= 10; ix++) for (var iy:int = 0; iy <= 10; iy++) { var sq:Square = new Square(); //Двигаем его по сцене. sq.x = (ix - 5) * 55; sq.z = (iy - 5) * 55; //Сообщаем, какая у него позиция. sq.numberOfPosition.x = ix; sq.numberOfPosition.y = ix; //Добавляем на сцену и в вектор. scene.addChild(sq); squares.push(sq); } //Чуть-чуть отодвигаем камеру, чтобы все видеть. camera.y = 500; camera.z = -500; camera.rotationX = 45; addEventListener(Event.ENTER_FRAME, enterFrameHandler);//Понятно, для чего } public function enterFrameHandler(e:Event):void { for each(var square:Square in squares) square.dispatchEvent(e);//Повторяем события ENTER_FRAME для каждого квадратика. Я просто не знаю, как иначе проиграть анимацию. view.render();//Рендерим } } } package { import away3d.containers.ObjectContainer3D; import away3d.core.base.Geometry; import away3d.entities.Mesh; import away3d.events.MouseEvent3D; import away3d.events.Object3DEvent; import away3d.materials.ColorMaterial; import away3d.materials.MaterialBase; import away3d.primitives.PlaneGeometry; import flash.events.Event; import flash.geom.Point; /** * ... * @author FlasherEgor */ public class Square extends ObjectContainer3D { private var _faceMesh:Mesh; //"красная" сторона, но она он может быть любой. Это что спереди. private var _backMesh:Mesh; //"синяя" сторона, но она может быть любой. Это что сзади. Например, картинка, которая там должна быть. private var _commonGeometry:Geometry; //По сути, они оба одинаковые, пусть у них будет одинаковая геометрия. private var _rotationLimit:int = 0; //Для анимации. Сколько кадров до переворота. private var _rotationSpeed:int = 5; //Для анимации. На сколько градусов мы поворачиваем плоскость за кадр. private var _nextStateIsRed:Boolean = true; //После анимации квадратик станет красным? public var numberOfPosition:Point = new Point(0, 0); //Хранить, в какой условной клетке квадратик находится. public function Square() { super();//Здесь понятно _commonGeometry = new PlaneGeometry(50, 50);//Создаем геометрию для обоих сторон _faceMesh = new Mesh(_commonGeometry, new ColorMaterial(0xF00000));//Создаем верхнюю сторону. Материал может быть любой. Условно здесь - красный цвет. _backMesh = new Mesh(_commonGeometry, new ColorMaterial(0x0000F0));//Создаем нижнюю сторону. Материал может быть любой. Условно здесь - синий цвет. _backMesh.rotationZ = 180;//Заднюю сторону поворачиваем на 180 градусов. //Разрешаем диспатчить события мыши _faceMesh.mouseEnabled = true; _backMesh.mouseEnabled = true; //Квадратик, наследуясь от ObjectContainer3D, добавляет стороны в себя addChildren(_faceMesh, _backMesh); //Ждем, когда пользователь нажмет клавишу мыши. addEventListener(MouseEvent3D.MOUSE_DOWN, mouseDownHandler); } public function mouseDownHandler(e:MouseEvent3D):void { //Теперь ждем, когда пользователь прекратит нажимать. Аналог MouseEvent.CLICK получается. addEventListener(MouseEvent3D.MOUSE_UP, mouseUpHandler); } public function mouseUpHandler(e:MouseEvent3D):void { removeEventListener(MouseEvent3D.MOUSE_UP, mouseUpHandler);//Перестаем ждать, когда пользователь отпустит мышь removeEventListener(MouseEvent3D.MOUSE_DOWN, mouseDownHandler);//Кроме того, запрещаем нажимать еще раз, пока анимация не кончится addEventListener(Event.ENTER_FRAME, enterFrameHandler);//Запускаем событие обновления кадра для анимации - ну, я просто не знаю, как иначе это сделать. _rotationLimit = 180 / _rotationSpeed;//Настраиваем анимацию. _nextStateIsRed = !_nextStateIsRed;//Если сейчас должен был быть красный, то потом будет синий. } public function enterFrameHandler(e:Event):void { rotationZ += _rotationSpeed;//Поворачиваем по Z наш квадратик _rotationLimit --;//-1 кадр должен прокрутиться if (_rotationLimit <= 0)//если анимация кончилась то { rotationZ = (_nextStateIsRed)?0:180;//Корректируем поворот. Если трейсить, там погрешность в какие-то сверхмаленькие доли, но нужно, чтобы было четко. removeEventListener(Event.ENTER_FRAME, enterFrameHandler);//Прекращаем анимацию addEventListener(MouseEvent3D.MOUSE_DOWN, mouseDownHandler);//Разрешаем пользователю поворачивать квадратик еще раз //Здесь можно, например, диспатчить какое-то событие. //Или вызывать какой-нибудь метод. Трейс для примера. trace(numberOfPosition.x, numberOfPosition.y, ' - теперь я' , (_nextStateIsRed)?'красный.':'синий.'); } } } } А если надо, вы, как опытный флэшер, легко переделаете на свой. Последний раз редактировалось FlasherEgor; 07.06.2014 в 12:13. |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 409
|
а зачем 3d движок, чем rotationY не подходит?
|
![]() |
![]() |
Часовой пояс GMT +4, время: 23:21. |
|
|
« Предыдущая тема | Следующая тема » |
|
|