bitmapdata是FlasCC官方例子02_Interop中的例子。這例子比起c++interop來說,多了一個鼠標(biāo)事件監(jiān)聽。
我們逐行分析一下吧。
#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;
這個函數(shù)主要是根據(jù)一個給出的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];
}
}
//監(jiān)聽鼠標(biāo)點擊事件,然后混淆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();
//創(chuàng)建一個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();
//創(chuàng)建一個BitmapData
flash::display::BitmapData myBitmapData = flash::display::BitmapData::_new(DIM, DIM);
//把圖形繪制到這個bitmapdata上
myBitmapData->draw(myShape);
// 創(chuàng)建一個Bitmap
flash::display::Bitmap myBitmap = flash::display::Bitmap::_new(myBitmapData);
// 加到一個Sprite中,以便顯示
flash::display::Sprite mySprite = flash::display::Sprite::_new();
mySprite->addChild(myBitmap);
// 增加一個鼠標(biāo)監(jiān)聽器
mySprite->addEventListener("mouseDown", Function::_new(&mouseDownHandler, NULL));
// 添加到舞臺
stage->addChild(mySprite);
// 這個函數(shù)將會使C++與AS3進行同步,以使可以處理鼠標(biāo)事件。
AS3_GoAsync();
// 因為運行機制的原因,這行代碼是無法到達的。
return 0;
}
還是上個圖吧。
