как поменять картинку при движении объекта - PullRequest
0 голосов
/ 29 октября 2011

Например Пакман. Рот либо закрыт, либо открыт. И пока он движется, эти картинки меняют друг друга. Я пытался сделать так

 case WM_PAINT:         
 ......
 if (ChoosePictureInt==0)
    {         
         MaskBlt(mdc,my_pos.x,my_pos.y,my_size.cx,my_size.cy,my_dc,0,0,my_closemask,0,0,MAKEROP4(SRCCOPY,SRCPAINT));
         MaskBlt(mdc, my_pos.x, my_pos.y, my_size.cx, my_size.cy, my_dc, 0, 0, my_mask, 0, 0, MAKEROP4(SRCCOPY, SRCPAINT));

    }

Но в результате в окне осталась только последняя картинка. Когда я хочу сделать это (в случае WM_TIMER)

 case WM_TIMER: 
     if(LOWORD(wParam) == 777u) {  
        if(GetAsyncKeyState(VK_LEFT))
      {
         if (GreatFuncLeftRight(my_pos.x,my_pos.y))
         { 
            ChoosePictureInt = 1;
            if (ChooseMouseInt == 0)
                ChooseMouseInt = 0;
            else ChooseMouseInt = 0;
            my_pos.x -= 2;  // влево
                      MaskBlt(mdc, my_pos.x, my_pos.y, my_size.cx, my_size.cy, my_dc, 0, 0, my_mask, 0, 0, MAKEROP4(SRCCOPY, SRCPAINT));
         }
         else my_pos.x-=0;
      }

ничего не происходит

мой ответ

Вот как я решил эту проблему (я не думаю, что это лучший способ)

//for examp. for -> direction 
if(GetAsyncKeyState(VK_RIGHT))
      {
         if (GreatFuncLeftRightReverse(my_pos.x,my_pos.y))
         {
                            ChoosePictureInt = 0; //variable for picture with direction
            ChooseMouseInt *=-1; //variable for closed or opened mouth
            my_pos.x += 5;  // вправо
         }
         else my_pos.x+=0;
      }

А это событие в WM_PAINT

......
if (ChoosePictureInt==0)
    {         
      if(ChooseMouseInt<0)
      {
          Sleep(85);
         MaskBlt(mdc,my_pos.x,my_pos.y,my_size.cx,my_size.cy,my_dc,0,0,my_mask,0,0,MAKEROP4(SRCCOPY,SRCPAINT));
      }
      else
      {
          Sleep(85);
         MaskBlt(mdc, my_pos.x, my_pos.y, my_size.cx, my_size.cy, my_dc4, 0, 0, my_closemask, 0, 0, MAKEROP4(SRCCOPY, SRCPAINT));
      }
    } 
.....

1 Ответ

2 голосов
/ 29 октября 2011

Изменить переменные состояния (например, координаты объекта, активное растровое изображение и т. Д.) В обработчике сообщений WM_TIMER и сделать окно недействительным. Сделать все рисование в обработчике сообщений WM_PAINT.

Используйте функцию InvalidateRect http://msdn.microsoft.com/en-us/library/dd145002(v=vs.85).aspx для аннулирования клиентской области окна. Это приводит к тому, что сообщение WM_PAINT отправляется окну, а обработчик сообщений WM_PAINT перерисовывает окно в соответствии с новым состоянием объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...