Применение Windows API - [30]

Шрифт
Интервал

> }

> void Step() { ++_tick; }

> void Update(Canvas& canvas);

> void Paint(Canvas& canvas);

>private:

> int _cx, _cy;

> int _tick;

> Bitmap _bitmapBuf; // for double buffering

> Bitmap _background;

> int _widthBkg, _heightBkg;

> Bitmap _sprite;

> Bitmap _mask;

> int _widthSprite, _heightSprite;

>};


>View::View(HINSTANCE hInst) : _tick (0) {

> // Load bitmap from file

> _background.Load("picture.bmp");

> // Load bitmap from resource

> _background.GetSize(_widthBkg, _heightBkg);

> // Load bitmaps from resources

> _sprite.Load(hInst, IDB_FANNY);

> _mask.Load(hInst, IDB_MASK);

> _sprite.GetSize(_widthSprite, _heightSprite);

> DesktopCanvas canvas;

> _bitmapBuf.CreateCompatible(canvas, 1, 1);

> _cx = 1;

> _cy = 1;

>}

And here's the implementation of Update. We create a bitmap canvas in memory, making it compatible with the current display canvas. We blit the background image into it, then blit the mask and the sprite (notice the change of position for each frame). Finally, we transfer the complete bitmap into our buffer (overloaded assignment operator at work!).

>void View::Update(Canvas& canvas) {

> const double speed = 0.01;

> Bitmap bmp(canvas, _cx, _cy);

> BitmapCanvas bmpCanvas(canvas, bmp);

> RECT rect = { 0, 0, _cx, _cy };

> bmpCanvas.WhiteWash(rect);

> // Do the off-line drawing

> Blitter bltBkg(_background);

> bltBkg.BlitTo(bmpCanvas);

> int xRange = (_widthBkg - _widthSprite) / 2;

> int yRange = (_heightBkg - _heightSprite) / 2;

> int x = xRange + static_cast(xRange * sin(speed * _tick));

> int y = yRange + static_cast(yRange * cos(4 * speed * _tick));

> Blitter bltMask(_mask);

> bltMask.SetMode(SRCPAINT);

> bltMask.SetDest(x, y);

> bltMask.BlitTo(bmpCanvas);

> Blitter bltSprite(_sprite);

> bltSprite.SetMode(SRCAND);

> bltSprite.SetDest(x, y);

> bltSprite.BlitTo(bmpCanvas);

> // update the buffer

> _bitmapBuf = bmp;

>}

For completeness, here's the definition of bitmap canvas. You draw directly on this canvas using standard canvas methods, like Line, Text, SetPixel, etc... Here we only blit bitmaps into it.

>class BitmapCanvas: public MemCanvas {

>public:

> BitmapCanvas(HDC hdc, HBITMAP hBitmap) : MemCanvas(hdc) {

>  // convert bitmap to format compatible with canvas

>  _hOldBitmap = reinterpret_cast(::SelectObject(_hdc, hBitmap));

> }

> ~BitmapCanvas() {

>  ::SelectObject(_hdc, _hOldBitmap);

> }

>private:

> HBITMAP _hOldBitmap;

>};


>class MemCanvas: public Canvas {

>public:

> MemCanvas(HDC hdc) : Canvas(::CreateCompatibleDC(hdc)) {}

> ~MemCanvas() {

>  ::DeleteDC(_hdc);

> }

>};

Now, if you want more speed, read about DirectDraw.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.