本系列文章由@二货梦想家张程 所写,转载请注明出处。

本文章链接:http://blog.csdn.net/terence1212/article/details/44224963

作者:ZeeCoder  微博链接:http://weibo.com/zc463717263

我的邮箱:michealfloyd@126.com   欢迎大家发邮件来和我交流编程心得

you are what you read!与大家共勉!

-----------------------------------------------------------分割线:ZeeCoder-------------------------------------------------------------

在笔记一中讲到了透明特效的实现,在游戏中,往往需要实现透明动画,这是游戏设计中一定会用到的基本技巧,它通过图案的连续显示及透明效果来产生背景图上的动画效果。

1、准备工作

要实现透明动画需要一整套人物跑动的bmp分解图。

ps:博主今天现学ps,花了大力气才做成这套图,真是感叹之前没有学好ps,书到用时方恨少啊~

在上图中,每幅小图的尺寸是121*129。

笔记一(【Visual C++】游戏编程学习笔记之一:五毛钱特效之透明和半透明处理)中介绍到,利用上述图还不能完成透明动画的制作,我们需要的是下面这张图(大小:968 * 129):

同样,做好了人物跑动的效果图之后,接下来就是编程实现的思想了。

2、编程思想

实现透明动画需要以下两个步骤:

(1)人物跑动图案的透明化

(2)更新贴图的坐标实现动画效果

3、程序代码(本笔记代码在Visual C++下编写)

(1)声明全局变量

//全局变量声明
HBITMAP walker,bg;
HDC hdc , mdc , bufdc;
HWND hWnd;
DWORD tPre , tNow ;
int num ,x ,y;
//函数声明
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc);

(2)主函数

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR     lpCmdLine, int       nCmdShow)
{
 	// TODO: Place code here.
	MSG msg;
	HACCEL hAccelTable;

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_MYANIMATION, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MYANIMATION);

	// Main message loop:
	GetMessage(&msg,NULL,NULL,NULL);  //初始化msg
    while( msg.message!=WM_QUIT )
    {
        if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
		else
        {
            tNow = GetTickCount();
            if(tNow-tPre >= 100)
                MyPaint(hdc);
        }
	}
	return msg.wParam;
}

(3)窗口类函数

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_MYANIMATION);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= (LPCSTR)IDC_MYANIMATION;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

	return RegisterClassEx(&wcex);
}

(4)初始化函数

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	char filename[20] = "";
	HBITMAP	bmp;
	hInst = hInstance;

	hWnd = CreateWindow("MyAnimation", "动画显示", WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

	if (!hWnd)
	{
		return FALSE;
	}

	MoveWindow(hWnd , 10 , 10 , 968 ,605 , true);
	ShowWindow(hWnd , nCmdShow);
	UpdateWindow(hWnd);

	hdc = GetDC(hWnd); //获得窗口句柄
	mdc = CreateCompatibleDC(hdc);
	bufdc = CreateCompatibleDC(hdc);

	bmp = CreateCompatibleBitmap(hdc , 968 , 605);
	SelectObject(mdc , bmp);

	walker = (HBITMAP)LoadImage(NULL , "1.bmp" , IMAGE_BITMAP , 968 , 258 ,LR_LOADFROMFILE);
	bg = (HBITMAP)LoadImage(NULL , "res.bmp" , IMAGE_BITMAP ,  968 ,605 , LR_LOADFROMFILE);

	num = 0 ;
	x = 968 ;
	y = 300 ;

	MyPaint(hdc);

	return TRUE;
}

(5)自定义绘图函数

void  MyPaint (HDC hdc)
{
	if (num  == 8)
	{
		num = 0 ;
	}

	//在mdc上贴背景图
	SelectObject(bufdc , bg);
	BitBlt(mdc , 0 , 0 , 968 , 605 , bufdc , 0 , 0 ,SRCCOPY);

	//在mdc上进行透明处理
	SelectObject(bufdc , walker);
	BitBlt(mdc , x , y ,121 , 129 ,bufdc , num*121 , 129 , SRCAND);
	BitBlt(mdc ,x, y , 121, 129 , bufdc , num*121 , 0 , SRCPAINT);

	//将最后的画面显示在窗口上
	BitBlt(hdc , 0 ,0 ,968 ,605 ,mdc , 0 , 0 ,SRCCOPY);

	tPre = GetTickCount();
	num++;

	x += 20 ;
	if (x >= 968)
	{
		x=0;
	}
}

(6)运行效果

笔记四就写到这里,欢迎大家发邮件和我交流编程经验,同样也希望能够多认识一些志同道合的朋友。

---end

本笔记代码已上传,欢迎下载::【Visual C++】游戏编程学习笔记四配套代码

【Visual C++】游戏编程学习笔记之四:透明动画实现的更多相关文章

  1. 【Visual C++】游戏编程学习笔记之六:多背景循环动画

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44264153 作者:ZeeCod ...

  2. 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

  3. 【Visual C++】游戏编程学习笔记之七:键盘输入消息

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

  4. DirectX 11游戏编程学习笔记之6: 第5章The Rendering Pipeline(渲染管线)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  5. DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  6. 【Visual C++】游戏编程学习笔记之一:五毛钱特效之透明和半透明处理

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44163799 作者:ZeeCod ...

  7. 【Visual C++】游戏编程学习笔记之五:单一背景滚动

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...

  8. 【Visual C++】游戏编程学习笔记之九:回合制游戏demo(剑侠客VS巡游天神)

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...

  9. 【Visual C++】游戏编程学习笔记之三:游戏循环的使用

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...

随机推荐

  1. Android输入事件详解

    输入事件 在 Android 系统中,从用户与应用的交互中截获事件的方法不止一种.如考虑截获用户界面内的事件,则可从用户与之交互的特定视图对象中捕获事件. 为此,View 类提供了多种方法. 在您将用 ...

  2. Android图表库MPAndroidChart(三)——双重轴线形图的实现,这次就so easy了

    Android图表库MPAndroidChart(三)--双重轴线形图的实现,这次就so easy了 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库 ...

  3. 【伯乐在线】100个高质量Java开发者博客

    本文由 ImportNew - 夏千林 翻译自 programcreek.欢迎加入翻译小组.转载请见文末要求. ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博 ...

  4. Redis集群教程(Redis cluster tutorial)

    本博文翻译自Redis官网:http://redis.io/topics/cluster-tutorial        本文档以温和的方式介绍Redis集群,不使用复杂的方式来理解分布式系统的概念. ...

  5. Android动态换肤(二、apk免安装插件方式)

    在上一篇文章Android动态换肤(一.应用内置多套皮肤)中,我们了解到,动态换肤无非就是调用view的setBackgroundResource(R.drawable.id)等方法设置控件的背景或者 ...

  6. iOS中监控软键盘显示或隐藏的可靠方法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 如果你试图在软键盘的显示或隐藏时去改变的UI界面结构,仅有的方 ...

  7. JQuery之事件处理

    JQuery不支持捕获模型 冒泡模型解析 <body> <div> <input id="bntShow" type="button&quo ...

  8. 剑指Offer——动态规划算法

    剑指Offer--动态规划算法 什么是动态规划? 和分治法一样,动态规划(dynamic programming)是通过组合子问题而解决整个问题的解. 分治法是将问题划分成一些独立的子问题,递归地求解 ...

  9. 学习TensorFlow,多层卷积神经网络

    一.网络结构 二.代码 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_ ...

  10. UNIX网络编程——TCP连接的建立和断开、滑动窗口

    一.TCP段格式: TCP的段格式如下图所示: 源端口号与目的端口号:源端口号和目的端口号,加上IP首部的源IP地址和目的IP地址唯一确定一个TCP连接. 序号:序号表示在这个报文段中的第一个数据字节 ...