tweenlite не работает с растровыми изображениями? - PullRequest
1 голос
/ 18 июля 2011

У меня возникает следующая проблема при попытке использовать TweenLite с битовой картой:

При применении TweenLite к битовой карте появляются странные сообщения об ошибках (tempScore.bitmap).GetBounds работает.Растровое изображение имеет прозрачность.У кого-нибудь есть идея, почему она не работает?Любая помощь приветствуется.Спасибо .:)

При использовании метода getBounds я получаю следующее:

tempScore.bitmap.getBounds(this)(x=2.35, y=-0.45, w=25, h=18)

Это сообщение об ошибке:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at com.greensock.plugins::TransformAroundPointPlugin/onInitTween()
at com.greensock.plugins::TransformAroundCenterPlugin/onInitTween()
at com.greensock::TweenLite/init()
at com.greensock::TweenLite/renderTime()
at com.greensock.core::SimpleTimeline/renderTime()
at com.greensock::TweenLite$/updateAll()

Мои импортированные и активированные библиотеки выглядяткак это:

import com.greensock.*;
import com.greensock.TweenLite;
import com.greensock.plugins.TweenPlugin;
import com.greensock.plugins.TransformAroundCenterPlugin;
import com.greensock.plugins.TransformAroundPointPlugin;
import com.greensock.easing.*;
import com.greensock.plugins.AutoAlphaPlugin;
import com.greensock.plugins.ColorTransformPlugin;
import com.greensock.plugins.ColorMatrixFilterPlugin;

TweenPlugin.activate([TransformAroundCenterPlugin, TransformAroundPointPlugin, ColorTransformPlugin,
ColorMatrixFilterPlugin]);

Это та часть, где я пытаюсь использовать TweenLite на моем tempScore:

var scoreTextLength:int = scoreManager.scores.length - 1;
        for (var counter:int = scoreTextLength; counter >= 0; counter--)
        {

                tempScore = scoreManager.scores[counter];
                tempScore.startDelay = true;

                TweenLite.to(tempScore.bitmap, 2, {transformAroundCenter: {scale:2}});
                trace("tempScore.bitmap.getBounds(this)" + tempScore.bitmap.getBounds(this));

                if (tempScore.update())
                {

                    disposeScore(counter);

                }
        }

Насколько я вижу, значения getBounds в порядке.Моя игра основана на игровой структуре.Внутри него есть рендер.Назовите меня идиотом, если я ошибаюсь, но возможно ли, что средство визуализации фреймворка и tweenlite сталкиваются друг с другом ??

TweenLite имеет проблемы с другими подобными объектами, такими как tempAsteroid.Многие объекты рисуются на холсте с помощью copyPixels (метод blitting).

tempScore - это объект Score.Объект Score основан на BasicBlitArrayObject.В противном случае этот объект расширяет EventDispatcher.Я надеюсь, что эта небольшая информация поможет.

Это ScoreManager, который управляет внешним видом и свойствами tempScore:

package com.cosmicward.src.classes 
{
import flash.display.*;
import flash.text.*;
import flash.geom.*;

import com.framework_mod.src.BlitArrayAsset;


public class ScoreManager 
{
    public var scoreBitmapData:BitmapData;
    public var scoreBitmap:Bitmap;

    public var scoreAnimationFrames:Array = [];

    public var scores:Array;
    public var tempScore:Score;     
    private var textfield:TextField = new TextField();
    private var textFormat:TextFormat = new TextFormat();
    private var $textWidth:int;
    private var $textHeight:int;


    private var rec:Rectangle;

    public var scoreCount:int;
    public var scoreCountTwo:int;
    public var scoreCountThree:int;

    private var drawingCanvas:Shape = new Shape();  

    private var point0:Point = new Point(0, 0);


    public function ScoreManager() 
    {

    }


    public function createScoreLook(textWidth:int, textHeight:int, text:String, textFormat:TextFormat):void {


        var tempBlitArrayAsset:BlitArrayAsset = new BlitArrayAsset();


        scoreBitmapData = new BitmapData(textWidth, textHeight, true, 0x00000000);

        var font:ArialBold = new ArialBold();
        textFormat.font = "ArialBold";
        textFormat.font = font.fontName;
        Font.registerFont(ArialBold);

        textfield.embedFonts = true;
        textfield.blendMode = BlendMode.LAYER;
        //textfield.autoSize = TextFieldAutoSize.LEFT;
        textfield.defaultTextFormat = textFormat;
        textfield.setTextFormat(textFormat);
        textfield.selectable = false;
        textfield.text = text;


        trace("drawingCanvas.height =" + drawingCanvas.height);
        trace("drawingCanvas.width =" + drawingCanvas.width);

        scoreBitmapData.draw(textfield);/



        $textWidth = textWidth;
        $textHeight = textHeight;

        //*** end look

    }



    public function createScores(xPos:Number, yPos:Number, stopAnimation:int = 5,
                                 scoreDelay:int = 10, scoreLife:int = 40):void {

            var tempScore:Score = new Score(5, 1315, 5, 995);

            tempScore.bitmapData = scoreBitmapData;

            scoreBitmap = new Bitmap(tempScore.bitmapData);

            tempScore.bitmap = scoreBitmap;


            tempScore.x = xPos;
            tempScore.y = yPos;

            tempScore.life = scoreLife;
            tempScore.lifeCount = 0;

            tempScore.widthObject = $textWidth;
            tempScore.heightObject = $textHeight;

            tempScore._delay = scoreDelay;
            tempScore.delayCount = 0;

            tempScore.nextX = tempScore.x;
            tempScore.nextY = tempScore.y;

            scores.push(tempScore);
            }
    }
}

Вот некоторый код BasicBlitArrayObject (на этом основывается tempScore (т.е.-объект):

package com.framework_mod.src
{
import flash.display.BitmapData;
import flash.geom.Point;
import flash.events.EventDispatcher;
import flash.geom.Rectangle;
import flash.display.Bitmap;

    public class BasicBlitArrayObject extends EventDispatcher{

    public var x:Number = 0;
    public var y:Number = 0;
    public var nextX:Number = 0;
    public var nextY:Number = 0;
    public var dx:Number = 0; 
    public var dy:Number = 0;
    public var frame:int = 0;
    public var bitmapData:BitmapData;
    public var bitmap:Bitmap;
    public var animationList:Array = [];
    public var testList:Array = [];

    public var point:Point = new Point(0, 0);
    public var speed:Number = 0;

    public var xMax:int = 0;
    public var yMax:int = 0;
    public var xMin:int = 0;
    public var yMin:int = 0;

    public var aniType:int = 1;

    public var health:int = 0;
    public var _size:int = 0;
    public var score:int = 0;
    public var _damage:int = 0;
    public var count:int = 0;
    public var bitmapSize:int = 0;
    public var life:int = 0;
    public var lifeCount:int = 0;
    public var startCount:Boolean;
    public var _delay:int = 0;
    public var delayCount:int = 0;
    public var startDelay:Boolean;
    public var _stop:int;
    public var stopAni:Boolean;
    public var stopAniCount:int = 0;
    public var _type:int = 0;
    public var shield:int = 0;
    public var healthPoints:int = 0;
    public var widthObject:int;
    public var heightObject:int;
    public var boost:Number;
    public var boostLfe:int;
    public var weaponLfe:int;
    public var _projXAdjust:Number;
    public var _projYAdjust:Number;
    public var number:int;
    public var _offset:int;
    public var marked:Boolean;
    public var objMove:Boolean;

    public var removeObj:Boolean;
    public var finished:Boolean;



    public function BasicBlitArrayObject(xMin:int, xMax:int, yMin:int, yMax:int) 
    {
        this.xMin = xMin;
        this.xMax = xMax;
        this.yMin = yMin;
        this.yMax = yMax;
        //trace("basicblittarrayobject");
    }



    public function updateFrame(inc:int, aniType:int = 1):void
    {
        frame += inc;
        switch (aniType) {
        case 1: 
                if (frame > animationList.length - 1){
                    frame = 0;
                }
                bitmapData = animationList[frame];                  
                break;


        case 2: 
                if (frame > animationList.length - 1){
                    frame = 0;
                }
                bitmapData = animationList[1][frame];


                break;
        }


    }   



    public function render(canvasBitmapData:BitmapData):void {
        x = nextX;
        y = nextY;
        point.x = x;
        point.y = y;            

        canvasBitmapData.copyPixels(bitmapData, bitmapData.rect, point);
    }


    public function dispose():void {
        bitmapData.dispose();
        bitmapData = null;
        bitmap = null;
        animationList = null;
        point = null;
    }

}

}

1 Ответ

1 голос
/ 21 июля 2011

Я думаю, что проблема проста, но разрешение не.Объекты, которые вы пытаетесь преобразовать, скрыты.Поэтому они не добавляются на сцену.Таким образом, свойство stage объекта имеет значение null.Я подозреваю, что плагин TransformAroundPoint пытается использовать свойство stage объекта, и это выдает ошибку нулевого объекта, которую вы видите.Чтобы увидеть простой пример этого, создайте очень простой файл.Создайте два растровых изображения, добавьте одно на сцену и не добавляйте другое.Примените анимацию к сцене, она будет работать.Затем примените анимацию к экземпляру за сценой, и вы получите ту же ошибку, что и в игре.

Вместо этого вам нужно будет выполнить преобразование самостоятельно.Вместо того, чтобы использовать TweenLite для вращения вокруг точки, сделайте это самостоятельно.К счастью, в Stack Overflow уже есть отличная тема на эту тему! Поворот вокруг точки, которая не является (0,0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...