1. 程式人生 > >關於cocos2dx下,圖片資料的操作

關於cocos2dx下,圖片資料的操作

在flash下,針對於圖片的操作都是對點陣圖資料的操作,讀取改都很方便。 最近做一個小遊戲,吃餅乾, 大概內容就是一個完整的圓,點選到哪個點,那個點的附近都變成透明的。

對於這個功能,在flash下是相當輕鬆,但在cocos2dx下,就犯難了,因為cocos2dx下沒有直接取到位置畫素的資料。 查詢資料之後,還是成功解決了問題,記錄一下。感謝論壇上大俠的無私奉獻。

原理是:ccsprite是構建之源是CCTexture2D , 而cctexture構建之源就是ccimage 。而ccimage的畫素級資料可以根據ccimage的getdata方法可以得到。得到之後便可對之進行讀寫操作了, 可以實現碰撞檢測和改變畫素級的功能

取得某一張圖片的資料可以通過如下方法。

CCImage* m_image;

unsigned char*  m_data;

m_image = newCCImage();

m_image->initWithImageFile(name); //"cookies/cookies1.png"

m_data = m_image->getData();

此時,已取到畫素資料

現在,我對這個資料進行每一畫素的讀取操作。這裡只讀取alpha通道,並判斷是否是透明

for (unsigned long hh=0; hh<m_image->getHeight(); hh++) {

         for

(unsigned long i=0; i<m_image->getWidth(); i++) {

                    GLubyte byteValue = *(m_data+=3);

                    m_data++;

                    if (byteValue == 0) {

                       //如果(i,hh)是透明,TODO

                    }

          }

}

m_data-=m_image->getWidth()*m_image->

getHeight()*4; //讀完之後,別忘了對m_data的地址重置,以便後面操作。

寫操作:對(x,y)位置畫素點設為透明

float position = (y * m_image->getWidth() + x) * 4;

*(m_data+=(int(position)+3)) = 0;

m_data-=(int(position)+3);


寫完之後需要更新顯示的話。

CCTexture2D* texture = newCCTexture2D();

texture->initWithData(m_data, kCCTexture2DPixelFormat_RGBA8888, m_image->getWidth(), m_image->getHeight(), CCSize(m_image->getWidth(), m_image->getHeight()));

CCSprite *m_cakeSp = CCSprite::createWithTexture(texture);

texture->release();


大概如此,其中的記憶體管理問題就不做記錄了。 至此,個人覺得如果專案中頻繁用到的話,得建立一個ImageDataManager來管理需要操作的圖片資料,這樣在data佔用記憶體上會容易管理一些呢? 畢竟這個data對記憶體的佔用是相當大的。 說歸說,回頭看看專案有沒有對data進行釋放了。