ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:38.14KB ,
资源ID:30403949      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30403949.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(71游戏动画II.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

71游戏动画II.docx

1、71游戏动画II一、帧动画前面的精灵类中缺少一个功能,即精灵不能改变其外观。例如,在Battle Office游戏中,如果跑动的同事的腿是摆动的,会给人一种更真实的印象。帧动画的基本工作原理是什么?回顾一下,没有帧动画的基本精灵使用一个单独的位图图像来表现其外观。在绘制精灵时,就是绘制位图图像。而使用帧动画的精灵使用一系列位图来表现精灵的多个外观。可以将这一系列图像看作是传统的电影放映机上的一卷胶片。帧动画的错觉是通过循环播放胶片上的图像实现的。另外一个与帧动画有关的问题是控制循环播放帧图像的速度,因此需要有一种方法来确定时间延迟,控制改变帧的速度。二、设计动画精灵首先需要设计它的位图图像。有

2、各种不同的方法来存储动画精灵的一系列图像,但是最容易的是在一个单独的图像中垂直存储帧图像。然后编写精灵类的绘图代码保证只绘制代表当前帧的帧图像。有了动画精灵图像之后,还需要记录精灵的当前帧索引和最大帧数。同时,为了控制循环播放帧图像的速度,还需要一个帧延迟数据,该数据决定了在更改帧图像之前必须经历多少个游戏周期。为了实现动画精灵的帧延迟特性,必须使用一个触发器(计数器),它将这个延迟向下计数,指出在什么时候移动到下一帧。因此,最初开始动画精灵时,将触发器设置为帧延迟,然后随着每一个游戏周期开始向下计数,当触发器到达0时,精灵移动到下一帧并再次将触发器重置为帧延迟。总结一下,除了包含垂直放置的帧

3、图像的位图图像之外,新的动画精灵还需要以下信息:1、总帧数2、当前帧索引3、帧延迟4、帧触发器三、为游戏添加动画精灵支持第一步:更改Bitmap类,添加绘制部分位图的功能。/对动画帧的支持void Bitmap:DrawPart(HDC hDC, int x, int y, int xPart, int yPart,int wPart, int hPart, bool bTrans, COLORREF crTransColor) if (m_hBitmap != NULL) HDC hMemDC = CreateCompatibleDC(hDC); HBITMAP hOldBitmap = (

4、HBITMAP)SelectObject(hMemDC, m_hBitmap); if(!bTrans) BitBlt(hDC, x, y, wPart, hPart, hMemDC, xPart, yPart, SRCCOPY); else TransparentBlt(hDC, x, y, wPart, hPart, hMemDC, xPart, yPart, wPart, hPart, crTransColor); SelectObject(hMemDC, hOldBitmap); DeleteDC(hMemDC); void Bitmap:Draw(HDC hDC, int x, in

5、t y, bool bTrans, COLORREF crTransColor)DrawPart(hDC, x, y, 0,0,GetWidth(), GetHeight(), bTrans, crTransColor); /修改Draw方法第二步:修改Sprite类,提供对帧动画的支持/添加精灵动画支持变量,并在构造函数中初始化 int m_iNumFrames, m_iCurFrame; int m_iFrameDelay, m_iFrameTrigger;Sprite:Sprite(Bitmap* pBitmap) /增加动画帧初始化代码 m_iNumFrames = 1; m_iCur

6、Frame = m_iFrameDelay = m_iFrameTrigger = 0;/添加精灵动画支持(修改计算帧高度函数,同时也适用于无动画帧的精灵) int GetHeight() return (m_pBitmap-GetHeight() / m_iNumFrames); ;/添加精灵动画支持(要想将一个普通精灵转换为一个帧动画精灵,只需设置帧数以及帧延迟即可) void SetNumFrames(int iNumFrames); void SetFrameDelay(int iFrameDelay) m_iFrameDelay = iFrameDelay; ; void Updat

7、eFrame();inline void Sprite:UpdateFrame() /由Update方法调用 if (m_iFrameDelay = 0) & (-m_iFrameTrigger = m_iNumFrames) m_iCurFrame = 0; /添加精灵动画支持/*注意:因为图像现在包括了多帧,不再使用完整的图像大小,所以必须重新计算精灵位置*/inline void Sprite:SetNumFrames(int iNumFrames) m_iNumFrames = iNumFrames; /设置帧数 /重新计算位置 RECT rect = GetPosition(); r

8、ect.bottom = rect.top + (rect.bottom - rect.top) / iNumFrames); SetPosition(rect);/SPRITEACTION Sprite:Update()/完成精灵移动和碰撞检测 UpdateFrame();/更新帧 /修改以支持帧动画void Sprite:Draw(HDC hDC) / Draw the sprite if it isnt hidden if (m_pBitmap != NULL & !m_bHidden) if(m_iNumFrames = 1) m_pBitmap-Draw(hDC, m_rcPosit

9、ion.left, m_rcPosition.top, TRUE, RGB(255,0,255); else m_pBitmap-DrawPart(hDC, m_rcPosition.left, m_rcPosition.top, 0, m_iCurFrame*GetHeight(), GetWidth(), GetHeight(), true, RGB(255,0,255); 举例:Battle Office2rcBounds.left = 340; g_pGuySprites3 = new Sprite(g_pGuyBitmaps3, rcBounds, BA_WRAP); /这里没有设置

10、帧延迟,意味着它将以最快的速度循环显示各个帧 g_pGuySprites3-SetNumFrames(4); g_pGuySprites3-SetPosition(500, 10); g_pGuySprites3-SetVelocity(-3, 0); g_pGuySprites3-SetZOrder(1); g_pGuySprites3-SetHidden(TRUE); AddSprite(g_pGuySprites3); rcBounds.left = 385; g_pGuySprites4 = new Sprite(g_pGuyBitmaps4, rcBounds, BA_WRAP);

11、g_pGuySprites4-SetNumFrames(4); g_pGuySprites4-SetFrameDelay(5); g_pGuySprites4-SetPosition(260, 60); g_pGuySprites4-SetVelocity(5, 0); g_pGuySprites4-SetZOrder(1); g_pGuySprites4-SetHidden(TRUE); AddSprite(g_pGuySprites4);四、地图类1、游戏背景的类型(1)纯色背景(2)图像背景(3)动画背景(4)滚动背景(1)纯色背景纯色背景是只有一种纯色的背景。它是所有背景中最单调的一种

12、,在游戏中较少使用。总的来说,在能够使用纯色背景的任何时候都可以使用一个图像背景,从而获得好得多的效果。例如开发一个足球游戏,创建一个纯绿色背景来表示球场上的草或许是可以的,不过,在同样的情况下使用一个带草状纹理的图像看起来会好得多,并且也不需要更多的开发工作。补充:纯色背景很有用的一种情况是在测试游戏时。例如,如果有一个包含复杂背景图像的游戏,精灵很容易混在一起,这时在一个简单背景上查看它们会更容易调整这些精灵。通过使用一个对比度强的纯色背景来临时替换背景图像,就可以很容易地了解精灵的情况并修改它们存在的问题。(2)图像背景使用一个位图图像来代表游戏的背景。使用图像背景的主要工作是创建图像本

13、身。从编程的角度来看,游戏引擎中的Bitmap类已经处理了使用图像背景的大多数工作。使用图像位图的问题在于,它是静态的,不能移动,缺乏真实感。(3)动画背景动画背景是随着时间以某种方式改变其外观的背景,这有一点类似于动画精灵。不过,动画背景不一定涉及一系列帧图像。创建通过自定义代码实现动画效果的动画背景是完全可能的。实现动画背景的关键是提供某种机制来更新和绘制背景。这类似于精灵,也必须定期更新,以便传达一种运动的感觉。注意:尽管动画背景与动画精灵相似,但是背景通常比精灵图像大得多。因此,对背景使用一系列帧图像会消耗大量内存,特别是在考虑到背景的宽度和高度通常达数百像素时。专注于考虑一些有趣并且

14、更有效的方法来实现动画背景会更好。创建动画背景的另一种方法是使用几个更小的图像,它们能够在背景上四处移动。例如,如果希望增强布满星星的背景,那么完全可以在远处添加一些行星,它们时常稍微改变其外观,这就实现了背景动画。对于应该将这些行星创建为精灵还是创建为背景的一部分,目前还存在一些争论。(4)滚动背景滚动背景就是一个图像或者一组图形对象在屏幕上飘动或者滚动。理解滚动背景的最佳方式是想像一个比游戏屏幕大得多的背景,要想查看背景的其他部分,就必须将视图滚动到另一部分。(如上图所示)上图显示了游戏屏幕只显示了一个更大背景的一部分。这种背景在冒险游戏中用得非常多,在这种游戏中,玩家控制一个角色在很大的

15、虚拟世界中走动。开发滚动背景比开发其他类型的背景复杂得多,这是因为它们涉及多得多的游戏逻辑。例如,背景必须在玩家移动角色时响应,使它们看起来是与背景一起滚动的。不仅如此,滚动背景还经常必须能够环绕,以免角色碰到边界。在2D游戏中经常使用的一种很有趣的滚动背景是视差滚动背景,这是一种以不同滚动速度滚动的背景。视差滚动需要使用多层背景图像,例如前景中的建筑物、中景中的树木以及背景中的山脉。其思想是通过以不同的速度移动各个图像来给人一种深度的错觉。因此,因为山脉离得最远,所以它们的移动是最慢的,树木的移动要快一些,而建筑物的移动是最快的。这模拟了在真实世界中我们经过不同距离的物体时观察到的移动效果。

16、五、为游戏添加背景类1、创建基本背景类Background(包含纯色背景和图像背景)#pragma once#include Bitmap.hclass Backgroundprotected : int m_iWidth, m_iHeight;/背景的宽高 COLORREF m_crColor;/背景的颜色,只适用于纯色背景 Bitmap* m_pBitmap;/用作绘制图像背景的位图图像public: Background(int iWidth, int iHeight, COLORREF crColor); /构造纯色背景 Background(Bitmap* pBitmap); /构造

17、图像背景 virtual Background(); /更新背景的外观,对于纯色背景和图像背景,它不做任何事情 /该函数的目的是使派生的动画背景能够使用它来更新自身 virtual void Update(); virtual void Draw(HDC hDC); int GetWidth()return m_iWidth; int GetHeight()return m_iHeight;/#include Background.hBackground:Background(int iWidth, int iHeight, COLORREF crColor) / Initialize the

18、 member variables m_iWidth = iWidth; m_iHeight = iHeight; m_crColor = crColor; m_pBitmap = NULL;Background:Background(Bitmap* pBitmap) / Initialize the member variables m_crColor = 0; m_pBitmap = pBitmap; m_iWidth = pBitmap-GetWidth(); m_iHeight = pBitmap-GetHeight();Background:Background()/-/ Backg

19、round General Methods/-void Background:Update() / Do nothing since the basic background is not animatedvoid Background:Draw(HDC hDC) / Draw the background if (m_pBitmap != NULL) m_pBitmap-Draw(hDC, 0, 0); else RECT rect = 0, 0, m_iWidth, m_iHeight ; HBRUSH hBrush = CreateSolidBrush(m_crColor); FillR

20、ect(hDC, &rect, hBrush); DeleteObject(hBrush); 2、创建动画背景类StarryBackground/模拟星空的动画背景类class StarryBackground : public Backgroundprotected: int m_iNumStars;/在背景上显示的星星总数 int m_iTwinkleDelay;/星星闪烁频率,延迟越长,闪烁得越慢 POINT m_ptStars100;/星星的位置(最多100颗星星,自己可以适当调整数量) COLORREF m_crStarColors100;/星星的颜色public: StarryBa

21、ckground(int iWidth, int iHeight, int iNumStarts=100, int iTwinkleDelay=50); virtual StarryBackground(); virtual void Update(); virtual void Draw(HDC hDC);/StarryBackground:StarryBackground(int iWidth, int iHeight, int iNumStars, int iTwinkleDelay) : Background(iWidth, iHeight, 0) / Initialize the m

22、ember variables m_iNumStars = min(iNumStars, 100); m_iTwinkleDelay = iTwinkleDelay; / Create the stars for (int i = 0; i iNumStars; i+) m_ptStarsi.x = rand() % iWidth; m_ptStarsi.y = rand() % iHeight; /将各个星星的颜色设置为一个中性颜色,即不太亮也不太暗的灰色 m_crStarColorsi = RGB(128, 128, 128); StarryBackground:StarryBackgro

23、und()/-/ StarryBackground General Methods/-void StarryBackground:Update() /随机更改星星的灰度,使之闪烁 int iRGB; for (int i = 0; i m_iNumStars; i+) if (rand() % m_iTwinkleDelay) = 0) iRGB = rand() % 256; /只要R,G,B3个部分是相同的,星星就是灰色的 /例如RGB(128,128,128)是一个中度灰色。RGB(255,255,255)是一个白色。RGB(0,0,0)是一个黑色。 m_crStarColorsi =

24、RGB(iRGB, iRGB, iRGB); void StarryBackground:Draw(HDC hDC) /绘制纯黑色背景 RECT rect = 0, 0, m_iWidth, m_iHeight ; HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0); FillRect(hDC, &rect, hBrush); DeleteObject(hBrush); / Draw the stars for(int i=0;iSetNumFrames(14); pSprite-SetFrameDelay(1); pSprite-SetPosition(250, 200); pSprite-SetVelocity(-3, 1); AddSprite(pSprite); pSprite = new Sprite(g_pAsteroidBitmap, rcBounds, BA_WRAP); pSprite-SetNumFrames(14); pSprite-SetFrameDelay(2); pSprite-SetPosition(250, 200); pSprite-SetVelocity(3, -2); AddSprite(pSp

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1