Alternativa3D. С чего начать

25 марта 2011 г.
Что такое Alternativa3D?

Технология Alternativa3D предназначена для отображения трёхмерной графики в среде Flash Player. Возможности Alternativa3D многогранны и разнообразны, а сферы применения варьируются от создания полностью трёхмерных сайтов в сети Интернет до разработки многопользовательских браузерных игр и проектов для социальных сетей в 3D.

Alternativa3D скриншот

Как установить Альтернативу?

Для начала необходимо скачать swc-библиотеку с официального сайта компании

Затем выбрать одну из многочисленных сред разработки Flash, Flex или AIR приложений:

  • Adobe Flash
  • Adobe FlexBuilder
  • Powerflasher FDT
  • FlashDevelop
  • и т.д.

Официальная документация по установке библиотеки лежит в одном архиве с альтернативой.

Поставляется с библиотекой:
  1. Лицензионное соглашение (Настоятельно рекомендую прочитать).
  2. Элементарные примеры 3D-приложений на Alternativa3D.
  3. Документация по классам и пакетам в формате html.
За работу!

После того как изучена документация и основные принципы работы с движком так и чешутся руки попробовать написать что-нибудь самостоятельно! Что мешает?
Нужна идея. С идеей долго копаться не будем и сделаем, например, «взрывающиеся» кубики, как сделал это я: ссылка.

А теперь давайте разбираться с кодом:

package {
public class HiHabrahabr extends Sprite
{
public static const BOX_COUNT:uint = 50;

private var rootContainer:Object3DContainer = new Object3DContainer();
private var camera:Camera3D;
private var boxes:Vector. = new Vector.();
private var gameTimer:Timer = new Timer(10);
private var shape:Shape = new Shape();

function HiHabrahabr()
{
//Инициализация произойдет после загрузки и добавлении swf на экран.
//Это избавит от ошибок обращения к stage(сцене)
addEventListener(Event.ADDED_TO_STAGE, Init);
}

private function Init(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, Init);

//Настраиваем сцену
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

//На задний фон помещаем черное изображение
shape.graphics.beginFill(0x0);
shape.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
addChild(shape);

/*
* А тут начинается самое интересное.
* Мы объявляем новый экземпляр камеры,
* затем мы создаем ей вьюв, равный размерам экрана.
* Потом мы прячем логотип альтернативы
* И на последок добавляем на экран оутпут с камеры
*/
camera = new Camera3D();
camera.view = new View(stage.stageWidth, stage.stageHeight);
camera.view.hideLogo();
addChild(camera.view);
addChild(camera.diagram);

/*
* Задаем полодение камеры в пространстве,
* затем помещяем камеру в 3D-контейнер.
*/
camera.rotationX = -120 * Math.PI / 180;
camera.y = -800;
camera.z = 400;
rootContainer.addChild(camera);

//В цикле мы создатим много-примного экземпляров класса HabroBox и добавим их в контейнер
for (var i:uint = 0;i < BOX_COUNT; i++)
{
boxes.push(new HabroBox(new Vector3((Math.random() * 40) - (Math.random() * 40), (Math.random() * 40) - (Math.random() * 40), (Math.random() * 40) - (Math.random() * 40))));
rootContainer.addChild(boxes[i]);
}

//Создаем таймер для логики и подписываем на его событие функцию
gameTimer.addEventListener(TimerEvent.TIMER, Update);
gameTimer.start();

//подписываем событие ENTER_FRAME на функцию прорисовки
addEventListener(Event.ENTER_FRAME, Draw);
}

private function Update(evt:TimerEvent = null):void
{
//Просчитываем изменение координат хабракоробок
for each (var box:HabroBox in boxes)
{
box.x += box.Velocity.X;
box.y += box.Velocity.Y;
box.z += box.Velocity.Z;
}

//Через 20 тиков можно будет "собирать" кубики обратно, по щелчку мышки
if (gameTimer.currentCount == 20)
ShowCollectCubesMessage();
}

//Прорисовка
private function Draw(evt:Event = null):void
{
camera.view.width = stage.stageWidth;
camera.view.height = stage.stageHeight;
camera.render();
}

private function ShowCollectCubesMessage():void
{
stage.addEventListener(MouseEvent.MOUSE_DOWN, CollectHandler);
}

/*
* При помощи пакета gs(с Tween-Анимациями)
* создаем эффект собирания хабробоксов воедино
*/
private function CollectHandler(evt:MouseEvent):void
{
for each (var box:HabroBox in boxes)
{
box.Velocity = new Vector3();
var tween:TweenMax = new TweenMax(box, 1, {x:0, y:0, z:0, ease:Back.easeIn});
tween.addEventListener(TweenEvent.COMPLETE, ReRandomize);
}
}

//По возвращению в исходное положение Кубики снова начнут движение в новом направлении
private function ReRandomize(evt:TweenEvent):void
{
(evt.target.target as HabroBox).Velocity = new Vector3((Math.random() * 40) - (Math.random() * 40), (Math.random() * 40) - (Math.random() * 40), (Math.random() * 40) - (Math.random() * 40));
}
}
}

//КЛАСС HabroBox
import alternativa.engine3d.materials.FillMaterial;
import alternativa.engine3d.primitives.Box;

internal class HabroBox extends Box
{
public var Velocity:Vector3 = new Vector3();

function HabroBox(velocity:Vector3 = null)
{
// Конструктор класса Box
super(100, 100, 100, 1, 1, 1);

//Случайный цвет
var random:uint = Math.random() * 2;
switch(random)
{
case 0:
super.setMaterialToAllFaces(new FillMaterial(0xFF7700, 1, 1, 0xFFFFFF));
break;
case 1:
super.setMaterialToAllFaces(new FillMaterial(0x000000, 1, 1, 0xFFFFFF));
break;
default:
super.setMaterialToAllFaces(new FillMaterial(0xFF7700, 1, 1, 0xFFFFFF));
break;
}

if (velocity)
this.Velocity = velocity;
}
}

//КЛАСС Vector3
internal class Vector3
{
public var X:Number;
public var Y:Number;
public var Z:Number;

function Vector3(X:Number = 0, Z:Number = 0, Y:Number = 0)
{
this.X = X;
this.Y = Y;
this.Z = Z;
}
}

Результат

После компиляции мы получим интересную флешку.

Теги: рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики