Изменить растровое изображение во Flash - PullRequest
0 голосов
/ 16 ноября 2011

Я надеюсь, что кто-то может помочь мне здесь. Мне было поручено написать движок чата в actionscript3 (AIR), и с каждым сообщением чата связано изображение плаката. Таким образом, у меня есть 5 сообщений чата на экране одновременно, но будет очевидно, что изображения, связанные с сообщением, например, # 1 все время меняется, потому что последний человек, который публикует сообщения, отличается.

То, что я считаю неправильным, - это использование метода .addChild каждый раз, когда мне нужно заменить изображение, потому что оно будет просто создавать больше материала на сцене. То, что я пытался сделать, это код ниже, но он отказывается обновить изображение. Как я думал, это должно работать:

Строка 1 - создает изображение класса фильма, которое добавляется в "this.ChatLine"

Когда в строке 2 появляется следующее изображение - предполагается перезаписать «ImageBitMap» новыми данными изображения, но этот бит не работает.

1 - this.ChatLine:bmChatImage = new mbChatImage();

2 - this.ChatLine.LoadChatImage("NewImage.png");

package com.mypackage {

import  flash.display.MovieClip;
import  flash.events.*;
import  flash.display.Loader;
import  flash.display.Bitmap;
import  flash.display.BitmapData;   
import  flash.net.URLRequest;   
import  flash.display.BitmapData;
import  flash.geom.Rectangle;
import  flash.geom.Point;


public class bmChatImage extends MovieClip {

    public var  ChatImage               =   new Loader();
    private var ImageBitMap:Bitmap          =   null;
    private var AddedBitMap:Boolean         =   false;
    private var     ChatImageBMD:BitmapData         =   null;
    private var Parent                  =   null;
    private var ImageURL:String             =   "";

    public function bmChatImage() {

        ChatImage.load(new URLRequest("http://mydomain/default.png"));
        ChatImage.contentLoaderInfo.addEventListener(Event.COMPLETE,        DoneLoadImage);         
        ChatImage.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

    }

    public  function    LoadChatImage(pImageURL:String,pChatSequence:int) {

        ImageURL        =   pImageURL;
        ChatSequence        =   pChatSequence;
        ChatImage.load(new URLRequest(ImageURL));
        ChatImage.contentLoaderInfo.addEventListener(Event.COMPLETE, DoneLoadImage);            
        ChatImage.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

    }

    protected function ioErrorHandler(e:IOErrorEvent):void{
            trace("ERROR",e.text);          
    }

    private function    DoneLoadImage(ThisObject:Event)
    {
        ChatImageBMD            =   Bitmap(ChatImage.content).bitmapData.clone();
        ImageBitMap         =   new Bitmap(ChatImageBMD);

        if (AddedBitMap == false) {
            AddedBitMap     =   true;
            this.addChild(ImageBitMap);
        }
    }
}   
}

1 Ответ

1 голос
/ 16 ноября 2011

Проблема в том, что вы написали

ImageBitMap         =   new Bitmap(ChatImageBMD);

И вы только добавляете ImageBitMap в список отображения в первый раз.Поэтому после этого вы изменяете только ссылку "ImageBitMap", а не отображаемый объект.Вы должны написать что-то вроде этого:

ChatImageBMD = Bitmap(ChatImage.content).bitmapData.clone();
if (!ImageBitMap)
{
    ImageBitMap = new Bitmap(ChatImageBMD);
}
else
{
    ImageBitMap.bitmapData = ChatImageBMD;
}

подсказки: вы можете избежать использования вашего логического AddedBitMap, проверив ImageBitMap.parent.

И, кстати, первую букву ваших переменныхдолжен быть в нижнем регистре, чтобы иметь значение с типами и классами;)

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