版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学习情境学习情境7 7 手机游戏制作技巧的提升手机游戏制作技巧的提升能力目标v 掌握图片过渡特效的处理方法;v 熟练掌握手机游戏中动画制作的三种方法;v 能在游戏中利用简单的人工智能丰富游戏效果;v 掌握使用定时器完成需要自动处理的游戏效果;v 能处理来电暂停和恢复;v 能实现手机游戏中文字的自动折行和滚屏效果;v 能利用WMA接收和发送短消息,并实现手机游戏的收费功能。认知目标 v 了解ARGB色彩空间,并识记drawRGB()方法和getRGB()方法的使用方法;v 熟记Sprite类中的setFrameSequence()、nextFrame()、prevFrame()getFrameS
2、quence()、和getFrame()方法的作用和使用方法;v 了解手机游戏中的人工智能;v 熟练掌握Timer类和TimerTask类配合使用的方法;v 了解showNotify()和hideNotify()事件处理方法;v 了解使用WMA接收和发送短消息。7.1 学习情景描述 在前面六个学习情境中,完成了在J2ME中制作手机游戏的基本环节。在掌握了制作手机游戏的基本技能之后,还需要进一步拓展,学习一些制作技巧和方法,培养解决实际问题的能力。本学习情境将在前面六个学习情境的基础之上,进行手机游戏制作技巧的进一步提升。本学习情境分为五个学习单元来完成。单元一,图片过渡效果的处理;单元二,手机
3、游戏中常用的动画制作方法;单元三,手机游戏中的人工智能;单元四,使用Canvas对象的显示和隐藏事件;单元五,设置手机游戏的收费点。7.2 图片过渡效果的处理 当有若干张图片需要连续显示时,为了丰富游戏者的视觉效果,通常会设置图片间的“切换”,或者叫做“过渡”的效果。比如:“渐显”效果、“淡入淡出”效果、“百叶窗”效果等等。在J2ME中,这些过渡效果通常是通过设置剪切区域、绘制图片,并在线程中改变剪切区域的起始位置、宽度和高度的方法来实现的。 本学习单元的主要任务:首先,实现简单的图片“移入”效果。然后,通过设置一个剪切区域,实现“渐显”效果。第三,通过在一个线程周期中设置多个剪切区域,来实现
4、“百叶窗”效果。第四,通过在不同的线程周期中,在不同的位置设置剪切区域,来实现“块状”过渡的效果。最后,实现透明度渐变的“淡入淡出”效果。7.2.2 任务一:实现图片的“移入”效果 img2_x = screenWidth;img2_y = -img2.getHeight();g.drawImage(img2, img2_x, img2_y, 0);img2_x -= 8;img2_y += 11;if (img2_x 0) img2_x = 0; img2_y = 0; / 进入下一个界面要点提示 图片移入效果的实现要点是,首先,确定图片的初始位置,然后,在每一个线程周期中,改变图片的位置。
5、 根据这个原理,可以举一反三,实现图片从屏幕的各个方向“移入”的效果。7.2.3 任务二:实现“渐显”效果 所谓图片的“渐显”效果,实际上就是使图片从上到下,或者从左到右,或者从中心扩展等各种方法,逐渐显示出来的过程。clip_x = screenWidth / 2;clip_y = screenHeight / 2;clip_w = 0;clip_h = 0;g.setClip(clip_x, clip_y, clip_w, clip_h);g.drawImage(img2, 0, 0, 0);clip_x -= 2;clip_y -= 2;clip_w += 4;clip_h += 4;要
6、点提示 “渐显”效果的实现要点是,在绘制第二张图片之前,先设置一个剪切区域。然后,在每个线程周期中改变这个剪切区域的位置和大小。 显然,仿照这个思路,很容易实现从左到右、从上到下、从四个角对拉等等的“渐显”效果。与从中心扩展的效果相比,在这些效果中,剪切区域的位置可以是固定不变的,仅仅改变剪切区域的宽度和高度就可以。 7.2.4 任务三:实现“百叶窗” 效果 clip_w=0;for (int i = 0; i 20) / 进入下一个界面要点提示 实现“百叶窗”过渡效果的原理是,在一个线程周期中,在屏幕上均匀地设置多个纵向或者横向的剪切区域。然后,在线程中同时增加这些剪切区域的宽度或者高度,直
7、到这些剪切区域相互连接上,完全显示出第二张图片。比如,在本任务中,使用循环在一个线程周期中,同时设置了screenWidth / 20个剪切区域。也就是说,每个剪切区域的最终宽度为20,而高度始终为screenHeight。 如果让剪切区域的宽度为screenWidth,而高度从0开始变化,那么实现的就是横向“百叶窗”效果。如果剪切区域的宽度和高度都在变化,那么实现的就是的格子状过渡效果。7.2.5 任务四:实现“块状” 过渡效果 clip_x=0;g.setClip(clip_x % 4) * 60, (clip_x / 4) * 80, 60, 80); / 设置60*80大小的16个剪切
8、区域g.drawImage(img2, 0, 0, 0);clip_x+;if (clip_x 16) / 进入下一个界面要点提示 “块状”过渡效果的实现原理是,首先,将屏幕划分成若干个大小相同的区域(块),然后,在线程周期中,从上到下、从左到右地每次新增一个和“块”一样大小的剪切区域。 比如,在本任务中,将屏幕划分成了6080大小的16个区域。在每个线程周期中,从左到右、从上到下地新增一个剪切区域,剪切区域的左上角坐标为((clip_x % 4) * 60, (clip_x / 4) * 80)。实现的效果就像是将第一张图片一块一块地掀开,逐渐显示出第二张图片。 7.2.6 延伸任务:实现“
9、淡入淡出”效果 “淡入淡出”效果跟图片颜色的透明度相关,实际上就是图片透明度渐变的效果。知识提炼:颜色的透明度 drawRGB()方法用于绘制带透明度的颜色,语法如下:public void drawRGB(int rgbData, int offset, int scanlength, int x, int y, int width, int height, boolean processAlpha)参数说明:rgbData:以0XAARRGGBB格式存储ARGB图象的数组。offset:绘制的第一个图象数据在rgbData数组中的索引号。scanlength:绘制图象每行数据的个数。x,
10、y:绘制图象区域左上角坐标。width, height:绘制图象区域的宽度和高度。processAlpha:用于控制是否处理透明度。取值为true时,处理透明度,即完全按照rgbData中的数据来绘制图象;取值为false时,不处理透明度,即不管rgbData中数据的透明度部分如何取值,只处理RGB部分,绘制出的图象是完全不透明的。 透明度(Alpha)是指背景颜色可见的程度。RGB色彩空间其实质应该是ARGB色彩空间,每一个像素点的颜色由一个32位的整数来表示。如图所示。 透明度取值为0X00时,为全透明状态,即背景色完全显示出来,而前景色完全看不见。透明度取值为0XFF时,为全不透明状态,
11、即背景色完全显示不出来,只有前景色能看见。 Image对象上定义的getRGB()方法用来获取图像中一个指定的矩形区域的ARGB数据值, getRGB()方法的语法如下:public void getRGB(int rgbData, int offset, int scanlength, int x, int y, int width, int height )参数说明:rgbData:以0XAARRGGBB格式存储ARGB图象的数组。offset:存储的第一个图象数据在rgbData数组中的索引号。scanlength:存储图象每行数据的个数。x, y:存储图象区域左上角坐标。width,
12、height:存储图象区域的宽度和高度。透明度(A)红(R)绿(G)蓝(B)7.3 手机游戏中常用的动画制作方法 动画是基于人的“视觉后像”原理来实现的。所谓“视觉后像”指的是当光刺激物(比如图像)消失后,在短暂的时间内仍然会在人的头脑中留下印象。这样,如果在屏幕上连续地绘制一系列静态的图像,并且在绘制后一张图像之前,先从屏幕上擦除前一张图像,就会产生动画的效果。每个单幅的静态图像被称为帧。 本学习单元的主要任务:首先,通过在不同的时间和不同的地点连续、循环地显示保存在图像数组中的一组静态图像来实现动画。然后,利用setClip()和drawImage()方法实现动画。最后,利用MIDPv2.
13、0中提供的Sprite类,显示一帧或多帧的连续图像。 7.3.2 任务五:使用图像数组实现动画 在本任务中,将通过在不同的时间和不同的地点连续、循环地显示保存在图像数组中的一组静态图像来实现动画。 本任务实现的效果是小人沿着四边形区域的四条边不停地走动。7.3.3 任务六:利用setClip()和drawImage()方法实现动画 在本任务中,首先利用setClip()方法在屏幕上指定一个绘制区域,然后再利用drawImage()方法显示图片中的某个小人。 要点提示 setClip()方法指定了一个绘制的区域,在绘制过程中,屏幕上只有落在该区域中的图像改变才被显示出来,而其他区域则不受影响。这
14、个绘制区域的大小就是图像帧的大小,即3248,但由于小人的位置在不断地改变,因此绘制区域的起点坐标也需要不断地改变。 (clip_x,clip_y)(img_x,img_y)7.3.4 任务七:利用Sprite对象播放动画 在MIDPv2.0中,提供了一个用于支持绘制动画的Sprite类。利用它可以显示一帧或多帧的连续图像。当然,所有的帧都必须是相同大小的,并且由一个Image对象提供。Sprite类可以循环显示每一帧图像,还可以指定图像帧的任意组合。在本任务中,将利用Sprite类实现和任务三、任务四同样的动画效果。要点提示 在新建一个Sprite精灵类实例后,会自动生成一个按所有可用图像帧
15、的顺序排列的动画播放帧序列。而在实际构成动画时,开发人员可以根据需要调用其中部分图像帧,并可以按任意顺序排列图像帧,图像帧可以被重复、忽略或者以相反的顺序显示,从而形成不同的动画效果。 Sprite类的setFrameSequence()方法用来明确设置动画播放帧序列。语法如下:public void setFrameSequence(int sequence) 在确定了动画播放帧序列后,还需要通过调用nextFrame()或者prevFrame()方法来依次切换当前需要播放的图象帧。最后,通过paint()方法逐个绘制出动画播放帧序列中的图像帧。另外,Sprite类的getFrameSque
16、nce()方法可以获取构成动画播放序列的图像帧个数。getFrame()方法用于获取动画播放序列中当前正在播放的图像帧索引号。7.4 手机游戏中的人工智能 人工智能,简称AI(Artificial Intelligence)。是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。人工智能研究的一个主要目标就是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。 在游戏领域,一说起人工智能就会让人立刻想到两种游戏:一是策略类游戏,二是棋弈类游戏。策略类游戏中,玩家运用策略与计算机或其他玩家较量,以取得游戏的胜利。而在棋弈类游戏中,游戏的主体通常就是一个大的AI算法
17、。 在手机游戏中,最简单、最常用的人工智能有以下两种: 一是随机数的使用。比如打老鼠游戏,一共有9个或16个洞,老鼠会随机出现在某个洞里,好像在故意躲避玩家的打击。使用随机数是手机游戏中最简单的人工智能。 二是规则导向或称之为条件导向。游戏设计者将游戏中的规则与设定转化成一个个的条件,然后在程序中通过对这些条件的判断,以决定下一步的行为。比如,在追逐的设计中,如果捕食者的x坐标大于猎物,捕食者的x坐标就减小,以移动靠近猎物。相反如果捕食者的x坐标小于猎物,捕食者的x的坐标就增大。在y轴上也需做相似的处理。而逃避的设计实质上就是追逐的逆运算。 7.4.2 任务八:实现炮台子弹对飞机的跟踪射击 在
18、本任务中,飞机可以由玩家通过上、下、左、右方向键实现在屏幕上的移动。位于屏幕中间的炮台有八个发射管,如图7-9所示。炮台会根据飞机的实时位置,分别从上中、右上、右中、右下、下中、左下、左中、左上八个方向发射子弹,实现对飞机的跟踪射击。上中右上右中右下下中左下左中左上要点提示 程序中使用了一个向量vecPaotaiBullet来保存炮台子弹。每颗子弹使用一个一维数组装载,有三个元素,分别用于装载:x坐标、y坐标和方向。每颗子弹的x坐标和y坐标的初始值都是一样的,即都为炮台的坐标位置。 移动炮台子弹的方法是:首先,将炮台子弹从向量中取出。然后,根据 tem2的值(即子弹的方向)分别给tmp0(x方
19、向)或tmp1(y方向)加、减一个位移量。 由于tmp0和tmp1中保存的是炮台的位置,因此在绘制炮台子弹时需要根据子弹的方向确定出子弹的x位置和y位置,然后再通过drawImage()方法实现绘制。 7.4.3 延伸任务: 使用定时器Timer实现对炮台子弹的控制 从任务六的运行效果可以看到,炮台的子弹过于密集,几乎连成了一条线,显得很不真实。原因是炮台子弹的创建、移动和绘制都放在了同一个主线程中,使得这三个动作的频率是一样的。如果让子弹的创建慢一些,即向量中的子弹少一些,而子弹的移动快一些,那么就可以达到比较良好的效果。知识提炼:Timer类和TimerTask类 这两个类配合使用的方法为
20、:首先,声明一个Timer类的对象。然后,定义一个TimerTask类的子类,并实现run()方法。或者定义一个TimerTask类的对象,在定义体内直接实现run() 方法。最后,调用Timer类中定义的schedule方法,该方法会自动调用run方法,以控制并完成任务的执行。 Timer类中定义的schedule方法有四种形式,语法如下:public void schedule(TimerTask task, long delay)public void schedule(TimerTask task, Date time) public void schedule(TimerTask t
21、ask, long delay, long period)public void schedule(TimerTask task, Date time, long period)参数说明:task:TimerTask类的对象,即需要控制并完成的任务。delay:在任务执行之前的延迟时间,单位ms。time:执行任务的时间点,如果指定时间已过,则任务立即执行。period:任务执行的时间间隔,单位ms。 一个定时器可以同时控制多个任务的执行,比如,在本任务中同时控制了创建子弹和移动子弹两个任务。 定时器实际上也是以线程的方式实现的,但定时器线程的优先级比普通线程的优先级要低得多,他并不提供实时保
22、证,如果系统繁忙会导致不能按时执行任务。所以对实时性要求高的任务,比如屏幕的绘制,就不能使用定时器来完成。 7.5 使用Canvas对象的显示和隐藏事件 多任务处理是手机的基本特征。通信、游戏、工作数据的访问、日历管理等等使用的都是同一个设备手机。当用户在游戏过程中,有电话呼入或者收到短信时,需要保存当前的状态,即需要进行暂停挂起处理。当用户处理完毕后,需要精确恢复游戏原来的状态,即进行恢复处理。暂停挂起和恢复处理是每一个商用程序必须要处理的问题。 本单元的主要任务:首先,利用Canvas类中提供的两个事件处理方法实现来电暂停和恢复处理。然后,综合利用showNotify()方法和定时器实现文
23、本的自动折行和滚动效果。7.5.1 知识准备: 了解showNotify()和hideNotify()事件处理方法 Canvas类中提供了两个事件处理方法:showNotify()和hideNotify()。他们的实现体默认是空的,Canvas类的子类可以重载这两个方法。 showNotify()方法是在Canvas对象显示在屏幕之前被MIDP调用,而hideNotify()方法则是在Canvas对象消失之后被调用。因此,通常在showNotify()事件处理方法中实现重新初始化一些内容,比如设置动画、启动定时器等等。而在hideNotify()事件处理方法中可以进行一些垃圾回收等操作。 7.
24、5.3 任务九:来电暂停和恢复处理 多任务处理是手机的基本特征。通信、游戏、工作数据的访问、日历管理等等使用的都是同一个设备手机。当用户在游戏过程中,有电话呼入或者收到短信时,需要保存当前的状态,即需要进行暂停挂起处理。当用户处理完毕后,需要精确恢复游戏原来的状态,即进行恢复处理。暂停挂起和恢复处理是每一个商用程序必须要处理的问题。 如果在游戏中已经通过代码实现了对游戏的暂停和继续操作,那么来电暂停和恢复处理就非常简单了。 只需要在程序的最后,加上showNotify()或者hideNotify()事件处理方法,并在方法体中,设置变量pause的值为true即可。代码如下:protected
25、void showNotifyshowNotify() pause = true;protected void hideNotifyhideNotify() pause = true;7.5.4 延伸任务:实现文字的自动折行和滚动效果 在Nokia N70上的测试效果 在Nokia N73上的测试效果要点提示 本任务综合利用了showNotify()方法和定时器实现文本的自动折行和滚动效果。 Canvas对象在屏幕上出现之前,就会触发调用showNotify()方法,使得定时器被启动,文本开始滚动。 在本任务中,是通过定义一个TimerTask类的子类,并实现run()方法来实现任务的定制和控
26、制的。请注意体会和7.4.3节中的区别。7.6 设置手机游戏的收费点 在我国大多数的手机网络游戏运营商都是通过SMS和WAP代收费的方式来进行支付。虽然电信运营商在某种程度上对此做法有所规定,但这种方式对于玩家来说确实非常方便,通过发送短信或者定制WAP页面的操作非常简单,甚至在游戏过程中就可以操作。比如:当闪屏和菜单过后,进入游戏前,出现一个交费提示界面,提示用户是否“购买”。在游戏过程中,还可以在以下这些环节设置收费点。 比如在战争类游戏中,对武器的选择可以实现收费,攻击力越大的武器收费越高; 使用道具收费; 在过关游戏中,可以对每一关实现单独收费; 游戏失败后,提供续费的环节,续费后,可
27、以继续游戏; 手机游戏的交费过程通常是以短信的形式完成的。如果在交费和续费的提示界面中,按下“购买”或“是”,就会向事先设置好的收费平台发送一条短信。平台收到短信后,就从手机话费中扣除约定的费用。本学习单元的主要任务:利用WMA实现手机游戏的收费功能。7.6.2 知识准备:了解使用WMA接收和发送短消息 Wireless Messaging API属于J2ME体系中的一个可选包(Optional Package),通常简称为WMA。应用WMA,意味着可以使用移动设备通过各种无线网络(比如:GSM、CDMA)发送和接收短消息。WMA还支持ShortMessage Service (SMS,短信息
28、服务)和 Cell Broadcast Short Message Service (CBS)。WMA在javax.wireless.messaging包中定义了一套全新的接口,用于接收和发送短消息。7.6.3 任务十:实现手机游戏的收费功能 手机游戏常见的收费方式主要有单次下载收费、包月收费,如果是单机游戏运营商一般是通过单次下载收费的方式来运营的,而联网游戏产品一般是通过包月收费的方法。 在我国大多数的手机网络游戏运营商都是通过SMS和WAP代收费的方式来进行支付。虽然电信运营商在某种程度上对此做法有所规定,但这种方式对于玩家来说确实非常方便,通过发送短信或者定制WAP页面的操作非常简单,
29、甚至在游戏过程中就可以操作。比如:当闪屏和菜单过后,进入游戏前,出现一个交费提示界面,提示用户是否“购买”,如果用户点击“是”或“购买”,则进入游戏。 在游戏过程中,还可以在以下这些环节设置收费点。比如在战争类游戏中,对武器的选择可以实现收费,攻击力越大的武器收费越高;使用道具收费;在过关游戏中,可以对每一关实现单独收费;游戏失败后,提供续费的环节,续费后,可以继续游戏;1. 手机游戏的交费过程通常是以短信的形式展开的。如果在交费和续费的提示界面中,按下“购买”或“是”,就会向事先设置好的收费平台发送一条短信。平台收到短信后,就从手机话费中扣除约定的费用。 收费提示界面和收费成功界面 要点提示
30、 SMSUtil.java类主要完成和信息台的通讯,以发送短消息的形式,实现游戏的收费功能。 代码中假设10086是事先设定好的收费平台的号码,使用的是sms协议。发送的短信内容设定为“ye”,这是10086用于查询话费余额的。这么设定的目的是测试短信发送是否成功。如果发送成功,则10086马上会返回一条短信,显示查询的话费余额。在实际应用中,可以根据需要修改相关内容。 程序中,在设定好的收费点处,调用SMSUtil.java类中定义的sendSMS()方法,然后根据成员变量judge的值来决定是否继续游戏。如果judge变量的值为true,则表示游戏者同意交费或续费,游戏继续进行。本章小结
31、1/41. 图片过渡效果的处理。“渐显”过渡效果是通过逐渐增加剪切区域的宽度和高度来实现的。“淡入淡出”过渡效果就是图片透明度渐变的过程。“百叶窗”和“块状”过渡效果就是将整个屏幕“分割”成若干个纵向或横向的“叶片”或者“块”,并设置显示这些“叶片”或者“块”的剪切区域,然后,在线程中控制并改变剪切区域的起始位置以及“叶片”的宽度或者高度。2. 透明度(Alpha)是指背景颜色可见的程度。RGB色彩空间其实质应该是ARGB色彩空间,每一个像素点的颜色由一个32位的整数来表示。透明度取值为0X00时,为全透明状态,。透明度取值为0XFF时,为全不透明状态。3. Graphics类上定义的draw
32、RGB()方法用于绘制带透明度的颜色,getRGB()方法用来获取图像中一个指定的矩形区域的ARGB数据值。本章小结 2/44. 手机游戏中常用的动画制作方法有三种:一是在不同的时间和不同的地点连续、循环地显示保存在图像数组中的一组静态图像来实现动画。二是利用setClip()方法在屏幕上指定一个绘制区域,然后再利用drawImage()方法显示由各独立图像帧合成好的图片中的某个图像帧。三是利用Sprite对象循环显示合成好的图片中的每一帧图像。5. Sprite类的setFrameSequence()方法用来明确设置动画播放帧序列。nextFrame()或者prevFrame()方法可以依次切换当前需要播放的图象帧。通过paint()方法可以逐个绘制出动画播放帧序列中的图像帧。另外,getFrameSquence()方法可以获取构成动画播放序列的图像帧个数。getF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建省泉州市泉港区2025-2026学年中考数学试题仿真试题(一)含解析
- 2026年江苏省大丰区第一共同体3月初三年级第五次调研考试数学试题含解析
- 2026年大学大一(交通运输)交通工程学阶段测试试题及答案
- 城市应急完整方案
- 护理诊断的跨学科合作
- 临床医学教材课件内科学第八篇风湿性疾病第四章成人Still病
- 以习作课《我的心儿怦怦跳》一课为例
- 手术室人文护理的冲突管理
- 手术室人文护理的患者教育
- 青春不“设限”+安全有底线+课件-2025-2026学年高二下学期校园安全专题教育主题班会
- 20万吨-年采矿废石综合回收利用项目环境影响报告书
- 2026贵州安顺关岭恒升村镇银行春季招聘4人考试参考题库及答案解析
- 企业内部福利待遇制度
- 2026年甘肃事业单位联考笔试易考易错模拟试题(共500题)试卷后附参考答案
- 《化工HSE与清洁生产》课件-项目6 危险化学品
- 2026年六安职业技术学院单招职业适应性考试题库含答案详解(考试直接用)
- 运输企业物流标准化管理制度
- 2026年《禁毒法》知识测试题及答案(全优)
- 2026陕煤集团榆林化学有限责任公司招聘(162人)笔试模拟试题及答案解析
- 人工智能与文学创作的未来
- 【544】人际心理治疗(IPT)
评论
0/150
提交评论