【问题标题】:How to change bitmap without adding another child to the stage如何在不向舞台添加另一个孩子的情况下更改位图
【发布时间】:2015-06-25 17:41:43
【问题描述】:

我确切地知道这个函数在做什么,但是我不知道如何改变它,以便 3 个符号只添加一次并且只有位图改变。感谢您的帮助!这可能很简单,但我似乎无法弄清楚,我是一名中级 as3 程序员,但我的知识仍然存在一些漏洞。

var randCount:int = 3
        function loadImage():void
        {
            for(var i:int = 0; i<randCount; i++)
            {
                var imgLoader:Loader = new Loader();
                var imgRequest:URLRequest = new URLRequest();
                imgRequest.url = "../img/planet" + int(2*Math.random()) +".png";
                trace(imgRequest.url);
                imgLoader.load(imgRequest);
                imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadedImg);
            }
        }

        function onLoadedImg(e:Event):void
        {
            e.currentTarget.removeEventListener(Event.COMPLETE, onLoadedImg);
            var bmp:Bitmap = e.currentTarget.content;
            bmp.x = 600;
            bmp.y = Math.random() * 520;
            bmp.width = 80;
            bmp.height = 80;
            addChild(bmp);

        }
button.addEventListener(MouseEvent.CLICK, changeBitmap);
        function changeBitmap(event:MouseEvent):void {
            loadImage();
        }

【问题讨论】:

  • 你想每次显示3张图片吗?
  • 是的,我已经解决了上述问题,还有一个问题。如果我想让 y 值均匀地隔开图像的 3 个实例(bmp),我该​​怎么做?而不是随机放置
  • 我为你的两个问题都做了一个回答,看看吧。

标签: actionscript-3 url random bitmap addchild


【解决方案1】:

猜你这样问是因为你只是在以前的位图之上添加更多位图,而“更改位图”是指添加新位图。

您需要删除之前添加的那些,然后才能添加新的。比如一个简单的改变:

    var randCount:int = 3
    var bitmaps:Array = [];
    function loadImage():void
    {
        for(var i:int = 0; i<randCount; i++)
        {
            var imgLoader:Loader = new Loader();
            var imgRequest:URLRequest = new URLRequest();
            imgRequest.url = "../img/planet" + int(2*Math.random()) +".png";
            trace(imgRequest.url);
            imgLoader.load(imgRequest);
            imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadedImg);                
        }
    }

    function onLoadedImg(e:Event):void
    {
        e.currentTarget.removeEventListener(Event.COMPLETE, onLoadedImg);
        var bmp:Bitmap = e.currentTarget.content;
        bitmaps.push(bmp);
        bmp.x = 600;
        bmp.y = Math.random() * 520;
        bmp.width = 80;
        bmp.height = 80;
        addChild(bmp);
        while(bitmaps.length > randCount)
        {
            var oldbitmap:DisplayObject = bitmaps.shift() as DisplayObject;
            removeChild(oldbitmap);
        }
    }

【讨论】:

  • 您好,感谢您的快速回复!我收到一条错误消息,说它无法将数组转换为显示对象。
  • 我完全复制了您的代码,但出现了两个错误。错误:将 uint 类型的值隐式强制转换为不相关的类型 flash.display:DisplayObject。错误:具有静态类型 uint 的值与可能不相关的类型 Array 之间的比较。 while (bitmaps.length > bitmaps) var {oldBitmap:DisplayObject = bitmaps.unshift(); removeChild(oldBitmap);} (斜体部分是问题的根源)
  • 是的,我有一个错字,它是未经测试的代码。查看编辑。
  • 谢谢,修复了一个错误。它还在为 bitmaps.unshift(); 大惊小怪。错误:将 uint 类型的值隐式强制转换为不相关的类型 flash.display:DisplayObject。
  • 我还能用 button.addEventListener(MouseEvent.CLICK, changeBitmap);函数 changeBitmap(event:MouseEvent):void { loadImage(); } 当我做瑞士法郎冻结。除此之外没有错误
【解决方案2】:

只需创建一个新的 BitmapData 并将其分配给Bitmap#bitmapData。这是处理问题的最经济的方法。 (一个 BitmapData 也适用于许多位图。)

【讨论】:

  • 他正在加载它们,因此他的 BitmapData 已经被包裹在 Bitmap 中,在 2 个现有位图之间切换 bitmapdata 没有任何好处。
  • 交换 BitmapData 不是一种选择?
  • 交换 BitmapData 会很好,如果这样可以节省位图的创建,但这里不是这样。
【解决方案3】:

要执行您要查找的操作,您还可以使用Sprite 作为图像的容器,每次您都可以删除它们以添加新图像。看看这个例子:

var nb_images:int = 3,
    bmp:Bitmap,
    // set 5px as vertical margin between images
    img_margin:int = 5, 
    img_request:URLRequest,
    img_loader:Loader;

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

function remove_all_images(): void 
{
    // remove all images
    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++)
    {
        // to generate randomly values between 0 and n (excluded) we use : int(n * Math.random())
        img_request = new URLRequest('images/' + (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.smoothing = true;
    bmp.x = 0, bmp.width = bmp.height = 80;
    // set image.y
    // 1st image : y = 0, 2nd image : y = 80 + 5 = 85, 3rd image : y = 2 x 85 = 170
    bmp.y = images_container.numChildren * (bmp.height + img_margin);
    // add the image to images_container
    images_container.addChild(bmp);
}

希望能有所帮助。

【讨论】:

  • 谢谢!这很有帮助!如果可以的话,我会投票!
猜你喜欢
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多