博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FlasCC例子研究之bitmapdata
阅读量:6098 次
发布时间:2019-06-20

本文共 3119 字,大约阅读时间需要 10 分钟。

bitmapdata是FlasCC官方例子02_Interop中的例子。这例子比起c++interop来说,多了一个鼠标事件监听。

我们逐行分析一下吧。

#include <AS3/AS3.h>

#include <Flash++.h>

using namespace AS3::ui;

static const int COORDBITS = 7; // 7 bits => dim of 128

static const int DIM = 1 << COORDBITS;

这个函数主要是根据一个给出的offset值,返回一个计算后的值

static int swizzleOffset(int offs)

{
  int result = 0;
  int coordBits = COORDBITS;
  int offsHi = offs >> COORDBITS; // take the higher order bits
  int coordBits2 = COORDBITS * 2;
  while(coordBits--)
  {
    // put the lowest bit in the "lo" offset bits
    // into the highest bit of the result...
    // it'll get shifted into a lower position
    // as the loop executes
    result |= ((offs & 1) << coordBits2);
    offs >>= 1;
    result >>= 1;
    // same for the "hi" offset bits
    result |= ((offsHi & 1) << coordBits2);
    offsHi >>= 1;
    result >>= 1;
  }
  return result;
}

 

// 将一个图像的像素进行混淆

static void swizzlePixels(unsigned *dst, unsigned *src)
{
    int offs = DIM * DIM;

    while(offs--)

    {
        int swiz = swizzleOffset(offs);
        dst[swiz] = src[offs];
    }
}

 

//监听鼠标点击事件,然后混淆BitmapData的像素值

static var mouseDownHandler(void *arg, var args)
{
    flash::events::MouseEvent event = flash::events::MouseEvent(args[0]);
    flash::display::Sprite sprite = flash::display::Sprite(event->target); // the container Sprite
    flash::display::Bitmap bitmap = flash::display::Bitmap(sprite->getChildAt(0)); // Bitmap is the only child
    flash::display::BitmapData bitmapData = bitmap->bitmapData;
    // ByteArray corresponding to our ram!
    // C ptrs are equivalent to offsets into this ByteArray
    flash::utils::ByteArray ram = internal::get_ram();

    // allocate space for the pixels

    unsigned *src = new unsigned[DIM * DIM];
    unsigned *dst = new unsigned[DIM * DIM];
    // copy current pixels directly to ram
    bitmapData->copyPixelsToByteArray(bitmapData->rect, ram, src);
    // swizzle them!
    swizzlePixels(dst, src);
    // write new pixels directly from ram
    bitmapData->setPixels(bitmapData->rect, ram, dst);
    // clean up
    delete dst;
    delete src;
    return internal::_undefined;
}

 

int main()

{
    //取得舞台
    flash::display::Stage stage = internal::get_Stage();

    //创建一个Shape

    flash::display::Shape myShape = flash::display::Shape::_new();
    flash::display::Graphics graphics = myShape->graphics;

    //绘制简单的图形 这是一个像把子一样的圆

    graphics->beginFill(0xff00ff, 0.5);

    graphics->drawCircle(64.0, 64.0, 64.0);
    graphics->endFill();
    graphics->beginFill(0xffff00, 0.5);
    graphics->drawCircle(64.0, 64.0, 40.0);
    graphics->endFill();
    graphics->beginFill(0x00ffff, 0.5);
    graphics->drawCircle(64.0, 64.0, 16.0);
    graphics->endFill();

    //创建一个BitmapData

    flash::display::BitmapData myBitmapData = flash::display::BitmapData::_new(DIM, DIM);
    //把图形绘制到这个bitmapdata上

    myBitmapData->draw(myShape);

    // 创建一个Bitmap

    flash::display::Bitmap myBitmap = flash::display::Bitmap::_new(myBitmapData);

    // 加到一个Sprite中,以便显示

    flash::display::Sprite mySprite = flash::display::Sprite::_new();

    mySprite->addChild(myBitmap);

    // 增加一个鼠标监听器
    mySprite->addEventListener("mouseDown", Function::_new(&mouseDownHandler, NULL));
    // 添加到舞台
    stage->addChild(mySprite);

    // 这个函数将会使C++与AS3进行同步,以使可以处理鼠标事件。

    AS3_GoAsync();

    // 因为运行机制的原因,这行代码是无法到达的。

    return 0;
}

还是上个图吧。

转载于:https://www.cnblogs.com/qilinzi/archive/2013/05/15/3080980.html

你可能感兴趣的文章
Slony-I的删除:
查看>>
暴君第一季/全集Tyrant迅雷下载
查看>>
wordpress文章顶部添加广告位的方法
查看>>
动态变量和静态变量的区别
查看>>
HDU 5281 Senior&#39;s Gun
查看>>
ssh以root用户远程登录失败
查看>>
[51单片机] 以从0开始做4位8段共阴数码管3461AS驱动谈细节决定高质量DIY
查看>>
扒页面小感
查看>>
【实战HTML5与CSS3】用HTML5和CSS3制作页面(上)
查看>>
matlab中矩阵和向量的创建
查看>>
xen安装CentOS虚拟机(使用163镜像)
查看>>
TF-IDF与余弦相似性的应用(一):自动提取关键词
查看>>
MYSQL导入导出.sql文件
查看>>
一款可视化的在线制作H5
查看>>
第 8 章 varnish - a state-of-the-art, high-performance HTTP accelerator
查看>>
[LeetCode] Max Area of Island 岛的最大面积
查看>>
Centos 搭建 Zabbix Agent 客户端
查看>>
docker~docker-machine的介绍
查看>>
docker~大叔对术语的解释
查看>>
Linux下,用命令进行 日志分割、日志合并
查看>>