Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void draw()
- {//отрисовка изображения gif
- // Создаем контекст рисования и устанавливаем
- // пиксельную систему координат
- Graphics g(hdc);
- g.SetPageUnit(UnitPixel);
- RectF bounds(0, 0, float(w), float(h));
- // Загружаем фоновое изображение и растягиваем его на все окно
- std::wstring wstr = strToWstring(animations[STATE][(int)currAnim]);
- LPWSTR lpstr = (LPWSTR)wstr.c_str();
- Image bg(lpstr);//L"b.gif"
- g.DrawImage(&bg, bounds);
- g.ResetTransform();
- }
- //объявим идентификаторы для картинок
- файл: *.rc
- IDC_KISS01 RCDATA "catkiss_01.bmpx"
- IDC_KISS02 RCDATA "catkiss_02.bmpx"
- ...
- IDC_KISS22 RCDATA "catkiss_22.bmpx"
- файл: Resource.h
- #define IDC_KISS01 111
- #define IDC_KISS02 112
- ...
- #define IDC_KISS22 132
- //класс, отвечающий за анимацию
- class CAT{
- public:
- CAT(){
- STATE = "kiss";
- ptSrc.x = 0;
- ptSrc.y = 0;
- }
- void loadAnimations(HWND hwnd, HINSTANCE hInstance, std::string nameAmim, int nCount, float sp)
- {//загрузим каждую картинку-объект в структуру данных для работы с изображениями
- hwndAnim = hwnd;
- speed = sp;
- HGDIOBJ hBitmap;
- HRSRC hRSrc;
- HGLOBAL hRes;
- BITMAPFILEHEADER *pRes;
- BITMAPINFOHEADER *bi;
- void *bits, *premultiply;
- std::vector<alpha> v;
- int id;
- if (nameAmim == "kiss") id = 111;
- for (int i = 0; i < nCount; i++){
- // load resource
- hRSrc = FindResource(hInstance, MAKEINTRESOURCE(id++), RT_RCDATA);
- hRes = LoadResource(hInstance, hRSrc);
- pRes = (BITMAPFILEHEADER*)LockResource(hRes);
- bi = (BITMAPINFOHEADER*)(pRes + 1);
- bits = ((char*)pRes) + pRes->bfOffBits;
- // premultiply
- premultiply = malloc(bi->biHeight * bi->biWidth * sizeof(RGBQUAD));
- for (int c = bi->biHeight * bi->biWidth; c--;) {
- RGBQUAD &src = ((LPRGBQUAD)bits)[c];
- RGBQUAD &dst = ((LPRGBQUAD)premultiply)[c];
- dst.rgbRed = (BYTE)MulDiv(src.rgbRed, src.rgbReserved, 255);
- dst.rgbGreen = (BYTE)MulDiv(src.rgbGreen, src.rgbReserved, 255);
- dst.rgbBlue = (BYTE)MulDiv(src.rgbBlue, src.rgbReserved, 255);
- dst.rgbReserved = src.rgbReserved;
- }
- a.hdcScreen = GetDC(HWND_DESKTOP);
- // prepare bitmap
- hBitmap = CreateCompatibleBitmap(a.hdcScreen, bi->biWidth, bi->biHeight);
- a.hdcMem = CreateCompatibleDC(a.hdcScreen);
- hBitmap = SelectObject(a.hdcMem, hBitmap);
- SetDIBitsToDevice(
- a.hdcMem, 0, 0, bi->biWidth, bi->biHeight,
- 0, 0, 0, bi->biHeight, premultiply, (BITMAPINFO*)bi, DIB_RGB_COLORS
- );
- a.sizeWnd.cx = bi->biWidth;
- a.sizeWnd.cy = bi->biHeight;
- free(premultiply);
- // prepare window
- memset(&a.blend, 0, sizeof(a.blend));
- a.blend.BlendOp = AC_SRC_OVER;
- a.blend.SourceConstantAlpha = 255;
- a.blend.AlphaFormat = AC_SRC_ALPHA;
- v.push_back(a);
- }//for
- //cleanup
- ReleaseDC(HWND_DESKTOP, a.hdcScreen);
- //hBitmap = SelectObject(a.hdcMem, hBitmap);
- DeleteDC(a.hdcMem);
- //DeleteObject(hBitmap);
- //в некоторых случаях могут быть не точные расчеты, т.к. получаем размеры последней картинки
- width = a.sizeWnd.cx;
- heigth = a.sizeWnd.cy;
- animations.insert(std::pair<std::string, std::vector<alpha>>(nameAmim, v));
- }
- void playAnim()
- {//проигрываем анимацию из таймера
- currAnim += 1 * speed;
- //!!! необходимо перенести в участок, где происходит смена состояния
- int cout = animations[STATE].size();
- a = animations[STATE][(int)currAnim];
- UpdateLayeredWindow(hwndAnim, a.hdcScreen, &ptPos, &a.sizeWnd, a.hdcMem, &ptSrc, 0, &a.blend, ULW_ALPHA);
- if ((int)currAnim >= cout - 1) currAnim = 0;
- }
- void setPos(int &x, int &y)
- {
- ptPos.x = x; ptPos.y = y;
- }
- private:
- struct alpha
- {//структура данных загружаемых изображение
- BLENDFUNCTION blend;
- HDC hdcScreen, hdcMem;
- SIZE sizeWnd;
- }a;
- float speed, currAnim;
- std::map<std::string, std::vector<alpha>> animations;
- std::string STATE;//stand, kiss
- HWND hwndAnim;
- POINT ptPos, ptSrc;
- int width, heigth;//wh img
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement