Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [PVD] onRenderTick ресетит трансформацию всех объектов на сцене? (http://www.flasher.ru/forum/showthread.php?t=120683)

wvxvw 27.01.2009 23:36

[PVD] onRenderTick ресетит трансформацию всех объектов на сцене?
 
Вот, есть такой пример:
Код AS3:

private var _sceneWidth:Number = 500;
 
override public function set width(value:Number):void
{
        _sceneWidth = value;
        _isValidDisplay = false;
}
...
{
        var currentMousePoint:Point = new Point(viewport.containerSprite.mouseX,
                                                                                viewport.containerSprite.mouseY);
        if (!_isValidDisplay)
        {
                if (_gameMap)
                {
                        _lastTransform = Matrix3D.clone(_gameMap.transform);
                        _gameMap.destroy();
                        scene.removeChild(_gameMap);
                }
                trace("_lastTransform #1", _lastTransform);
                _gameMap = new Cube(_matList, 500, _sceneWidth, 16);
                scene.addChild(_gameMap);
 
                if (_lastTransform)
                {
                        _gameMap.transform.calculateMultiply3x3(_lastTransform, _gameMap.transform);
                }
                trace("_lastTransform #2", _gameMap.transform);
        } else if (stage && _gameMap && _lastTransform)
        {
                _gameMap.transform.calculateMultiply3x3(_lastTransform, _gameMap.transform);
                //trace("_lastTransform #3", _gameMap.transform);
        }
 
        if (_isMouseDown)
        {
                trace("_isMouseDown", _lastTransform);
                var difference:Point = currentMousePoint.subtract(_previousMousePoint);
                var vector:Number3D = new Number3D(difference.x, difference.y, 0);
                var rotationAxis:Number3D = Number3D.cross(vector, FORWARD);
                rotationAxis.normalize();
                var distance:Number = Point.distance(currentMousePoint, _previousMousePoint);
                var rotationMatrix:Matrix3D =
                        Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.y, rotationAxis.z, distance / 250);
                _gameMap.transform.calculateMultiply3x3(rotationMatrix, _gameMap.transform);
        }
        _previousMousePoint = currentMousePoint;
        super.onRenderTick(event);
        _isValidDisplay = true;
}

Что хочу сделать:
Когда ширина получает новое значение, выставляем флаг а в onRenderTick если флаг поднят, то нужно:
- создать объект по-новой;
- применить трансформацию.
- опустить флаг.
Почему-то на следующий тик трансформация объекта обнуляется =/

Вобщем, вопрост такой: как забиндить размер кубика к размеру контейнера?

Добавлено через 4 часа 11 минут
Вобщем, как решилось:
Код AS3:

_gameMap.copyTransform(_lastTransform);

вместо
Код AS3:

_gameMap.transform.calculateMultiply3x3(_lastTransform, _gameMap.transform);

Понять почему нужно именно так - не получилось :)

Molecula 28.01.2009 12:40

Хм, надо будет покопать с этими трансформациями.
Вообще copyTransform тупо берет this.transform - т.е. твоего Кубикаи делает:
Код AS3:

this.transform.n11 = matrix.n11;
this.transform.n12 = matrix.n12;
this.transform.n13 = matrix.n13;
this.transform.n14 = matrix.n14;

Т.е. матрица _lastTransform накладывается на Куб.

А вот calculateMultiply3x3 делает:
Код AS3:

this.transform.n11 = matrix.n11;
this.transform.n12 = matrix.n12;
this.transform.n13 = matrix.n13;

( this.transform.n14 - тут нет, это есть в calculateMultiply4x4. )
но перед этим пересчитывает значения this.transform.n11 и т.д.
Может из-за этого пересчета происходит НЕИЗМЕНЕНИЕ Куба?

По идее, вроде клонирование Matrix3D parentContainer-ра должно только быть, т.е.
parentContainer изменил размеры и Куб изменился, но надо тестить.

Инфа по Revision 863.

wvxvw 28.01.2009 14:37

ПВД 859, я чего-то не видел, что есть новее...
А вообще, я чего только не пробовал...
calculateMultiply3x3 - только один из вариантов, пробовал и calculateMultiply4x4 и copy() и copy3x3()... Вобщем, по непонятной причине матрицы не перемножались, а просто заменялись на "пустую"... хотя при вращении этот же метод работал нормально... т.е. замена матрицы очевидно проиcxодит только после renderScene()...

Molecula 28.01.2009 15:38

Цитата:

замена матрицы очевидно проиcxодит только после renderScene()
Да. Но можно какой-то один или несколько объектов рендерить, остальные опускать, с несколькими сценами я не пробывал экспериментировать.


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

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