tweenlite不使用位图?

时间:2011-07-18 17:05:26

标签: actionscript-3

当我尝试将TweenLite与Bitmap一起使用时,我遇到以下问题:

将TweenLite应用于位图(tempScore.bitmap)时出现奇怪的错误消息。 GetBounds有效。位图具有透明度。有谁知道为什么它不起作用?任何帮助赞赏。感谢:。)

使用getBounds-Method时,我得到了这个:

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]);

这是我尝试在tempScore上使用TweenLite的部分:

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-method)将大量对象绘制到画布上。

tempScore是一个Score-object。 Score对象基于BasicBlitArrayObject。否则,此对象扩展EventDispatcher。我希望这些小信息有所帮助。

这是用于管理tempScore的外观和属性的scoreManager:

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依赖于它(即Score-object):

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 个答案:

答案 0 :(得分:1)

我认为这个问题很简单,但决议却不是。您尝试转换的对象是blitted。所以他们没有加入舞台。所以对象的stage属性为null。 我怀疑TransformAroundPoint插件正在尝试使用对象的stage属性,这就是抛出你正在看到的空对象错误。 要查看一个简单的示例,请创建一个非常简单的文件。 创建两个位图,向舞台添加一个,不添加另一个。 将补间应用于舞台实例,它将起作用。 然后将补间应用到场外实例,你应该得到你在游戏中得到的同样的错误。

您需要做的是自己处理变换。不要使用TweenLite围绕某个点旋转,而是自己动手。 幸运的是,Stack Overflow已经在该主题上有一个很棒的主题! Rotate around a point that is not (0,0)