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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.06.2014, 04:11
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 1  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
По умолчанию 3D движки, поворот объекта

Сразу начну с того, что с 3д движками никогда не работал , но тут решил одну штуку для себя запилить, а так как эта одна штука совсем простая, то разбираться во всем движке смысла не вижу, так как на будущее в 3д переходить не собираюсь. Движок ( как я понял единственный развивающийся еще ) был выбран Away 3d .
Задача приблизительно следующая, создается сетка объектов, считай 2мерная матрица, как доска шахмат. Каждый из квадратиков может повернуться , а на противоположной стороне какая то графика. Представим обычный Flip карты 2х сторонней.
Собственно вопрос, как создать такую сетку в авай 3д. Поскольку я нуб, изначально мне показалось, что для каждого такого спрайта3д - придется делать отдельный вьюпорт и настраивать камеру, если это не так, и можно обойтись одной камерой и вьюпортом, посоветуйте как.
Спасибо. ( а если пример с кодом покажите, вообще цены вам нет )
К сожалению в нете пример не нашел
__________________
Марк Tween

Старый 07.06.2014, 12:02
FlasherEgor вне форума Посмотреть профиль Отправить личное сообщение для FlasherEgor Найти все сообщения от FlasherEgor
  № 2  
Ответить с цитированием
FlasherEgor

Регистрация: Nov 2013
Сообщений: 86
Вообще, я тоже нуб, но в Away давно копаюсь, поэтому набросал вам небольшой код:

Главный класс:
Код AS3:
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();//Рендерим
		}
 
	}
 
}
Квадратик:
Код AS3:
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.
Старый 07.06.2014, 15:07
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 3  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
FlasherEgor - просто огромное Вам спасибо! Буду читать, похоже очень интересно вышло. !!!
__________________
Марк Tween

Старый 07.06.2014, 23:31
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 4  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
а зачем 3d движок, чем rotationY не подходит?

Старый 08.06.2014, 01:26
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 5  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
а зачем 3d движок, чем rotationY не подходит?
Будут кубы, плотность, текстуры.
__________________
Марк Tween

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

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

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


 


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


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