2011-11-15 34 views
0

我希望有人能帮助我。我的任务是在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

https://projectavian.com/zero.gif – Marty

+0

作为一个说明。建议不要将UpperCamelCase用于变量和函数名称。它有助于区分静态类别参考。 (因此,为什么上面的代码中的所有变量都有Class着色) – WORMSS

回答

1

的问题是,你写

ImageBitMap   = new Bitmap(ChatImageBMD); 

而且你只加ImageBitMap到显示列表中的第一次。因此,在此之后,您只更改参考“ImageBitMap”,而不是显示的对象。你应该写这样的事情:

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

提示:您可以通过避免检查ImageBitMap.parent使用布尔AddedBitMap

顺便说一下,你的变量的第一个字母应小写,以与类型和类的区别;)

+0

完美!谢谢! – user385762