【问题标题】:Delete specific image from loader从加载器中删除特定图像
【发布时间】:2015-07-01 23:15:16
【问题描述】:

我在屏幕上拥有三个来自同一个加载器的图像。单击后,我需要删除特定(目标)位图。我在下面有一个 onClick 功能,非常感谢任何帮助。谢谢!

var nb_images:int = 3;

var bmp:Bitmap = new Bitmap;

var img_margin:int = stage.stageHeight/3.5;
var img_request:URLRequest;
var img_loader:Loader;

var images_container:Sprite = new Sprite();
addChild(images_container);

function remove_all_images():void {
    for (var i:int = images_container.numChildren - 1; i >= 0; i--) {
        images_container.removeChildAt(i);
    }
}

function load_images():void {
    remove_all_images();
    for (var i:int = 0; i < nb_images; i++) {
        img_request = new URLRequest('../img/planet' + (int(nb_images * Math.random())) + '.png');
        img_loader = new Loader();
        img_loader.load(img_request);
        img_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, on_img_loaded);
    }
}

function on_img_loaded(e:Event):void {
    e.currentTarget.removeEventListener(Event.COMPLETE, on_img_loaded);
    bmp = e.currentTarget.content;
    bmp.x = 600, bmp.width = bmp.height = 80;
    bmp.y = images_container.numChildren * (bmp.height + img_margin);
    images_container.addChild(bmp);
    stage.addEventListener(MouseEvent.CLICK, onClick);
    function onClick(event:MouseEvent):void {
        removeChild(e.target);
    }
}

load_images();

【问题讨论】:

  • 特定(目标)位图是什么意思?您是否尝试在单击时删除位图?现在,您的代码会监听(三次)舞台上的点击,然后尝试从DisplayList 中删除e.target(甚至不是DisplayObject)。请详细说明您要删除的具体内容以及尝试删除的时间。
  • 我有三张图片,每张图片在上面的代码中均匀分布在一条垂直线上。我只是想做一个鼠标事件,允许我删除我点击的图像。我意识到 e.target 不是 DisplayObject,这是我需要帮助的,谢谢。希望这会带来清晰。

标签: image function actionscript-3 bitmap removechild


【解决方案1】:

好的,我在这里做的第一件事是删除var bmp:Bitmap = new Bitmap。你正在创建一个你并不真正需要的引用,所以让我们完全摆脱它。

现在,在您的on_img_loaded 方法中,您将要为每个加载的图像创建一个新的Bitmap

var bmp:Bitmap = e.currentTarget.content;

然后,您需要将事件侦听器直接添加到 InteractiveObject 而不是舞台。位图不是InteractiveObjects,所以我们需要在添加侦听器之前将其包装在其他东西中。

var sprite: Sprite = new Sprite();
sprite.addChild(bmp);
addChild(sprite);
sprite.addEventListener(MouseEvent.CLICK, onClick);

最后,创建一个方法来从images_container 中删除点击的Bitmap(注意这里我删除了嵌套函数——这可以防止参数歧义并且通常是一个好的做法)。

function onClick(e:MouseEvent):void
{
    images_container.removeChild(e.currentTarget);
}

这是完整的相关代码(未经测试)。

//remove var bmp:Bitmap = new Bitmap from the beginning of the code
function on_img_loaded(e:Event):void {
    e.currentTarget.removeEventListener(Event.COMPLETE, on_img_loaded);
    var bmp:Bitmap = e.currentTarget.content;
    bmp.x = 600, bmp.width = bmp.height = 80;
    bmp.y = images_container.numChildren * (bmp.height + img_margin);
    var sprite: Sprite = new Sprite();
    sprite.addChild(bmp);
    addChild(sprite);
    images_container.addChild(sprite);
    sprite.addEventListener(MouseEvent.CLICK, onClick);
}

function onClick(e:MouseEvent):void
{
    e.currentTarget.removeEventListener(MouseEvent.CLICK, onClick)
    images_container.removeChild(e.currentTarget as DisplayObject);
}

希望这会有所帮助!

【讨论】:

  • 谢谢,我尝试了您的代码并收到以下错误:将具有静态类型 Object 的值隐式强制转换为可能不相关的类型 flash.display:DisplayObject。错误是突出显示 images_container.removeChild(e.currentTarget);
  • 哎呀,我的错。将该行更改为images_container.removeChild(e.currentTarget as Bitmap);
  • 嗯,仍然没有删除位图。我认为位图没有检测到鼠标输入。不过编译没有问题。
  • 啊,对。位图不是InteractiveObject,所以它不会检测到MouseEvents。我已编辑原始帖子以将 Bitmap 包装在 Sprite 容器中。
  • 我尝试了您新编辑的代码,我得到了与之前相同的错误错误:将静态类型 Object 的值隐式强制转换为可能不相关的类型 flash.display:DisplayObject。
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2023-03-11
  • 1970-01-01
  • 2015-04-25
相关资源
最近更新 更多