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;
- }
复制代码
还是上个图吧。
|