baidu_39690852 2017-08-01 09:26 采纳率: 0%
浏览 849

透明动画 怎消除前一个动画?

看着书打代码,人物的上一个动画不会消失?(假设方块是人物)
图片说明
图片说明
//我的框架

//----------------------------------------【头文件部分】------------------------------------------------
//描述:程序依赖的头文件 1
//------------------------------------------------------------------------------------------------------
#include
#include
#pragma comment(lib,"Msimg32.lib")

//----------------------------------------【宏定义部分】------------------------------------------------
//描述:定义一些辅助的宏 1
//------------------------------------------------------------------------------------------------------
#define WINDOW_WIDTH 800//窗口的宽度
#define WINDOW_HEIGHT 600//窗口的高度
#define WINDOW_TITLE L"ForMyLoverForever"//窗口标题的定义

//-------------------------------------【全局变量声明部分】---------------------------------------------
//描述:全局变量的声明 1
//------------------------------------------------------------------------------------------------------
HDC g_hdc = NULL, g_mdc = NULL, g_bufdc = NULL;//全局设备环境句柄
HBITMAP g_hSprite = NULL, g_hBackGround = NULL;//一个存人物,一个存背景
int g_iNum = 0, g_iX = 0, g_iY = 0;//g_Num变量用来记录目前显示的图号,XY记录贴图的横纵坐标
DWORD g_tPre = 0, g_tNow = 0;//声明两个变量来记录时间,g_tPre为上一次绘制的时间,g_tNow为此次准备绘制的时间

                         //-------------------------------------【全局函数声明部分】---------------------------------------------
                         //描述:全局函数的声明部分,防止“未申明的标示”错误                                                   1
                         //------------------------------------------------------------------------------------------------------

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);//窗口过程函数
BOOL Game_Init(HWND hwnd);//在此函数中进行资源初始化
VOID Game_Paint(HWND hwnd);//在此函数中进行绘图代码的书写
BOOL Game_CleanUp(HWND hwnd);//在此函数中进行资源的清理
//---------------------------------------【WinMain()函数】----------------------------------------------
//描述:Windows应用程序的入口,类似main 1
//------------------------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//【1】设计一个完整的窗口类
WNDCLASSEX wndClass = { 0 };//用WINDCLASSEX定义一个窗口类
wndClass.cbSize = sizeof(WNDCLASSEX);//设置结构体的字节数大小
wndClass.style = CS_HREDRAW | CS_VREDRAW;//设置窗口的样式
wndClass.lpfnWndProc = WndProc;//设置指向窗口过程函数的指针
wndClass.cbClsExtra = 0;//窗口类的附加内存,为0就好
wndClass.cbWndExtra = 0;//窗口的附加内存,为0就好
wndClass.hInstance = hInstance;//指定的包含窗口过程的程序的事例句柄
wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);//加载自定义图标xxx
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//指定窗口类的光标句柄
wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//为hbrBackground指定一个灰色画刷句柄
wndClass.lpszMenuName = NULL;//用一个空终止字符串,指定菜单资源的名字
wndClass.lpszClassName = L"ForMyLove";//用一个以空终止的字符串,指定窗口类的名字

                                      //【2】注册窗口类
if (!RegisterClassEx(&wndClass))
    return -1;

//【3】正式创建窗口
HWND hwnd = CreateWindow(L"ForMyLove", WINDOW_TITLE,
    WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
    WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);

//【4】窗口的移动、显示、更新
MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);//调整窗口显示时的位置,使它位于坐标(250,80)处
ShowWindow(hwnd, nCmdShow);//调用ShowWindow函数来显示窗口
UpdateWindow(hwnd);//对窗口进行更新

if (!Game_Init(hwnd))
{
    MessageBox(hwnd, L"failed", L"message", 0);//使用messagebox函数 创建一个消息窗口
    return FALSE;
}

//【5】循环消息过程
MSG msg = { 0 };//定义并初始化msg
while (msg.message != WM_QUIT)//使用while循环,如果消息不是WM_QUIT消息,就能继续循环
{
    if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))//查看应用程序消息队列,有消息时将队列中的消息派发出去
    {
        TranslateMessage(&msg);//将虚拟键消息转换为字符的消息
        DispatchMessage(&msg);//分发一个消息给窗口程序
    }
    else
    {
        g_tNow = GetTickCount();//获得当前系统时间
        if (g_tNow - g_tPre >= 100)//当此次循环运行与上次绘图相差0.1秒时再进行重绘
            Game_Paint(hwnd);
    }
}

//【6】窗口程序的注销
UnregisterClass(L"ForMyLove", wndClass.hInstance);//程序准备结束,注销窗口
return 0;

}
//-------------------------------------【Game_Init()函数】--------------------------------------------------
//描述:初始化函数,进行一些简单的初始化 1
//----------------------------------------------------------------------------------------------------------
BOOL Game_Init(HWND hwnd)
{
HBITMAP bmp;
g_hdc = GetDC(hwnd);
g_mdc = CreateCompatibleDC(g_hdc);
g_bufdc = CreateCompatibleDC(g_mdc);
bmp = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);//建立一个和窗口兼容的空的位图对象

SelectObject(g_mdc, bmp);
g_hSprite = (HBITMAP)LoadImage(NULL, L"3.bmp", IMAGE_BITMAP, 480, 108, LR_LOADFROMFILE);
g_hBackGround = (HBITMAP)LoadImage(NULL, L"1.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE);

g_iX = 0;
g_iY = 350;

Game_Paint(hwnd);
return TRUE;

}

//-------------------------------------【Game_Paint()函数】-------------------------------------------------
//描述:绘制函数,在此函数中进行绘制操作 1
//----------------------------------------------------------------------------------------------------------
VOID Game_Paint(HWND hwnd)
{
//处理图号
if (g_iNum == 8)//图号是否超过最大,要是超过就定为0
g_iNum = 0;

//根据图号来贴图
SelectObject(g_mdc, g_hBackGround);//选择位图
BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);//以目前窗口进行贴图

//在mdc中进行透明处理
SelectObject(g_bufdc, g_hSprite);
TransparentBlt(g_mdc, g_iX, g_iY, 60, 108, g_bufdc, g_iNum * 60, 0, 60, 108, RGB(0, 0, 0));//透明色彩法

//将最后的画面显示在窗口中
BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);

g_tPre = GetTickCount();//记录此次绘图时间,供下次游戏循环中判断是否达到更新时间间隔

//图号自增
g_iNum++;

g_iX += 10;//计算下次贴图的坐标
//如果超过窗口边缘 就把他-60
if (g_iX >= WINDOW_WIDTH)
    g_iX = -60;

}

//--------------------------------------【Game_CleanUp()函数】----------------------------------------------
//描述:资源清理函数,在此函数中进行退出前的资源清理工作 1
//----------------------------------------------------------------------------------------------------------
BOOL Game_CleanUp(HWND hwnd)
{
DeleteObject(g_hBackGround);
DeleteObject(g_hSprite);
DeleteDC(g_mdc);
DeleteDC(g_bufdc);
ReleaseDC(hwnd, g_hdc);
return TRUE;
}

//---------------------------------------【WndProc()窗口过程函数】------------------------------------------
//描述:窗口的过程函数 1
//----------------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT paintStruct;//定义一个PAINTSTRUCT机构体来记录一些绘制信息

switch (message)
{
case WM_TIMER://定时器消息
    Game_Paint(hwnd);//调用函数来绘图
    break;

case WM_PAINT://若是客户区重绘消息
    g_hdc = BeginPaint(hwnd, &paintStruct);//指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到paintStruct结构体中
    Game_Paint(hwnd);
    EndPaint(hwnd, &paintStruct);//EndPaint函数标记指定窗口的绘画过程结束
    ValidateRect(hwnd, NULL);//更新客户区的显示
    break;

case WM_KEYDOWN://若是键盘按下的消息
    if (wParam == VK_ESCAPE)//按下的键是ESC
        DestroyWindow(hwnd);//销毁窗口,发送一条WM_DESTROY的消息
    break;

case WM_DESTROY:
    Game_CleanUp(hwnd);//调用自定义的资源清理函数进行退出前的资源清理
    PostQuitMessage(0);//向系统表明有个线程终止请求。用来响应WM_DESTROY消息
    break;

default://默认的,若与上述不符合的条件
    return DefWindowProc(hwnd, message, wParam, lParam);//调用默认的窗口过程
}

return 0;//正常退出

}//窗口过程函数

  • 写回答

1条回答 默认 最新

  • devmiao 2017-08-01 16:29
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料