《手机应用软件设计与实现》复习资料-李涛

[复制链接]
发表于 2013-1-29 00:00:47 | 显示全部楼层 |阅读模式
课程名称
手机应用软件设计与实现
名称
Java手机游戏设计基础
出版社
清华大学出版社
作者
李涛、杨巨峰、李琳
版次
20111月第1
注:如学员使用其他版本教材,请参考相关知识点
一、客观部分:(单项选择、多项选择、判断)
(一)、单项选择
1Java运行时系统由标准(A)实现
A.C                                     B.C++
C.汇编                               D.机器语言
★考核知识点: Java语言特性,参见P13
附1.1.1(考核知识点解释):
Java编译器是由Java语言实现的,Java运行时系统由标准C实现,这使得Java系统本身也具有可移植性。
2、以下哪项不属于异常事件(D)
A.除0溢出           B.数组越界
C.文件找不到         D.死循环
★考核知识点: 异常处理,参见P21
附1.1.2(考核知识点解释)
异常是在程序运行过程中发生的异常事件,如除0溢出、数组越界、文件找不到等。
3、Java通过面向(B)的方法来处理异常
A.过程              B.对象
C.结构               D.算法和数据结构
★考核知识点: 异常处理,参见P21
附1.1.3(考核知识点解释)
Java通过面向对象的方法来处理异常。在一个方法的运行过程中,如果发生了异常,则这个方法生成代表该异常的一个对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。
4、(C)是Java的核心和本质
A.对象           B.数据结构
C.类              D.算法
★考核知识点: 异常处理,参见P21
附1.1.4(考核知识点解释)
类是Java的核心和本质,是Java语言的基础,因此要掌握Java语言首先要掌握Java的类,类的定义实际上是定义了一种新的数据类型,通过类可以定义这个类类型的对象,因此类是对象的模板,而对象是类的一个实例。
5、(A)主要针对消费类电子设备
A.J2ME           B.J2SE
C.J2EE            D.所有
★考核知识点: J2ME简介,参见P28
附1.1.5(考核知识点解释)
J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂窝电话和可视电话、数字机顶盒、汽车导航系统等等。
6、WTK项目中(D)表示编译后临时生成的类文件
A.bin          B.lib
C.src         D.classes
★考核知识点: WTK项目目录结构,参见P43
附1.1.6(考核知识点解释)
WTK项目目录结构
目录
说明
bin
编译后的文件JAR、JAD和manifest文件
classes
编译后临时生成的类文件
lib
所包含的外部类库文件
res
包含的图片数据声音等外部资源文件
src
程序源文件
tmpclasses
编译后生成的临时目录
tmplib
编译后生成的临时目录存放临时的类库文件
7、在WTK的安装目录结构中(B)表示J2ME开发工具执行文件
A.apps           B.bin
C.lib             D.session
★考核知识点: WTK安装目录结构,参见P45
附1.1.7(考核知识点解释)
WTK安装目录结构
目录
描述
apps
WTK自带的demo程序
bin
J2ME开发工具执行文件
docs
各种帮助与说明文件
lib
J2ME程序库,Jar包与控制文件
session
性能监控保存信息
wtklib
WTK主程序与模拟器
8、Eclipse项目目录中(A)文件中存储项目的源代码目录
A.src                      B.res
C.javaME library           D.Application Descriptor
★考核知识点: Eclipse项目目录,参见P52
附1.1.8(考核知识点解释)
Eclipse项目目录
目录
描述
src
项目的源代码目录
res
项目用到的资源目录
javaME library
用于移动开发的类库
Application Descriptor
项目的属性,双击属性在编辑窗口会显示出这个项目的属性
build.properties
项目编译属性文件,Eclipse会自动管理这个文件
9、要发布当前项目就需要将所有的类进行(C)
A.编辑           B.编译
C.打包           D.执行
★考核知识点: 打包程序,参见P59
附1.1.9(考核知识点解释)
完成程序代码的编译和执行步骤之后,如果要发布当前项目就需要将所有的类进行打包。
10、(A)可以通过编写程序实现任意的绘图
A.Canvas 类             B.Screen类
C.Displayable类        D.GameCanvas类
★考核知识点: 画布与游戏画布,参见P62
附1.1.10(考核知识点解释)
Canvas类称之为画布,和他的名字一样,画布可以通过编写程序实现任意的绘图,由于没有可以复用的界面元素,任何图像都需要重头绘制,因此称之为低级界面。
11、GameCanvas是画布Canvas的子类,是MIDP2.0的一个最主要元素。GameCanvas中(B)方法可以随时查看按键的状态
A.keyPressed           B.getKeyStates
C.getGameAction         D.getDisplay
★考核知识点: 画布与游戏画布,参见P62
附1.1.11(考核知识点解释)
GameCanvas提供了getKeyStates方法,通过这个方法可以随时查看按键的状态,在MIDP1.0当中若要获得按键的状态需要使用keyPressed方法,这个方法在相应时间上会有一定的滞留,游戏是使用者和软件实时交互的过程,如果存在按键响应的滞留,势必会降低游戏的可玩性。
12、为了避免场景的闪烁,MIDP2.0中利用(C)的方式来解决
A.重绘              B.延迟
C.图形缓冲          D.无
★考核知识点: 双缓冲技术,参见P65
附1.1.12(考核知识点解释)
在MIDP1.0中当图像变化的时候经常会出现闪烁的情况,这主要由于一个游戏画面是有众多元素构成的,场景的转变或者图像的重绘,是将所有的元素按照顺序进行重绘,先绘制完成的会预先显示,这样会导致场景的闪烁。为了避免这种情况的产生,在MIDP2.0当中提出了图形缓冲的概念,图形的缓冲是在可视画面以外的地方进行绘制,完成后一次显示在实际画面中。
13、(B)类提供了基础几何图形的绘制的方法。
A.Canvas            B.Graphics
C.Screen            D.Displayable
★考核知识点: 绘制基本图形,参见P66
附1.1.13(考核知识点解释)
Graphics类提供了基础几何图形的绘制的方法,可以绘制字符,图像,线形,矩形等图形。
14、绘制直线可以直接调用Graphics的方法(D)
A.drawRoundRect()         B.drawRect()
C.Arc()                    D.drawLine()
★考核知识点: 绘制基本图形,参见P67
附1.1.14(考核知识点解释)
绘制直线可以直接调用Graphics的方法drawLine()。
使用drawRect()方法可以绘制矩形。
圆角矩形的绘制是利用Graphics提供的方法drawRoundRect。
弧形的绘制可以使用Graphics的方法Arc()来实现。
15、Graphics中对字体的设定是通过Font类来完成的。Font类不能直接实例化得到对象,而是通过(D)方法来获得Font的一个实例
A.getFace()             B.getSize
C.getStyle              D.getFont
★考核知识点: 绘制字符,参见P70
附1.1.15(考核知识点解释)
对字体的设定是通过Font类来完成的。Font类不能直接实例化得到对象,而是通过getFont() 方法来获得Font的一个实例,该方法定义如下:
  getFont(int fontSpecifier)
  getFont(int face, int style, int size)     
使用getFace()方法可以获取外观属性,getSize方法用于获得字体的字号属性,getStyle用于获得字型属性。
16、基于(B)的动画不区分游戏中的角色和背景,统一地把它们看作一幅完整的图片,通过快速变换图片实现动画的效果
A.图像                  B.图片
C.文件                  D.对象
★考核知识点: 动画机制,参见P97
附1.1.16(考核知识点解释)
动画一般可以划分成两种不同的类型:基于图片的动画和基于对象的动画。前者不区分游戏中的角色和背景,统一地把它们看作一幅完整的图片,通过快速变换图片实现动画的效果。这种方式在手机游戏中不太适用,因为连续的图片中通常含有大量不变的信息,这种重复和浪费在有限的手机资源面前是不可接受的。J2ME采用基于对象的动画机制,Sprite类以及定义在其中的各种函数为设计者提供了操纵游戏角色的途径,可以让手机游戏更加真实、高效和有趣。
17、精灵经常用来表示游戏中移动的人或物,检查两个精灵之间是否发生碰撞的函数是(C)
A.setFrameSequence()           B.setPosition()
C.collidesWith()                D.move()
★考核知识点: 精灵之间的碰撞,参见P112
附1.1.17(考核知识点解释)
精灵经常用来表示游戏中移动的人或物,检查两个精灵之间是否发生碰撞的函数是collidesWith ().
利用setFrameSequence()函数可以设定帧显示顺序,这个顺序的不同直接决定了精灵完成怎样的动作。
setPosition()函数和move()函数都可以令精灵移动。
18、(A)类是Screen类的一个子类,代表手机屏幕上的窗体
A.Form              B.Window
C.Font              D.Canvas
★考核知识点: Form,参见P131
附1.1.18(考核知识点解释)
Form类是Screen类的一个子类,代表手机屏幕上的窗体。窗体本身不具备什么实际含义,它的主要功能是存放各种屏幕元件,如图像、只读文字、可编辑文字、列表框等,因此可以将Form视为一个元件的容器。
19、(B)类是Screen的一个子类,负责向玩家显示一些信息并在转向新的界面元素前维持一段时间
A.Form           B.Alert
C.Font           D.Canvas
★考核知识点: Alert,参见P134
附1.1.19(考核知识点解释)
Alert是Screen的另一个子类,负责向玩家显示一些信息并在转向新的界面元素前维持一段时间。Alert对象内部可以包含一个文本对象和一个图像对象,一般来说它显示的信息通常是提醒玩家游戏发生了某些错误或者异常状况。
20、(A)是Item的一个常用子类,用于显示游戏中的进度条
A.Gauge           B.Progress
C.DateField       D.Bar
★考核知识点: Gauge,参见P147
附1.1.20(考核知识点解释)
Gauge是Item的另一个常用子类,用于显示游戏中的进度条。它的本质是将一个整数值用图形的方式表现出来,这个整数值介于0和最大值之间,当前值和最大值都可以被程序控制。
21、J2ME中就提供的一套规范的播放和录制音频或视频接口,即(B)
A.WAV            B.MMAPI
C.MP3            D.Player
★考核知识点: J2ME声音的播放,参见P153
附1.1.21(考核知识点解释)
为了使移动装置能够访问这些不同格式的媒体数据,必需为其设计一个规范化的、强大的、可扩充的应用接口。J2ME中就提供了一套为规范的播放和录制音频或视频接口,即Mobile Media API (MMAPI)。
22、在J2ME的API当中定义了专门用于音乐播放的接口是(C)
A.Control           B.PlayerListener
C.Player            D.Manage
★考核知识点: 播放器Player,参见P153
附1.1.22(考核知识点解释)
在J2ME的API当中定义了专门用于音乐播放的Player接口,Player提供了特殊的方法用于管理播放器的生命周期,控制回放过程等。
23、J2ME中,数据的持久存储和操作都被置于一个专门包内,这个包叫做(D)
A.数据库           B.记录
C.表                D.记录管理系统
★考核知识点: 数据存储,参见P164
附1.1.23(考核知识点解释)
手机游戏中的数据存储在面向记录的数据库中,一个记录文件类似于关系型数据库中的一张表。表由多条记录组合而成,这些记录将持久保存并可供多个MIDlet套件使用。J2ME中,数据的持久存储和操作都被置于一个专门包内,这个包叫做记录管理系统(Record Management System, RMS)。
24、打开一个已经存在的记录文件,需要(C)函数
A.CreateRecordStore            B.DeleteRecordStore
C.openRecordStore              D.UpdateRecordStore
★考核知识点: 打开记录文件,参见P168
附1.1.24(考核知识点解释)
创建一个新的记录文件的同时也就打开了该文件。如果希望打开一个已经存在的记录文件,同样需要使用openRecordStore函数,仅需将其参数createIfNecessary设为false即可。
25、对于那些不再使用的记录应该及时将其删除以节约系统资源,此时可以使用(B)函数
A.addRecord             B.deleteRecord
C.updateRecord         D.openRecord
★考核知识点: 删除记录,参见P180
附1.1.25(考核知识点解释)
对于那些不再使用的记录应该及时将其删除以节约系统资源,此时可以使用deleteRecord函数,该函数的原型如下所示:
Ø        public void deleteRecord(int recordId)
26、(A)是javax.microedition.rms包提供的一个接口,用来监听发生在记录文件上的操作并作出某些响应
A.RecordListener            B.addRecord
C.deleteRecord              D.openRecord
★考核知识点: 监听记录,参见P181
附1.1.26(考核知识点解释)
在一个真实的手机游戏中,常常会频繁地对记录文件进行操作。RecordListener是javax.microedition.rms包提供的一个接口,用来监听发生在记录文件上的操作并作出某些响应。RecordListener包含针对添加记录、更新记录、删除记录3种操作的响应,分别是:
  public void recordAdded(RecordStore recordStore, int recordId)
  public void recordChanged(RecordStore recordStore, int recordId)
  public void recordDeleted(RecordStore recordStore, int recordId)
27、(D)是M3G中定义的一个类,专门用于管理游戏的场景
A.Light                 B.Image2D
C.VertexArray           D.World
★考核知识点: 三维场景的管理,参见P219
附1.1.27(考核知识点解释)
在M3G中定义了一个World类,专门用于管理游戏的场景,例如游戏中的摄像机、模型、光源等等。
28、宽带广域无线网络是实现手机互联的一种技术,下面( C )不是宽带广域无线网
A.LMDS                  B.SCDMA
C.GPRS                  D.WCDMA
★考核知识点: 手机互联技术,参见P194
附1.1.28(考核知识点解释)
实际上,这些实现手机互联的技术可以分为三个类别,它们分别是窄带广域无线网、宽带广域无线网和局域无线网。
窄带广域无线网主要分为HSCSD、GPRS和CDPD等三种。宽带广域无线网主要分为LMDS、SCDMA和WCDMA等三种。
29、关于游戏故事情节的描述错误的是(   )
A.创意或者想象力是设计故事情节的原动力   
B.线性结构的游戏需要管理多个情节序列
C.非线性结构的游戏需要管理多个情节序列   
D.第三人称方式被广泛用于剧本创作或游戏设计
★考核知识点: 游戏故事情节,参见P256
附1.1.29(考核知识点解释)
不管怎样,创意或者想象力都是设计故事情节的原动力。
第三人称方式被广泛用于剧本创作或游戏设计,游戏制作团队可以根据需要选择不同的描述方式,以达到将故事情节紧密融入游戏过程的目标。
创造线性结构的故事提供了很多优点,例如故事要求的内容相对简单,游戏只需要管理一个情节序列即可;玩家不能影响故事情节的发展,不容易出现情节矛盾,减少了出错风险;开发游戏所需要的时间和资金相对更少等等,
非线性结构的故事设计的游戏能够给玩家带来更多体验,更具有耐玩性。例如,在冒险游戏中,不同的通关方式可以给玩家带来不同的经历,例如经验值、装备等,从而获得不同的体验和乐趣。
(二)、多项选择
1、一般地,现代的计算机游戏可以划分成(ABCD)类别
A.运动类游戏               B.益智类游戏
C.角色扮演游戏             D.策略类游戏
★考核知识点: 游戏的分类,参见P2
附1.2.1(考核知识点解释)
一般地,现代的计算机游戏可以划分成以下类别:
1.      运动类游戏
在计算机上模拟各类竞技体育运动的游戏,花样繁多、模拟度高、广受欢迎,如实况足球系列、NBA Live系列、FIFA系列等。实际上,其它很多运动类型,如网球、台球、赛车、冲浪等等也都被制作成了精美的游戏。
2.      动作类游戏
玩家控制游戏人物用各种方式消灭敌人或保存自己以过关的游戏,不刻意追求故事情节,如超级玛丽、真三国无双等。计算机上的动作游戏大多脱胎于早期的街机游戏,设计主旨是面向普通玩家,以纯粹的娱乐休闲为目的。其特点是操作简单、易于上手、紧张刺激,十分依赖玩家的手眼协调能力。
3.      益智类游戏
原意是指用来培养儿童智力的拼图游戏,引申为各类有趣的益智游戏。益智类游戏需要玩家对游戏规则进行思考判断,系统表现相当多样化。由于对游戏操作不需要太高要求,是现在受众面最广的游戏类型之一,总的来说适合休闲,比较经典的代表有俄罗斯方块、泡泡龙、祖玛、连连看(图1-1)等。此外,各种棋牌和文字游戏也可被归为益智类游戏。
4.      即时战略游戏
包含采集、建造、发展等战略元素,同时其战斗以及各种战略元素的进行都采用即时制。代表作有星际争霸、魔兽争霸(图1-2)、帝国时代等。即时战术游戏是它的一种衍生,即各种战略元素不以或不全以即时制进行,或者少量包含战略元素,多以控制一个小队完成任务的方式,突出战术的作用,以盟军敢死队为代表。
5.      角色扮演游戏
由玩家扮演游戏中的一个或数个角色,有完整的故事情节的游戏,特别强调剧情发展和个人体验。代表性游戏包括最终幻想、仙剑奇侠传、暗黑破坏神等。
6.      策略类游戏
玩家运用策略与计算机或其它玩家较量,以取得各种形式胜利的游戏。策略类游戏的4E准则为:探索、扩张、开发和消灭(Explore、Expand、Exploit、Exterminate)。代表性游戏有英雄无敌系列(图1-3)、三国志等,严格来说,即时战略游戏也属于策略类游戏的范畴。
2、以下属于游戏开发过程的是(ABCD)
A.产生基本思想               B.编制故事情节
C.确定游戏模式             D.设计游戏框架
★考核知识点: 游戏设计,参见P4
附1.2.2(考核知识点解释)
完整的游戏开发过程至少应该包括:
1.      产生基本思想
在游戏的构思阶段,也许还没有任何成形的东西,甚至没有一点有用的“原材料”。但是脑海里的一些奇思妙想、抑或玩其它游戏时的一次智慧的闪光甚至是和朋友的热烈的讨论都可能激发出一种冲动:何不做个“这样”的游戏?
2.      编制故事情节
情节之于游戏类似情节之于电影。有许多所谓大片,堆砌了华丽的视觉效果和先进的辅助技术,然而空洞的故事内容和一望便知的情节设置常常带给观众极度无聊的感觉;相反在早期的一些电影当中,画面的精致和细腻难以与今天的效果匹敌,场景的恢弘和壮丽更是无法和很多现代电影比较,但是丝丝入扣的故事情节、跌宕起伏的任务命运带给这些电影无限的生命力,使之成为经典和永恒。
游戏也是这样。如何将最新的2D/3D技术和最炫的动画效果自然地融合在游戏当中,引导玩家随着情节的发展渐渐了解故事、熟悉故事、将自己置身于故事是游戏设计者需要及早考虑的问题。一款游戏能否成功,可玩性是重要的评价标准,而编制精彩的故事情节又是提高游戏可玩性的一条重要途径。必须认识到,往往是游戏中那些支离破碎的情节和漫无目的的打斗令玩家望而却步。
3.      确定游戏模式
在正式开始游戏程序的设计和实现之前,还需要对游戏模式进行规划和论证。这些工作包括:
确定游戏是供一个人玩、两个人玩、还是多个人玩。一种考虑是:多玩家的游戏逻辑相对复杂,而且一般需要网络支持。这种支持的代价有多大?不同玩家的游戏界面怎样实现同步?哪些游戏信息需要在玩家之间传递而且能够被传递?另一种考虑则是:不同的游戏主题和类型不一定全都适合于多玩家模式。比如一些回合制策略游戏在两个或更多玩家联机对战时显得异常繁冗和拖沓。
人工智能是游戏设计中的另一个重要问题。游戏设计者常常需要赋予系统一定的逻辑判断和决策能力,使其具备与玩家“作战”的能力。一般来说,游戏人工智能的实现既需要游戏设计者水平很高,同时也要求硬件设备拥有良好的运算能力。
4.      设计游戏框架
在明确了游戏的背景、主题、情节等功能要求以及速度、难度等性能要求之后,可以着手设计游戏程序的层次和结构了。
5.      编写游戏代码
节约资源和提高代码可维护性是编写游戏代码时重点关注的两个问题。
6.      测试游戏功能
在把编写完的游戏程序交给玩家之前,需要首先对它进行细致和完整的测试,以及早发现和修改其中的错误,进一步完善游戏功能。
3、以下属于移动开发平台是(ABC)
A.J2ME                  B.BREW
C.Symbian               D.Win CE
★考核知识点: 移动平台,参见P8
附1.2.3(考核知识点解释)
曾经的几种主流的移动平台可以包括一下三种。
1. J2ME
J2ME(Java 2 Micro Edition)是Java 2的一个组成部分,是与J2SE、J2EE处于同一个层次的概念。根据Sun的定义:J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备,例如蜂窝电话和可视电话、数字机顶盒、汽车导航系统等。J2ME技术在1999正式推出,它将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。
2. BREW
BREW是无线二进制运行环境(Binary Runtime Environment for Wireless)的缩写,是高通公司2001年推出的基于CDMA网络“无线互联网发射平台”上增值业务开发运行的基本平台。相对于J2ME,BREW是一个更底层的技术。
3. Symbian
Symbian由诺基亚、索尼爱立信、摩托罗拉、西门子等几家大型移动通讯设备商共同出资研制。Symbian操作系统的前身是EPOC(Electronic Piece of Cheese),其原意为“使用电子产品时可以像吃乳酪一样简单”,这就是它在设计时所坚持的理念。
4、完整的Java体系结构实际上是由(ABCD)组件组合而成
A.Java编程语言             B.Java类文件格式
C.Java API                   D.Java虚拟机
★考核知识点: Java体系结构,参见P12
附1.2.4(考核知识点解释)
完整的Java体系结构实际上是由4个组件组合而成:Java编程语言、Java类文件格式、Java API和Java虚拟机(JVM)
5、J2ME的体系结构包括(BCD)
A.可选包                   B.操作系统
C.配置                     D.简表
★考核知识点: J2ME三层体系结构,参见P28
附1.2.5(考核知识点解释)
J2ME的体系分为三层,其中最底层是操作系统(Host Operating System) 操作系统可以是Linux、Symbian或者PalmOS,这充分说明了Java语言的平台无关性。中间层是配置(Configuration),配置包含了基础运行环境,这个环境用有运行Java程序的Java虚拟机,上层是简表(Profiles),见表是针对一系列设备提供的开发包集合,是给定配置上的一组API的集合,顶层是一些可选包,例如蓝牙组件,红外组件等等。
6、常见开发J2ME的IDE 有(ABCD)
A.Jbuilder                 B.Eclipse
C.netBeans                  D.Jcreator
★考核知识点: 开发工具的选择,参见P45
附1.2.6(考核知识点解释)
开发J2ME程序不需要特殊的开发工具,仅仅使用记事本便可以进行代码的而开发,但是为了提高开发的效率,需要选择一个IDE环境,常见开发J2ME的IDE 有 Jbuilder,Eclipse,netBeans,Jcreator等等,他们具有不同的特点,Jcreator 做为学习使用还可以但是在实际工作中功能有点单一,而 Jbuilder, Eclipse, netBeans 在工作中使用较多,目前Eclipse的市场份额最大。 使用的人数最多。
7、MIDlet程序必须导入的基本类包包括(BC)
A.javax.microedition.midlet.*;               
B.javax.microedition.midlet.MIDlet;
C.javax.microedition.midlet.MIDletStateChangeException;
D.java.util.*;
★考核知识点: 利用Eclipse编写代码,参见P54
附1.2.7(考核知识点解释)
系统自动生成的代码, 分为两个部分,第一部分是导入基本类包,其中下面这两个类包是MIDlet程序所必须的。
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
第二部分是类的定义部分。
public class Minesweeper extends MIDlet {
…………
}:
8、MIDlet应用的三个基本函数包括(ABD)
A.startApp()               B.pauseApp()
C.restartApp()             D.destroyApp()
★考核知识点: 利用Eclipse编写代码,参见P54
附1.2.8(考核知识点解释)
在自动生成的代码中包含了三个函数,这三个函数是MIDlet应用的三个基本函数。MIDlet程序启动后首先会执行startApp()程序,程序取消暂停后,也会执行这个方法。暂停函数程序相应用户的暂停按键时会执行函数pauseApp(),在程序退出时执行destroyApp()。
9、项目发布成功后在项目文件夹中将生成一个新的文件夹deployed(部署)文件夹,此文件夹里面包含(BD)两个文件
A.*.java               B.*.jad
C.*.class               D.*.jar
★考核知识点: 游戏的分类,参见P2
附1.2.9(考核知识点解释)
发布成功后在项目文件夹中将生成一个新的文件夹deployed(部署)文件夹,里面包含两个文件*.jad文件和*.jar文件。
l      JAR文件:JAR文件是许多信息经过封装后形成的捆绑体,是个压缩文件。
通常一个应用程序未封装前由许多文件构成,除了Java类以外,其他文件(诸如图像和应用程序数据)也可能使这个程序包的一部分。把所有这些信息捆绑成一个整体就形成了JAR文件。
l      JAD文件:JAD就是Java应用程序描述器文件
创建一个JAD文件一般有两个原因,一是向应用程序管理器提供信息,说明JAR文件的内容,使用这些信息就可以判断一个MIDlet是否适合运 行这个设备上。例如,通常查看属性MIDlet-Data-Size,应用程序管理器可以确定MIDlet是否需要提供比设备更多的内存;二是提供一种方法,可以把参数传送到MIDlet而不必更改JAR文件。
10、手机的坐标系是以左上0点为原点,向(BD)作X、Y轴正方向
A.左                B.右
C.上                 D.下
★考核知识点: 手机坐标系,参见P61
附1.2.10(考核知识点解释)
不论是在画布上面绘制图形还是用电脑绘制图形,都需要有一组用作参考的对象,这个对象称之为参考系,为了定量的描述物体的位置变化,需要在参考系上建立适当的坐标系。坐标系有很多,在中学物理数学中常用的坐标系为直角坐标系,或者成为正交坐标系,直角坐标系分为横向的X轴和纵向的Y轴,分别以左下0点为原点分别向两个方向延伸,而手机的坐标系是以左上0点为原点向右作X轴正反向,向下作Y轴正方向,和物理数学中的Y轴的定义相反。
11、以下(ABCD)等高级界面元素继承自Screen类
A.TextBox                  B.Alert
C.List                     D.Form
★考核知识点: 画布与游戏画布,参见P62
附1.2.11(考核知识点解释)
Screen类称之为屏幕类,主要用于在屏幕上显示TextBox,Alert,List和Form等高级界面元素,这些元素是API提供的,可以直接显示在屏幕上面,因此称之为高级界面元素。
12、生成一个精灵对象后,要将精灵真正地应用于手机游戏之中还需要(AD)
A.为精灵设定帧序列               B.为精灵设定触发事件
C.为精灵设定动作序列              D.指挥精灵在手机屏幕上移动
★考核知识点: 帧的控制,参见P100
附1.2.12(考核知识点解释)
可以利用Sprite的构造函数Sprite(Image image, int frameWidth, int frameHeight)将原始图片切割并从中生成一个精灵对象。但是默认情况下精灵对象只会静止在初始位置并且显示第1帧,没有任何动画效果。要将精灵真正地应用于手机游戏之中还需要做两件事:一是让精灵在不同时刻显示为不同图画,即为精灵设定帧序列;二是指挥精灵在手机屏幕上移动。
13、为了使玩家从视觉上觉得精灵在屏幕上移动,可以通过(AB)两种途径实现
A.实时设定精灵在手机屏幕上显示的坐标位置
B.通过指定水平方向和竖直方向的移动距离
C.实时设定精灵在手机屏幕上的移动距离           
D.通过指定精灵的动作方向
★考核知识点: 让精灵移动,参见P104
附1.2.13(考核知识点解释)
为了使玩家从视觉上觉得精灵在屏幕上移动(走动),可以通过两种途径实现:一种是使用前面介绍的setPosition()方法,实时设定精灵在手机屏幕上显示的坐标位置;另一种是调用继承自Layer类的move()方法,通过指定水平方向和竖直方向的移动距离形成移动的效果。
14、Sprite类的碰撞检查可以分为(CD)
A.位置检查             B.圆形检查
C.像素检查              D.矩形检查
★考核知识点: 碰撞的处理机制,参见P110
附1.2.14(考核知识点解释)
Sprite类的碰撞检查可以分为两种:像素检查和矩形检查。
15、按键的操纵是最重要的手机事件形式,MIDP1中必不可少的按键事件是(BCD)
A.getKeyStatus()           B.keyPressed()
C.keyRepeated()           D.keyReleased()
★考核知识点: MIDP1按键处理,参见P126
附1.2.15(考核知识点解释)
目前,绝大多数游戏命令仍然通过玩家按下手机按键来传达,因此按键的操纵也就成为了最重要的手机事件形式。MIDP1中三种必不可少的按键事件是keyPressed、keyRepeated和keyReleased,其函数原型如下所示:
protected void keyPressed(int keyCode)
protected void keyRepeated(int keyCode)
protected void keyReleased(int keyCode)
16、手机网络游戏大体分为(AD)两种类型
A.实时游戏                 B.益智游戏
C.角色扮演游戏             D.回合游戏
★考核知识点: 手机网络游戏分类,参见P190
附1.2.16(考核知识点解释)
手机网络游戏的角度,可以把它大体分为两种类型,它们是:
1. 实时游戏
实时游戏是一种比较复杂的网络游戏形式,但是占据着主流地位,其核心思想是通过玩家操纵的角色执行各种动作,其中带有实际意义的那些动作被称为“事件”,这些事件的发生将激发游戏画面或者元素的改变。
2. 回合游戏
与实时游戏相比,回合游戏要稍微简单一些,这类游戏看起来似乎将玩家的动作划分到了若干连续的“时间方格”中。大家所熟悉的中国象棋比赛就是如此,对战的双方必须交替移动棋子,即使你的棋术高超也只能等对方下完一步之后才能再下,无法超越自己所属的时间方格。事实上,已经有很多流行的棋牌类游戏被移植到了手机平台上,它们正是采用着回合制的形式。
17、解决手机网络游戏同步难题,大体上有(BCD)种思路
A.运动类游戏               B.输入同步方式
C.状态同步方式             D.混合同步方式
★考核知识点: 网络游戏的难点和解决方案,参见P191
附1.2.17(考核知识点解释)
解决手机网络游戏同步难题,大体上有三种思路:
1. 输入同步方式
输入同步是指每个手机都把玩家的输入事件通知给其他游戏实例的通信方式。这种方式比较简单和直观:游戏的同步操作完全由玩家事件来指挥,每次当一个玩家产生了输入事件的时候,其他游戏实例得到这一消息并马上在自己的手机上模拟相同的动作,这个动作将激发当前游戏状态的改变,看起来仿佛别的玩家刚刚在这里操作了一样。
2.  状态同步方式
然而,输入同步只是一种比较简单的情况。如果游戏有不依赖于玩家输入的改变该如何处理?既然同步的是不同游戏实例的状态信息,那么每当任何一个游戏实例的任何状态发生改变时就执行同步操作应该是最稳妥的办法。这样做的结果是没有任何信息会被丢失,所有游戏实例的状态都将保持一致。
然而,实现上述目标需要游戏程序做太多工作。突出的一点矛盾是,手机设备的资源非常有限,手机之间网络通讯的条件也远远不及计算机网络,然而状态同步方式显然没有顾忌这些限制。
3.      混合同步方式
输入同步方式和状态同步方式各有优点,同时也都存在不尽如人意的地方。在实际的手机网络游戏设计过程中,有必要细致分析游戏状态更新的各种可能,区别对待引发信息同步需求的各类起因,综合运用上述两种方式解决实际问题。
比如可以这样考虑:对于明确的由玩家操作激发的事件,选择实时的通知给其他游戏实例,要求其及时模拟并更新各自状态;而对于另外一些场景或环境内的状态变迁,则直接由游戏系统向所有参与者发出更新的通知。
18、实现手机互联的技术可以分为(ABD)
A.窄带广域无线网              B.宽带广域无线网
C.窄带局域无线网               D.局域无线网
★考核知识点: 手机网络技术,参见P193
附1.2.18(考核知识点解释)
这些实现手机互联的技术可以分为三个类别,它们分别是窄带广域无线网、宽带广域无线网和局域无线网。
19、M3G支持(AC)两种3D模式
A.立即模式                 B.延迟模式
C.保留模式                  D.开放模式
★考核知识点: M3G支持的3D游戏开发模式,参见P210
附1.2.19(考核知识点解释)
M3G支持两种3D模式:立即模式(immediate mode)和保留模式(retained mode)。这两种模式的区别主要体现在内部的渲染过程,对于用户来讲,感受没有什么不同,两种模式下都可以高效的加载,呈现和修改3D模型,M3G支持.m3g的3D模型文件。
立即模式:M3G可以说是OpenGL的基础和简化版,他允许用户手工渲染图像任何细节,因为所有的对象都进行手工渲染,从而以较低的程序开发速度,换来了快速的游戏运行速度。
保留模式:该模式下,用户不能使用渲染的低级功能,因此此模式下的图像呈现方式过更为抽象,使用起来更加便利,仅仅简单的代码便可以实现3D场景的加载和呈现,由M3G来完成所有的渲染工作,因此游戏的开发速度较快,但是最终的运行速度较慢。
20、以下(ABCD)属于3D游戏的开发部分
A.创建3D物体                  B.绘制游戏场景
C.对物体和场景着色             D.使用光线
★考核知识点: 3D游戏设计,参见P211
附1.2.20(考核知识点解释)
3D游戏的开发分为几个部分,创建游戏中的人物角色等3D物体,绘制游戏的场景,并对物体和场景进行着色,通过在场景中使用不同的光照,是的物体呈现不同的质感和真实感。
21、人工智能可以大体划分为(BCD)三种基本类型
A.即时AI               B.漫游AI
C.行为AI               D.策略AI
★考核知识点: 游戏人工智能的类型,参见P237
附1.2.21(考核知识点解释)
游戏人工智能的类型非常多,只用一节内容根本无法说明哪个算法适用于哪种类型的游戏,有的游戏甚至要用到一些独特的人工智能。本节只是把人工智能划分为三种基本的类型:漫游AI、行为AI和策略AI
22、游戏开发流程主要包括(ABCD)
A.市场调研                 B.游戏策划
C.游戏开发                  D.游戏运营
★考核知识点: 游戏开发流程,参见P251
附1.2.22(考核知识点解释)
随着手机游戏玩家的要求不断提高,单人开发手机游戏越来越不现实,游戏开发的各阶段分工更加明确,需要更多的专业人员协作完成。按照游戏开发的特征可把游戏开发团队分为游戏策划人员、程序员、测试人员、美工人员、运营销售人员、售后服务人员等。一般的游戏开发流程主要包括市场调研、游戏策划、游戏开发和游戏运营四个重要阶段。
23、不考虑故事情节,设计一款RPG游戏主要包含(ABC)游戏元素
A.游戏角色                 B.游戏道具
C.游戏场景                 D.游戏规则
★考核知识点: 游戏元素,参见P264
附1.2.23(考核知识点解释)
纵观我们见过的所有RPG游戏,不考虑故事情节,设计一款RPG游戏主要包含以下三类共通的游戏元素:游戏角色、游戏道具、游戏场景。
24、人工智能分为三种类型,下列属于漫游AI的是(   )
A.行为                                B.追逐
C.模式                                D.逃避
★考核知识点: 游戏人工智能,参见P237
附1.2.24(考核知识点解释)
漫游AI主要是确定一个游戏对象如何在虚拟的游戏世界中进行漫游,对于计算机控制的对象,例如在雷电等游戏中,不管是简单地按照某种方式进行移动还是突然改变当前的行动路径,都需要使用漫游AI。根据游戏对象的不同移动方式,漫游AI分为三类:追逐、逃避和模式。
25、Camera类定义的3种投影方式为(   )   
A.普通投影                            B.透视投影
C.垂直投影                            D.平行投影
★考核知识点: 三维场景管理,参见P221
附1.2.25(考核知识点解释)
三维的世界,在人的眼睛中总是以二维平面的方式来呈现的,因此必须将三维的物体做二维投影,在三维世界中可以设置一个摄像机,这个摄像机仿佛是人的眼睛,透过摄像机看的物体便是人眼可以但到的画面,随着摄像机的移动,画面也会随之移动,在M3G中定了一个类似的类叫做Camera(摄像机),Camera主要完成这个工作,Camera类的来源如下,Camera类定义了三种投影方式:普通投影GENERIC、透视投影PERSPECTIVE和平行投影PARALLER。
26、RecordListener接口用来监听发生的记录文件上的操作有(     )
A.recordAdded增加记录操作            B.recordQuery查询记录操作
C.recordChanged更改记录操作          D.recordDeleted删除记录操作
★考核知识点: 数据存储,参见P181
附1.2.26(考核知识点解释)
在一个真实的手机游戏中,常常会频繁地对记录文件进行操作。RecordListener是javax.microedition.rms包提供的一个接口,用来监听发生在记录文件上的操作并作出某些响应。RecordListener包含针对添加记录、更新记录、删除记录3种操作的响应,分别是:
public void recordAdded([url=mkMSITStore:C:\Users\Yang%20Jufeng\Desktop\J2ME.CHM::/docs/api/midp/javax/microedition/rms/RecordStore.html]RecordStore[/url] recordStore, int recordId)
public void recordChanged([url=mkMSITStore:C:\Users\Yang%20Jufeng\Desktop\J2ME.CHM::/docs/api/midp/javax/microedition/rms/RecordStore.html]RecordStore[/url] recordStore, int recordId)
public void recordDeleted([url=mkMSITStore:C:\Users\Yang%20Jufeng\Desktop\J2ME.CHM::/docs/api/midp/javax/microedition/rms/RecordStore.html]RecordStore[/url] recordStore, int recordId)
在用户程序中实现这3种函数并添加实际需要的处理或响应即可。
记录文件的addRecordListener函数用于添加监听器,前提是程序已经实现了自己的3种监听响应函数。对应地,removeRecordListener函数用于从记录文件中删除无用的监听器。事实上,只要及时关闭不再使用的记录文件,加载在其上的监听器就会同时被删除。
(三)、判断部分
1、游戏是人类衍生和人类社会发展的产物。( √ )
★考核知识点: 游戏的起源,参见P1
附1.3.1(考核知识点解释)
游戏是人类衍生和人类社会发展的产物。
在人类社会中,游戏不但保留了娱乐活动的特质,而且成为一种严肃的自发活动,怀有生存技能培训和智力培养的目标。
游戏最早的雏形,可以追溯到人类原始社会流行的活动:扔石头、投掷带尖的棍子。这些最早的游戏显然是以增强生存技能作为初衷。社会进步后,棋牌类游戏、竞技类游戏开始出现,那是为了智力培养和适应竞争而存在。
2、JVM与核心类共同构成了Java平台。( √ )
★考核知识点: Java体系结构,参见P12
附1.3.2(考核知识点解释)
JVM与核心类共同构成了Java平台,也称为JRE(Java Runtime Environment,Java运行时环境),该平台可以建立在意任操作系统上。
3、JAVA具有平台无关性。( √ )
★考核知识点: Java体系结构,参见P12
附1.3.3(考核知识点解释)
JVM与核心类共同构成了Java平台,也称为JRE(Java Runtime Environment,Java运行时环境),该平台可以建立在意任操作系统上。
4、Java的执行方式是编译执行。( × )
★考核知识点: 游戏的起源,参见P12
附1.3.4(考核知识点解释)
Java的执行方式不是编译执行而是解释执行,不同平台上面相同的源代码编译成符合Java规范的相同的二进制字节码,然后再交给支持各自平台的虚拟机去解释执行,"先编译,后解释,再执行"的特性使得Java程序实现了"一次编写,随处运行",如果Java应用使用的是100%标准Java API并且没有直接调用本地方法,那就可以不加修改地运用在多种平台上,这样的平台无关性使得在异构的网络环境或者嵌入式方面的应用更方便和现实。
5、Java语言具有面向对象的特点。( √ )
★考核知识点: Java语言特性,参见P12
附1.3.5(考核知识点解释)
Java是一种简单、面向对象、分布式、解释、健壮、安全、结构中立、可移植、高效能、多线程、动态的语言。
6、Java是面向网络的语言。( √ )
★考核知识点: Java语言特性,参见P13
附1.3.6(考核知识点解释)
Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便地访问其它对象。
7、Java是属于高性能的。( √ )
★考核知识点: Java语言特性,参见P14
附1.3.7(考核知识点解释)
和其它解释执行的语言如BASIC、TCL不同,Java字节码的设计使之能很容易地直接转换成对应于特定CPU的机器码,从而得到较高的性能。
8、Java语言具有动态性。( √ )
★考核知识点: Java语言特性,参见P14
附1.3.8(考核知识点解释)
Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。
9、基于像素的碰撞检查非常精确和真实,但是它也具有计算复杂、系统资源占用严重等缺点。( √ )
★考核知识点: 碰撞的处理机制,参见P110
附1.3.9(考核知识点解释)
像素检查顾名思义就是仅仅关注代表实际对象的两组像素是否重叠,与其他辅助区域无关,适用于两个精灵的背景颜色趋于一致且该颜色几乎不在精灵主体中出现的情况。图5-14显示了这种检测方法,虽然明显地两幅图片发生了交叠,但是由于图片主体绵羊和老虎没有发生真正的碰触,所以不认为这两个精灵图片发生了碰撞。显然,基于像素的碰撞检查非常精确和真实,但是它也具有计算复杂、系统资源占用严重等缺点。
10、在J2ME中,画布和屏幕、元件等成分一起被用来解决用户事件响应的问题。( √ )
★考核知识点: 响应用户事件,参见P125
附1.3.10(考核知识点解释)
在J2ME中,画布和屏幕、元件等成分一起被用来解决用户事件响应的问题。
11、javax.microedition.rms包提供了一系列接口和函数用于实现对文件中记录的遍历、筛选和排序。( √ )
★考核知识点: 遍历记录,参见P184
附1.3.11(考核知识点解释)
一般来说,可以利用for循环或while循环手动地控制程序依次获取记录文件中的每一个记录,从而实现对记录文件的遍历。然而这并不是一种简单有效的方法,javax.microedition.rms包提供了一系列接口和函数用于实现对文件中记录的遍历、筛选和排序。
12、HTTP连接和Socket连接都是基于TCP网络协议实现的。( √ )
★考核知识点: HTTP连接,Socket连接,参见P202
附1.3.12(考核知识点解释)
HTTP使用TCP而不是UDP的原因在于打开一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。
Socket连接是基于TCP网络协议实现的。
13、Datagram连接是基于TCP网络协议实现的。( × )
★考核知识点: Datagram连接,参见P206
附1.3.13(考核知识点解释)
Datagram连接正是基于UDP网络协议实现的,其操作功能包含在接口DatagramConnection之中。
14、把生成异常对象并把它提交给运行时系统的过程称为抛弃(throw)一个异常。( √ )
★考核知识点: 异常处理,参见P21
附1.3.14(考核知识点解释)
Java通过面向对象的方法来处理异常。在一个方法的运行过程中,如果发生了异常,则这个方法生成代表该异常的一个对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。把生成异常对象并把它提交给运行时系统的过程称为抛弃(throw)一个异常。
15、WTK属于在线开发工具包。( × )
★考核知识点: J2ME Wireless Toolkit,参见P36
附1.3.15(考核知识点解释)
WTK 的全称是Sun J2ME Wireless Toolkit —— Sun的无线开发工具包。
16、DateField是Screen的子类,放置在Form内部用于显示和编辑日期及时间信息。( × )
★考核知识点: DateField,参见P144
附1.3.16(考核知识点解释)
DateField是Item的子类,放置在Form内部用于显示和编辑日期及时间信息。它的构造函数有两种形式:
public DateField(String label, int mode)
public DateField(String label, int mode, TimeZone timeZone)
17、3D游戏的开发大多是基于某些游戏引擎之上的。( √ )
★考核知识点: J2ME 3D概述,参见P209
附1.3.17(考核知识点解释)
3D游戏的开发大多是基于某些游戏引擎之上的,游戏引擎将游戏的基础API进行封装,这些基础API将完成游戏中核心的功能,开发者只需进行简单的程序设计便可以完成游戏的开发,引擎的使用大大减少了游戏开发工作量,提高了游戏开发的效率,降低了开发的难度。因此3D游戏的开发第一步是需要掌握这个游戏引擎的使用。
18、M3G是一个专门为移动设备设计的3D图形引擎,使用M3G接口可以方便的开发3D手机应用和游戏。( √ )
★考核知识点: 3D游戏基础,参见P210
附1.3.18(考核知识点解释)
3D手机游戏的开发主要是利用java的3D引擎来实现的。目前Java中支持3D的图形技术的有JSR,JSR184(Java Specification Request,Java规范需求)标准中,定义了M3G接口。M3G是一个专门为移动设备设计的3D图形引擎,使用M3G接口可以方便的开发3D手机应用和游戏。
19、3D游戏中的动画与2D游戏中的动画的基本原理是相同的。( √ )
★考核知识点: 3D动画制作,参见P224
附1.3.19(考核知识点解释)
简单的3D集合体仅仅是构建游戏的基础,游戏中的角色并不是静止不动的,因此3D游戏中同样需要动画效果,3D游戏中的动画制作比2D游戏中的动画制作要复杂很多,因为2D游戏中的动画是在平面上完成的,而3D游戏中的动画是在空间范围中的变化,并且具有不同的视角,但是动画的基本原理是相同。
20、M3G定义了keyframeSequence类用于处理关键帧序列。( √ )
★考核知识点: 3D动画制作关键帧序列,参见P224
附1.3.20(考核知识点解释)
3D游戏的动画同2D游戏的动画原理是相同的都是通过多帧图像的变化产生的动画效果。当游戏画面没有变化的时候,每一帧图像都是相同的,或者是有规律的变化着,当画面变换的时刻的那一帧图像称之为关键帧。M3G定义了keyframeSequence类用于处理关键帧序列,其构造方法为:
public KeyframeSequence(int numKeyframes,int numComponents,int interpolation)
二、主观部分:
(一)、填空部分
1Java不支持         类型、        类型、       类型。
★考核知识点:Java程序设计,参见P14
附2.1.1:(考核知识点解释)
Java和C/C++不同,Java不支持指针类型、结构体类型和共用体类型。
2、结构化程序设计包括         结构、        结构、       结构。
★考核知识点:程序流程控制,参见P16
附2.1.2:(考核知识点解释)
结构化程序设计通常由3种结构组成,其中顺序结构是按照语句书写的先后顺序执行的,分支结构则是在若干路径中有条件的选择一条执行,循环结构是当某个条件成立时,反复的执行某一段代码。
3Java属于面向对象的编程语言,面向对象的三个特点是                       
★考核知识点:Java程序设计,参见P14
附2.1.3:(考核知识点解释)
程序设计中的对象的概念就是对现实事物进行抽象化,进而便于使用程序语言来解决现实生活中的问题,面向对象的有三个特点:封装、继承和多态。
4J2ME通过                 来设置Java运行环境。
★考核知识点:J2ME三层体系结构,参见P28
附2.1.4:(考核知识点解释)
J2ME技术在1999年的JavaOne Developer Conference大会上正式推出,它将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。J2ME通过配置和简表来设置Java运行环境(JRE)。
5、在MIDP中用于显示图形图像的类主要来自lcdui这个包,lcdui包含了用于图像显示的所有类,其中                 是显示图形图像的基础类。
★考核知识点:画布与游戏画布,参见P62
附2.1.5:(考核知识点解释)
在MIDP中用于显示图形图像的类主要来自lcdui这个包,lcdui包含了用于图像显示的所有类。其中画布Canvas和屏幕Screen是显示图形图像的基础类。Screen和Canvas都是Displayable类的派生,其他类都继承自这两个类。
6Graphics类提供了       方法用于绘制字符。
★考核知识点:绘制字符,参见P70
附2.1.6:(考核知识点解释)
Graphics类提供了drawString方法用于绘制字符,drawString的定义如下:
public void drawString(String text, int x, int y, int anchor);。
7Graphics类提供了         方法,通过这个方法可以更改当前的画笔颜色。
★考核知识点:使用颜色,参见P72
附2.1.7:(考核知识点解释)
Graphics类提供了setColor方法,通过这个方法可以更改当前的画笔颜色。setColor的定义如下:
  setColor(int RGB)
  setColor(int red, int green, int blue)
8、在绘制基本图形的时候,可以使用不同的画笔来绘制,Graphics提供了2个方法                 分别用于获取和设置画笔。
★考核知识点:调整画笔风格,参见P72
附2.1.8:(考核知识点解释)
在绘制基本图形的时候,可以使用不同的画笔来绘制,Graphics提供了2个方法getStrokeStyle()和setStrokeStyle()分别用于获取和设置画笔。
9Graphics还支持图形的绘制,图像的处理主要使用         类来完成。
★考核知识点:图像的绘制,参见P73
附2.1.9:(考核知识点解释)
开发手机游戏程序,仅仅使用简单的绘图是远远达不到标准的,因此Graphics还支持图形的绘制,图像的处理主要使用Image类来完成。
10、双缓冲实现过程首先在         中创建与画布一致的缓冲区,然后在缓冲区画图,接着将缓冲区位图拷贝到当前画布上,最后释放内存缓冲区。
★考核知识点:双缓冲技术,参见P76
附2.1.10:(考核知识点解释)
计算机绘图的时候当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程首先在内存中创建与画布一致的缓冲区,然后在缓冲区画图,接着将缓冲区位图拷贝到当前画布上,最后释放内存缓冲区。
11MIDP2.0图层的实现是通过         类来实现的。
★考核知识点:图层,参见P77
附2.1.11:(考核知识点解释)
在游戏中,通常会看到很多的不同内容,例如超级玛丽游戏,游戏中会有水管,砖块,敌人,蘑菇等等,这些图形是以图层的形式呈现的,可能是一些对象为一个层也可能是单独的一个对象为一个图层,利用多个图层的叠加组成了一个场景。通常游戏都会包含多个图层,至少也会包含前景和背景。MIDP2.0图层的实现是通过Layer类来实现的,在游戏中游戏的背景通常是静态的,游戏的角色是动态的,针对不同图层的各自特点,Layer类派生出主要应用于背景层的TiledLayer和主要应用于角色的精灵泪Sprite。
12、静态背景的创建就是通过         层来实现的。
★考核知识点:静态背景,参见P79
附2.1.12:(考核知识点解释)
静态背景的创建就是通过TiledLayer层来实现的。第一步读取图片资源然后创建TiledLayer对象。
13MIDP2.0中提供了         类管理多个图层。
★考核知识点:图层管理器,参见P81
附2.1.13:(考核知识点解释)
由于一个游戏中会有很多的图层出现,并且会有很多场景,单独的去控制每个图层将会是一个很复杂的事情,每个图层如何移动,何时隐藏何时出现等等。MIDP2.0中提供了LayerManager类,该类管理着多个图层,可以使得各个图层的显示移动变得相对简单LayerManager包含一个图层的列表,这个列表可以被追加插入和删除,每个图层的索引index代表着他所在层的深度,索引编号越小代表图层越高,反之编号越大代表图层越深越底层,这个列表可以自己维护,当一个图层被移除之后,其他被影响到得图层编号可以自动重新索引。
14MIDP2.0中提供的LayerManager类中,设置图层的位置可以使用         的方法。
★考核知识点:设置图层的显示位置,参见P82
附2.1.14:(考核知识点解释)
设置图层的位置可以使用setPosition的方法。setPosition方法有2个参数分别代表图层将要显示的位置,代码Layer.setPositon(0,0);绘制的图形是在屏幕的坐标(0,0)开始绘制。
15、动画是利用人类         的特性达成效果的。
★考核知识点:动画的概念,参见P95
附2.1.15:(考核知识点解释)
动画是通过把人、物的表情、动作、变化等分段画成许多幅画,再用摄影机连续拍摄成一系列画面,给视觉造成连续变化的效果。它的基本原理与电影、电视一样,都是视觉原理。医学已证明,人类具有“视觉暂留”的特性,就是说人的眼睛看到一幅画或一个物体后,在1/24秒内不会消失。利用这一原理,在一幅画还没有消失前播放出下一幅画,就会给人造成一种流畅的视觉变化效果。
16、在J2ME中,动画的一系列属性和动作被封装在         类内部。
★考核知识点:Sprite类,参见P96
附2.1.16:(考核知识点解释)
在J2ME中,动画的一系列属性和动作被封装在Sprite类内部。
17Sprite类提供了旋转精灵图片的功能,这个功能由         函数实现。
★考核知识点:参照点和精灵旋转,参见P107
附2.1.17:(考核知识点解释)
Sprite类提供了旋转精灵图片的功能,这个功能由setTransform()函数实现,其基本形式是:
Ø        public  void  setTransform ( int  transform )
通过设置不同的参数transform,可以得到原图的旋转和翻转效果。
18         就是指精灵之间或精灵与其它对象在某一时刻是否处于重叠的状态。
★考核知识点:碰撞处理,参见P110
附2.1.18:(考核知识点解释)
精灵的碰撞在手机游戏中有众多的应用场景,简言之,“碰撞”就是指精灵之间或精灵与其它对象在某一时刻是否处于重叠的状态。
19       Screen的一个子类,负责提供列表的形式供玩家选择。
★考核知识点:Java程序设计,参见P136
附2.1.19:(考核知识点解释)
List是Screen的一个子类,负责提供列表的形式供玩家选择,List的大多数行为都与ChorceGroup的规定类似。
20       Screen的一个子类,它允许玩家在其中输入和编辑文本。
★考核知识点:TextBox,参见P141
附2.1.2:(考核知识点解释)
TextBox是Screen四个子类中的最后一个,它允许玩家在其中输入和编辑文本。一个TextBox有最大字符数限制,也就是它所拥有的最大容量,这种限制在TextBox初始化时、玩家手动编辑文字时或者程序修改文本内容时都是有效的,与TextBox当前的显示内容没有直接关系。
21、当不再使用一个打开的记录文件时,应该用函数        将其关闭以节约系统资源。
★考核知识点:关闭记录文件,参见P171
附2.1.21:(考核知识点解释)
当不再使用一个打开的记录文件时,应该将其关闭以节约系统资源,函数closeRecordStore用于实现这一功能。
22、一个记录文件如果不再有用,可以使用         函数将其删除。
★考核知识点:删除记录文件,参见P172
附2.1.22:(考核知识点解释)
一个记录文件如果不再有用,可以使用deleteRecordStore()函数将其删除,该函数的原型如下:
public static void deleteRecordStore([url=mkMSITStore:C:\Users\Yang%20Jufeng\Desktop\J2ME.CHM::/docs/api/midp/java/lang/String.html]String[/url] recordStoreName)。
23、在记录文件中新增一条记录使用         函数。
★考核知识点:添加记录,参见P173
附2.1.23:(考核知识点解释)
在记录文件中新增一条记录使用addRecord函数,其原型如下所示:
public int addRecord(byte[] data, int offset, int numBytes)。
24、存入手机的记录可以通过         函数读取出来供游戏使用。
★考核知识点:读取记录,参见P176
附2.1.24:(考核知识点解释)
存入手机的记录可以通过getRecord函数读取出来供游戏使用,getRecord函数的调用形式有两种:
Ø        public byte[] getRecord(int recordId)
Ø        public int getRecord(int recordId, byte[] buffer, int offset)。
25、一条记录的原有内容如果不再准确,可以使用         函数重置其所存信息。
★考核知识点:修改记录,参见P178
附2.1.25:(考核知识点解释)
一条记录的原有内容如果不再准确,可以使用setRecord函数重置其所存信息。在手机游戏中,定时保存游戏进程中玩家的实时状态以及在一局游戏结束后更新玩家的最高得分都属于这种情况。
(二)、简答
1.Java语言的体系结构包含哪几个部分?      参见P12
★考核知识点:Java体系结构
附2.2.1:(考核知识点解释)
完整的Java体系结构实际上是由4个组件组合而成:Java编程语言、Java类文件格式、Java API和Java虚拟机(JVM)。
2. J2ME的三层体系结构是什么?     参见P28
★考核知识点:J2ME的体系结构
附2.2.2:(考核知识点解释)
J2ME的体系分为三层,其中最底层是操作系统(Host Operating System) 操作系统可以是Linux、Symbian或者PalmOS,这充分说明了Java语言的平台无关性。中间层是配置(Configuration),配置包含了基础运行环境,这个环境用有运行Java程序的Java虚拟机。上层是简表(Profiles),见表是针对一系列设备提供的开发包集合,是给定配置上的一组API的集合,顶层是一些可选包,例如蓝牙组件,红外组件等等。
3. 什么是双缓冲技术?双缓冲技术解决的问题是什么?    参见P76
★考核知识点:双缓冲技术
附2.2.3:(考核知识点解释)
计算机绘图的时候当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程首先在内存中创建与画布一致的缓冲区,然后在缓冲区画图,接着将缓冲区位图拷贝到当前画布上,最后释放内存缓冲区。
4. 写出Sprite类的三种构造函数并对其参数进行解释。   参见P97-P100
★考核知识点:创建精灵
附2.2.4:(考核知识点解释)
在手机游戏中要想实现动画,必须首先创建一个Sprite对象(精灵),这就需要用到Sprite类的构造函数。Sprite类有3个不同的构造函数,用于从不同数据来源中获取构成动画的元素。
1.第一种构造函数形式
Ø          Sprite(Image image);
这个函数用于生成最简单的精灵对象,屏幕中的精灵实际上就是image本身。
2.第二种构造函数形式
Ø          Sprite(Image image, int frameWidth, int frameHeight)
这是最常用的一个构造函数,用于生成一个具有动画效果的精灵,精灵的不同画面来自将image切割成的若干小块。每个小块叫做一帧,所有帧具有同样大小,它们的宽和高分别由frameWidth和frameHeight决定。
3.第三种构造函数形式
最后一个Sprite构造函数形如Sprite(Sprite s),数据来源是另一个已有的Sprite对象。
5. 解释Screen类的子类Form类,并说明它和其他界面元素的关系?参见P131
★考核知识点:Form类
附2.2.5:(考核知识点解释)
Form类是Screen类的一个子类,代表手机屏幕上的窗体。窗体本身不具备什么实际含义,它的主要功能是存放各种屏幕元件,如图像、只读文字、可编辑文字、列表框等,因此可以将Form视为一个元件的容器。
6. 手机数据存储主要有哪些记录操作?参见P173-185
★考核知识点:J2ME数据存储
附2.2.6:(考核知识点解释)
手机中记录和记录文件的关系类似于关系数据库中元祖和表格的关系,只不过记录的格式比较简单,仅仅包含一个“序号列”和一个“内容列”。与计算机的数据库管理系统比较,手机数据库实现的功能非常简单,最重要的几项任务就是对记录(信息)执行添加、读取、修改、删除、监听、遍历等操作。
7、简述3D动画制作的关键技术。参见P224-227
★考核知识点:3D动画制作
附2.2.7:(考核知识点解释)
3D游戏的动画同2D游戏的动画原理是相同的都是通过多帧图像的变化产生的动画效果。当游戏画面没有变化的时候,每一帧图像都是相同的,或者是有规律的变化着,当画面变换的时刻的那一帧图像称之为关键帧。M3G定义了keyframeSequence类用于处理关键帧序列,其构造方法为:
public KeyframeSequence(int numKeyframes,int numComponents,int interpolation)
其中,第一个参数numKeyframes是关键帧的总数,第二个参数numComponents是关键帧属性的数目,第三个参数interpolation代表属性变换算法。Interpolation差值算法有5种,如表10-6所示。
一个动画是有动画属性、关键帧序列、和动画控制器组成的。AnimationTrack类可以将关键帧序列、动画控制器和动画属性关联在一起。
动画属性是一组可以直接刷新的标量和矢量,如表10-7所示。举例来讲,一个节点的方向。动画的属性确定下列符号常量。一些动画的属性,只适用于一类,例如材料的高亮SHININESS有的属性则可以用于多个类。多数3D对象会拥有1个或则多个动画属性的。具有动画属性的Object3D实例被称为动画的对象,每个动画的对象可能引用零个或更多AnimationTracks。
动画控制器可以控制动画序列的整体暂停,停止,重启,快进,快退,任意重定位,或者失效,它定义了从世界时间序列时间线性映射。
8、简述J2ME的配置、简表和规范的概念。 参见P29-30
★考核知识点:J2ME概念
附2.2.8:(考核知识点解释)
配置(configuration)定义了一个设计在一系列类似硬件上运行的Java平台的能力。本质上,它去掉下列组成部分,只是提供了一个J2SE的最小集,在配置中规定了所支持的Java语言特征,Java虚拟机特征和所支持的基本Java类库和API。 目前,J2ME定义了2种配置,将有稳定的电源供应,自用资源较少的设备划为分连接设备配置CDC(Connected Device Configuration)例如车载设备、机顶盒等。将使用电池供电,设备性能有限的设备划分为受限连接设备配置CLDC(Connected Limited Device Configuration),例如手机。如图3-2所示CLDC是CDC的一个子集,但是由于CDC和CLDC针对的设备不同,所以他们使用的虚拟机和核心类库也不相同,CDC相对于CLCD所包含的库的范围要大一些。再有CDC和CLDC所对应的虚拟机也有所不同CDC对应的Java虚拟机是CVM,而CLDC对应的虚拟机为KVM,由于CDC比CLDC所包含的类库要多,相应的CVM比KVM需要支持的类库也多一些。KVM是一个专门为移动设备设计的Java虚拟机,主要应用于CLDC配置,如图3-3所示JVM虚拟机主要用于J2EE和J2SE,CVM主要用于J2ME的CDC配置,KVM主要应用于J2ME的CLDC配置。之所以称之为KVM主要因为KVM的内用容量是KB级别的,K这里是kilo的意思,KVM实现的最小内存空间为128kb,包括虚拟机、最小运行库和执行程序所需要的空间。
简表(profile)是配置的扩展,它定义了开发人员在编写针对特定的设备类型时可以使用的库,是一个完整的运行环境。一个完整的JRE是由配置和简表组成的,使用哪种JVM是由配置决定的,而操作硬件设备的API是由简表还决定的。 目前使用最为广泛的是移动信息设备简表(MIDP),MIDP 扩展了 CLDC,它定义了用户界面组件、输入和事件处理、持久性存储以及联网和定时器的 API ,这些都考虑到了在 CLDC 配置中移动设备的屏幕和内存的限制。
规范(Specification) 是为了让软件可以运行在多种不同的平台中,而制定的一套标准。  因为所有的J2ME配置和概要都是作为Java社区过程(Java Community Process,JCP)来发展的。所以JCP把业界的领跑者聚集在一起,目的是制定一个通用的规范,这样他们就可以用来设计产品。每一个配置或者概要都是作为Java规范要求(Java Specification Request,JSR)来发布的。
9、简述J2ME中声音播放器的状态及其相互关系。 参见P153-154
★考核知识点:J2ME声音播放
附2.2.9:(考核知识点解释)
在J2ME的API当中定义了专门用于音乐播放的Player接口,Player提供了特殊的方法用于管理播放器的生命周期,控制回放过程等。Player可以通过Manager类的createPlayer方法来创建,播放器创建后,调用方法start可以即刻播放音乐,音乐开始播放后,Player将会转会到后台播放并且在音乐播放结束后自动停止。一个播放器有5种播放状态UNREALIZED, REALIZED, PREFETCHED, STARTED, CLOSED
UNREALIZED 没有实现状态,在这个状态中player不能获取对应资源的信息例如:getContentType ,setMediaTime ,getControls ,getControl,当执行这些方法的时候系统会抛出IllegalStateException异常,使用realize方法可以更改状态。
REALIZED 当播放器获得资源信息后的状态,当播放器处于REALIZED状态后只有当调用deallocate()方法后才会返回到UNREALIZED
PREFETCHED 当播放器REALIZED后,让需要一些时间才可以进行播放,这个状态就是PREFETCHED,这段时间内,player通常用于缓存媒体数据或者处理媒体资源。当调用stops方法后状态会从started转换到PREFETCHED
STARTED 播放状态,当执行start方法后player进入到STARTED状态
CLOSED 关闭状态调用close方法后进入关闭状态,在关闭状态player会释放他做控制的所有资源。
10、简述移动信息设备简表MIDP的概念  参见33-35
★考核知识点:MIDP
附2.2.10:(考核知识点解释)
MIDP(Mobile Information Device Profile移动信息设备简表)为运行在MIDP容器中的MIDlets应用定义了一个API。此API本身是建立在CLDC API之上的。
MIDP用户接口API的Java类设计不是基于Java Abstract Window Toolkit(AWT)类的,而是为移动电话和寻呼机等这类小型移动信息设备而特别设计的。这类设备只有有限的屏幕尺寸和键盘功能。当程序员采用MIDP编写图形界面时,他们只能使用MIDP或者CLDC API。该组API的包名均以javax.microedition开头。MIDP到目前为止发展到2.0版本,之前的版本为1.0,在MIDP第一个版本,也就是MIDP1.0实现中,要求必须支持如下几个包:
在MIDP第二个版本,也就是MIDP2.0实现中,除了兼容MIDP1.0的实现以外,不仅扩充了很多已有类的功能,还增加了几个包:
MIDP用户接口的基本抽象图形是屏幕。Screen类对面向设备的图形和用户交互进行了封装。每次应用智能显示一个屏幕,而且只能浏览或者使用屏幕上的条目。图3-4给出了一个基于屏幕的MIDP图形用户接口GUI的例子。
11、简述利用Sprite类进行碰撞检测的方法。 参见P110-112
★考核知识点:碰撞检测
附2.2.11:(考核知识点解释)
Sprite类的碰撞检查可以分为两种:像素检查和矩形检查。
像素检查顾名思义就是仅仅关注代表实际对象的两组像素是否重叠,与其他辅助区域无关,适用于两个精灵的背景颜色趋于一致且该颜色几乎不在精灵主体中出现的情况。显然,基于像素的碰撞检查非常精确和真实,但是它也具有计算复杂、系统资源占用严重等缺点。
在大多数游戏设计中采用的是另一种碰撞检测方法,即矩形检查。因为游戏中出现的任何对象都可以描述为一个矩形区域,所以通常简单地检查不同对象的外接矩形是否接触来判断两个精灵是否发生了碰撞。
矩形检查的一种特殊情况是由用户自定义精灵的碰撞区域,其函数原型是:
public  void  defineCollisionRectangle ( int x,  int y,  int width,  int height )
碰撞区域的定义与精灵的左上顶点密切相关,参数x和y分别代表碰撞区域相对于精灵左上顶点的水平和竖直位移,参数width和height则指定了碰撞区域的宽度和高度。显然,缺省状态下的碰撞区域可以看做由defineCollisionRectangle (0,0,sprite.getWidth(), sprite.getHeight())指定。如图5-16所示,老虎和绵羊的外接矩形相互覆盖而且虎爪已经触碰到了绵羊,但是因为对于老虎精灵定义了一个较小的有效碰撞区域,所以碰撞检查的结果应该是两个精灵没有发生碰撞。
12、简述有限连接设备配置CLDC的概念   参见P31-33
★考核知识点:CLDC
附2.2.12:(考核知识点解释)
CLDC提供了一套标准的、面对小型设备的Java应用开发平台。2000年5月,Java Community Process(JCP)公布了CLDC1.0规范(即JSR30)。作为第一个面对小型设备的Java应用开发规范,CLDC是由包括Nokia,Motorola和Siemens在内的18家全球知名公司共同协商完成的。CLDC是J2ME核心配置中的一个,可以支持一个或多个profile。其目标主要面向小型的、网络连接速度慢、能源有限(主要是电池供电)且资源有限的设备,如手机、机顶盒、PDA等。CLDC的核心是虚拟机和核心类库。虚拟机运行在目标操作系统之上,对下层的硬件提供必要的兼容和支持,核心类库提供操作系统所需的最小的软件需求。
13、简述游戏人工智能的类型及其应用方法。   参见P237-240
★考核知识点:游戏人工智能
附2.2.13:(考核知识点解释)
游戏人工智能的类型非常多,只用一节内容根本无法说明哪个算法适用于哪种类型的游戏,有的游戏甚至要用到一些独特的人工智能。本节只是把人工智能划分为三种基本的类型:漫游AI、行为AI和策略AI,并说明人工智能如何满足特定游戏的应用需求。
漫游AI主要是确定一个游戏对象如何在虚拟的游戏世界中进行漫游,对于计算机控制的对象,例如在雷电等游戏中,不管是简单地按照某种方式进行移动还是突然改变当前的行动路径,都需要使用漫游AI。根据游戏对象的不同移动方式,漫游AI分为三类:追逐、逃避和模式。
另一种基本的游戏AI类型是行为AI,一般来讲,行为AI是将多种漫游AI组合起来为游戏对象设定一种特定的行为。通常需要为游戏对象的每一种行为建立一个级别,然后在不同的情况下给对象赋予不同的行为级别。例如,可以为对象设计以下几种行为:固定不动、按固定路线移动、追逐和逃避等。简单的行为代码示例如下:
顾名思义,策略AI就是要为游戏对象制定一组固定的定义完备的规则,其目的是试图赢得游戏。策略AI是三种基本AI中最难实现的一种,在棋牌类游戏中应用非常广泛。根据游戏规则的不同,策略AI在实现上也有很大区别。一般来说,计算机会采用某种算法确定当前应该如何操作,通常会在多种操作选择之间做出权衡,从而选择胜率最高的操作。例如,在棋类游戏中,计算机控制的棋手会使用策略AI来确定每步棋。具体来说,计算机尽可能收集棋盘上的已有信息并进行分析处理,然后根据事先给定的规则,在穷举搜索的过程中评价每个点的权值,最终找到最优解。注意,这个最优解是综合考虑“进攻”和“防守”而得到的。其中,1997年“深蓝”国际象棋程序当属最著名的策略AI程序,是学习AI技术的经典范例。
14、简述播放MIDI声音文件的方法及步骤    参见P157-158
★考核知识点:J2ME声音播放
附2.2.14:(考核知识点解释)
MIDI文件的播放同样需要借助Player播放器,根据文件的来源不同,分为两种创建播放器的方法,一种是播放资源jar文件中的midi文件,另一种播放来自URL中的声音,URL中的文件即为网络文件,播放网络文件使用的很少。
播放来自jar文件中wav的第一步是从jar文件中获得MIDI数据流,下列代码中第二行创建了InputStream类型的对象is,is用于控制MIDI数据流的句柄,getClass().getResourceAsStream("audio.midi")实现了从资源文件中获得audio.midi音乐文件流。代码的第三行通过 Manager的createPlayer方法创建播放器player的实例p,第六4行执行player的方法start播放文件,当文件读取或者播放出现错误的时候系统会跑出不同类型的异常读取出现错误会抛出IOException异常,播放出现错误会抛出MediaException异常,代码的第5-6行分别对两种异常做了处理。
1 try {
2    InputStream is = getClass().getResourceAsStream("audio.midi");
3    Player p = Manager.createPlayer(is, "audio/X-midi");
4    p.start();
5 } catch (IOException ioe) {
6 } catch (MediaException me) { }
播放来网络URL的midi比播放来自jar文件的midi要简单一些,只是等待的时间会比较久,因为手持设备上网的速度受到了一定的限制,不过随着3G网络的普及,播放网络URL文件的机会会变得更多,播放网络文件的代码如下:
1 try {
2     Player p = Manager.createPlayer("http://abc.midi");
3     p.start();
4 } catch (MediaException pe) {
5 } catch (IOException ioe) {
6 }
(三)、程序题
1、TextBox继承了Screen类,允许用户输入并编辑文本。利用TextBox设计一个程序,要求程序在开始时会显示一个文本框,输入名字,按下“Go”软键会显示文字。运行效果如图所示。
  
参考答案:参见《java手机游戏设计基础实验指导》p12-p13
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;3
public class textboxtest extends MIDlet implements CommandListener {
  private TextBox textbox;
  private Alert alert;
  private Command quit;//创建退出软键
  private Command go;//创建开始软键
  
  public textboxtest() {
    textbox=new TextBox("Enter your Name","girl",20,TextField.ANY);
    go=new Command("Go",Command.SCREEN,2);
    quit=new Command("Quit",Command.EXIT,2);
    textbox.addCommand(go);//添加开始软件
    textbox.addCommand(quit);//添加退出软件
    textbox.setCommandListener(this);//添加监听事件
  }
   
  protected void startApp() {
    Display.getDisplay(this).setCurrent(textbox);//将textbox设为当前显示对象
  }
  
  protected void destroyApp(boolean unconditional) {
  }
  
  protected void pauseApp() {
  }
  
  public void commandAction(Command command, Displayable displayable) {
    try{
      if(command==quit){//若按下退出软件,则推出程序
        destroyApp(true);
        notifyDestroyed();
      }
      if(command==go){//若按下开始软件则显示提示信息
        alert=new Alert("","welcome"+textbox.getString(),null,AlertType.CONFIRMATION);
        Display.getDisplay(this).setCurrent(alert);
      }
    }catch(Exception me){
      System.out.println(me+"caught.");
    }
  }
}
2、List对象即列表对象。在List对象中可以加入多个文本字符串条目。借助List设计程序,要求有四个单选项,当用户选择其中一个后按下“OK”,在另外一个Form对象中显示选中的类。运行效果如右图所示。
参考答案:参见《java手机游戏设计基础实验指导》p13-p14
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
public class Listtext extends MIDlet implements CommandListener {
private List list;
  private Display display;
  private Command command;
  public Listtext(){//标题,类型
    list=new List("类选择",List.EXCLUSIVE);
    list.append("TextBox", null);//添加选项
    list.append("List", null);//添加选项
    list.append("Alert", null);//添加选项
    list.append("Form", null);//添加选项
    command=new Command("OK",Command.OK,1);//创建“OK”软键
    list.addCommand(command);//添加软键
    list.setCommandListener(this);//添加监听事件
    display=Display.getDisplay(this);
  }
  protected void startApp() {
    display.setCurrent(list);
  }
   
  protected void destroyApp(boolean arg0) {
  }
  protected void pauseApp() {
  }
   
  public void commandAction(Command c, Displayable d) {
    if(c==command){
      int n=list.getSelectedIndex();//获取选择的编号
      String s=list.getString(n);//获取编号为n的元素标题
      list.isSelected(n);
      Form f=new Form("您选中的类");
      f.append(s);
      this.display.setCurrent(f);
    }
  }
}
3Ticker对象是一个出现在标题上方的图像组件,可以用来显示滚动信息。利用Ticker设计程序,要求点击“开始”按钮显示滚动条,点击“退出”按钮显示空。运行效果如图所示。
参考答案:参见《java手机游戏设计基础实验指导》p21-p22
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
public class tickertest extends MIDlet implements CommandListener{
  private Display display;
  private Form form;
  private Command start;
  private Command stop;
  private String command;
  public tickertest() {
    display=Display.getDisplay(this);
    form=new Form("Ticker test");
    start=new Command("开始",Command.OK,1);//创建“开始”软键
    stop=new Command("退出",Command.STOP,1);//创建“退出”软键
    form.addCommand(start);
    form.addCommand(stop);
    form.setCommandListener(this);
  }
  protected void startApp(){
    display.setCurrent(form);
  }
  protected void destroyApp(boolean arg0){
  }
  protected void pauseApp() {
  }
   
  public void commandAction(Command c, Displayable d) {
    command=c.getLabel();
    if(command.equals("开始")){//若“开始”,则显示滚动条
      form.setTicker(new Ticker("Ticker test运行中"));
    }else if(command.equals("退出")){//若“退出”,则显示空
      form.setTicker(null);
    }
  }
}
4J2ME低级API中的一个是Canvas(画布类),在Canvas类上,可以进行图形操作,同时它也是低级事件的接收者。借助Canvas进行编程,要求程序可以接收用户输入,若按下2键,则显示“up”;若按下8键,则显示“down”;若按下4键,则显示“left”;若按下6键,则显示“right”。效果如下图所示。
  
参考答案:参见《java手机游戏设计基础实验指导》p27-p39
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class keytest extends MIDlet implements CommandListener{
  private Display display;
  private keyCanvas canvas;
  private Command exit;
  public keytest() {
    canvas=new keyCanvas();//创建keyCanvas对象
    display=Display.getDisplay(this);
    exit=new Command("退出", Command.SCREEN, 1);//创建“退出”软键
    canvas.addCommand(exit);//添加退出软件
    canvas.setCommandListener(this);
  }
   
  protected void startApp(){
    display.setCurrent(canvas);
  }
  protected void destroyApp(boolean unconditional){
  }
  protected void pauseApp() {
  }
  public void commandAction(Command cmd, Displayable disp) {      
    if(cmd == exit){        
      destroyApp(false);
      notifyDestroyed();
    }                    
  }
}
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class keyCanvas extends Canvas{
  public String dircetion;
  public keyCanvas(){
    dircetion="2=up,8=down,4=left,6=right";
  }
   
  public void paint(Graphics g){  
    g.setColor(255,255,255);//设置屏幕颜色
    g.fillRect(0,0,getWidth(),getHeight());//填充屏幕
    g.setColor(255,0,0);//设置字符串颜色
    g.drawString(dircetion, 0, 0, Graphics.TOP|Graphics.LEFT);//绘制字符串
  }
   
  protected void keyPressed(int keyCode){
    switch(keyCode){//若按下2键,则显示“up”
      case KEY_NUM2:
        dircetion="up";
        break;
      case KEY_NUM8://若按下8键,则显示“down”
        dircetion="down";
        break;   
      case KEY_NUM4://若按下4键,则显示“left”
        dircetion="left";
        break;
      case KEY_NUM6://若按下6键,则显示“right”
        dircetion="right";
        break;
    }
    repaint();
  }   
}
5Graphics类可以提供简单的二维几何绘图功能,可在CanvasImage上画线、矩形、圆弧、文本和图像。借助Graphics类进行编程,画出一个弧形,效果如下图所示。
参考答案:参见《java手机游戏设计基础实验指导》p33-p37
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class Graphicstest extends MIDlet implements CommandListener {
  private Command exit;
  private Command command3;
//添加Command对象
  private GraphicsCanvas canvas;
  public Graphicstest() { //在构造方法中创建Command对象
    exit=new Command("退出",Command.EXIT,2);
    command3=new Command("扇形图",Command.SCREEN,3);
    canvas=new GraphicsCanvas();
    canvas.addCommand(exit);
    canvas.addCommand(command3);
    canvas.setCommandListener(this);
  }
   
  protected void startApp(){
    Display.getDisplay(this).setCurrent(canvas);     
  }
  protected void destroyApp(boolean arg0){      
  }
  protected void pauseApp() {      
  }
   
  public void commandAction(Command c,Displayable d){ //处理命令事件
    if(c==exit){
      destroyApp(false);
      notifyDestroyed();
    }else if(c==command3){
      canvas.testtype=3;
      canvas.textshow="扇形图";
      canvas.repaint();
    }
  }
}
   
  public class GraphicsCanvas extends Canvas{
    public int testtype=0;
   
    public void paint(Graphics g){
      g.setColor(0xffffff);
      g.fillRect(0, 0, getWidth(), getHeight());
      g.setColor(0x000000);
      g.drawString(textshow, 0, 0, Graphics.TOP|Graphics.LEFT);
      if(3==testtype){
        drawType3(g);
      }
    }      
      
    public void drawType3(Graphics g){//扇形图演示
      g.setColor(0x0000FF);//填充设置为蓝色
      g.fillArc(40, 40, 110, 110, 0, 120);
      g.setColor(0x00FF0000);//填充设置为红色
      g.fillArc(40, 40, 110, 110, 120, 120);
      g.setColor(0x0000FF00);//填充设置为绿色
      g.fillArc(40, 40, 110, 110, 240, 120);
}
  }
}
6、使用游戏API 中的GameCanvas类、TiledLayer类和LayerManager类创建一个动态背景,背景为闪烁的星星,要求图片像素为96x32像素的贴图,分成332x32。动态背景产生的闪烁效果如下图所示。
参考答案:参见《java手机游戏设计基础实验指导》p47-p51
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class Layertest extends MIDlet {
  private MyCanvas canvas;
  
  public Layertest() {
  }
  
  protected void startApp() {
    canvas=new MyCanvas(this); //创建MyCanvas屏幕画布
    Display.getDisplay(this).setCurrent(canvas);//显示该画布
    canvas.start();//开始游戏线程
  }
  protected void pauseApp() {
    canvas.stop();//停止线程
  }
  
  protected void destroyApp( boolean unconditional ) {
    canvas.stop();//停止线程
  }
   
  public void exitMidlet() {
    destroyApp(false);
    notifyDestroyed();
  }
}
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.io.IOException;
public class MyCanvas extends GameCanvas implements Runnable,CommandListener {
  private Layertest midlet;//程序控制类
  private volatile Thread animationThread=null;//线程
  private TiledLayer mBackground;//创建地图背景
  private LayerManager mLayerManager;
  private int canvasHeight, canvasWidth;//屏幕高度/宽度
  private static int tileHeight,tileWidth;//地图的高度/宽度
  private static int columns,rows;
  private static int mapWidth,mapHeight;
  private int Large = 1;//闪烁星星
  private int Middle = 2;//大星星
  private int Small = 3;//小星星star
  private int ANI;//动画贴片animated  
  private int aniStarIndex;
  private int aniCounter;
  private boolean isRun;  
  private int curX,curY;//当前viewer坐标
  private final int SLEEP=10;
  private Command exit;
  public MyCanvas(Layertest midlet) {   
    super(true);
    this.midlet = midlet;
    canvasHeight=getHeight();
    canvasWidth=getWidth();
    System.out.println(canvasWidth);
    System.out.println(canvasHeight);
    try{
      mBackground = createBackground();//创建背景
    }catch(IOException e){
      System.out.println("create error");
    }
    curX = -(mapWidth - canvasWidth)/2;
    curY = -(mapHeight - canvasHeight)/2;
    mBackground.setPosition(curX,curY);  
    exit=new Command("Exit", Command.STOP,1);
    this.addCommand(exit);
    this.setCommandListener(this);//两个按键
  }
  synchronized void start() {
    isRun=true;
    animationThread=new Thread(this);
    animationThread.start();
  }
  
  public void run() {
    Graphics g = this.getGraphics();
    try{
      while (isRun){
             tick();
        render(g);
        Thread.sleep(SLEEP);
      }
    }catch(InterruptedException ie){
System.out.println(ie.toString());
    }
  }
  
  private void tick() {   
    aniCounter++;
    if(aniCounter%6 == 0){
      mBackground.setAnimatedTile(ANI,Large);
    }else{
      mBackground.setAnimatedTile(ANI,Middle);
}
  }
  private TiledLayer createBackground()throws IOException {
    Image image = Image.createImage("/star.png");//创建背景图片
    TiledLayer tiledLayer = new TiledLayer(7, 8, image, 32, 32);//注意:背景参数的设置!
    tileWidth = 32;
    tileHeight = 32;
    columns = 7;
    rows = 8;
    mapWidth =tileWidth*columns;
    mapHeight = tileHeight*rows;
    ANI =  tiledLayer.createAnimatedTile(Small);
    int[] map = {//地图数组
      Small,Small,Small,Small,Small,Small,Small,
      Small,ANI,ANI,Small,ANI,ANI,Small,
      ANI,Small,Small, ANI,Small,Small,ANI,
      ANI,Small,Small,Small,Small,Small,ANI,
      Small,ANI,Small,Small,Small,ANI,Small,
      Small,Small,ANI,Small,ANI,Small,Small,
      Small,Small,Small,ANI,Small,Small,Small,
      Small,Small,Small,Small,Small,Small,Small,
    };//显示地图     
    for (int i = 0; i < map.length; i++) {
      int column = i % columns;
      int row = (i - column) / columns;
      tiledLayer.setCell(column, row, map);//通过一个循环来设置tiledLayer
    }   
    return tiledLayer;//返回
  }
  
  private void render(Graphics g) {
    mBackground.paint(g);
    flushGraphics();
  }
   
  synchronized void stop() {
    isRun=false;
  }
  
  public void commandAction(Command c, Displayable d) {
    if(c==exit){
      midlet.exitMidlet();
    }
  }
}
7、游戏中经常会出现“高分榜”这样的菜单,比如游戏中会列出前三名的玩家姓名及分数信息。下面实例说明了在新的记录产生后列出前3名的成绩。
参考答案:参见《java手机游戏设计基础实验指导》p42-p45
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.*;
import java.io.*;
import java.util.Random;
public class SaveGameDate extends MIDlet {
  private RecordStore rs;
  private String dbname;
  private Form f;
  private Display display;
  public SaveGameDate() {
    super();
    display=Display.getDisplay(this);
  }
   
  protected void startApp() {
    dbname="db";//数据库名
    f=new Form("游戏高分榜");
    rs=openRSAnyway(dbname);
    if(rs==null){
      f.append("打开失败");
    }  else{
      try{
        addData();
        sortData(f);
        rs.closeRecordStore();
        deleteRS(dbname);
      }catch(Exception e){}
    }
    display.setCurrent(f);
  }
  protected void destroyApp(boolean arg0) {
  }
  protected void pauseApp() {
  }
   
  public RecordStore openRSAnyway(String rsname){
    RecordStore rs=null;
    if(rsname.length()>32){
      return null;
    }
    try{
      rs=RecordStore.openRecordStore(rsname, true);
      return rs;
    }catch(Exception e){
      return null;
    }
  }
  public void addData(){//在数据库中添加10条随机数据
    try{
      for(int i=0;i<10;i++){
        ByteArrayOutputStream bo=new ByteArrayOutputStream();//生成字节输出流
        DataOutputStream doSteam=new DataOutputStream(bo);//数据输出流
        doSteam.writeUTF("player"+i);//写入玩家姓名
        Random random=new Random();
        int record=Math.abs(random.nextInt()%100);
        doSteam.writeInt(record);//写入玩家得分
        byte data[]=bo.toByteArray();
        rs.addRecord(data, 0, data.length);
        doSteam.close();
      }           
  }catch(Exception e){
      e.printStackTrace();
    }
}
   
  public void sortData(Form form){//数据排序
    RecordComparator recordComparator=new RecordComparator(){
      public int compare(byte[] firstdata,byte[] seconddate){
        DataInputStream firstSteam=new DataInputStream(new ByteArrayInputStream(firstdata));
        DataInputStream secondSteam=new DataInputStream(new ByteArrayInputStream(seconddate));
       int firstRecord=0;
        int secondRecord=0;
        try{
          firstSteam.readUTF();
          firstRecord=firstSteam.readInt();
          secondSteam.readUTF();
          secondRecord=secondSteam.readInt();
        }catch(Exception e){
          e.printStackTrace();
        }
        if(firstRecord==secondRecord){
          return RecordComparator.EQUIVALENT;
        }else{
          if(firstRecord<secondRecord){
            return RecordComparator.FOLLOWS;
          }else{
            return RecordComparator.PRECEDES;
          }
        }
      }
    };
    try{
      RecordEnumeration recordEnumeration=rs.enumerateRecords(null, recordComparator, false);
      int i=0;
      while(recordEnumeration.hasNextElement()){
        byte[] temp=recordEnumeration.nextRecord();
        DataInputStream stream=new DataInputStream(new ByteArrayInputStream(temp));
        if(i<3){//取前3名
          form.append("姓名:"+stream.readUTF()+" ");
          form.append("得分:"+stream.readInt()+"\n");
        }
        i++;
        stream.close();
      }
    }catch(RecordStoreNotOpenException e){
      e.printStackTrace();
    }catch(IOException e){
      e.printStackTrace();
    }catch(InvalidRecordIDException e){
    }catch(RecordStoreException e){}
  }
   
  public boolean deleteRS(String rsname){
    if(rsname.length()>32){
      return false;
    }
    try{
      RecordStore.deleteRecordStore(rsname);
    }catch(Exception e){
      return false;
    }
     return true;
  }
}
8、Sprite类提供了旋转精灵图片的功能,现有一个“飞机”精灵,编程实现以下功能:根据指定的参照点,实现飞机精灵的上、下、左、右旋转。
参考答案:参见《java手机游戏设计基础》p107-110
1   import javax.microedition.lcdui.*;
2   import javax.microedition.lcdui.game.*;
3   public class PlaneCanvas extends GameCanvas implements Runnable
4   {
5       private Sprite sprite;
6       private Image spriteImage;
7       private Graphics g;
8       protected PlaneCanvas()
9       {
10         super(true);
11         try
12         {
13             spriteImage = Image.createImage("/plane.jpg");
14         }
15         catch (Exception e)
16         { }
17         sprite = new Sprite(spriteImage);
18         g = this.getGraphics();
19         Thread thread = new Thread(this);
20         thread.start();
21      }
22      public void run()
23      {
24         sprite.setPosition(30, 60);
25         Sprite spriteRP90 = new Sprite(sprite);
26         spriteRP90.defineReferencePixel(100, 100);
27         spriteRP90.setTransform(5);
28         g.setColor(255, 0, 0);
29         g.fillArc(spriteRP90.getRefPixelX() - 5, spriteRP90.getRefPixelY() - 5,
10, 10, 0, 360);
30         Sprite spriteRP270 = new Sprite(sprite);
31         spriteRP270.setRefPixelPosition(30, 86);
32         spriteRP270.setTransform(4);
33         g.setColor(0, 255, 0);
34         g.fillRect(spriteRP270.getRefPixelX() - 3, spriteRP270.getRefPixelY() - 3, 6, 6);
35         sprite.paint(g);
36         spriteRP90.paint(g);
37         spriteRP270.paint(g);
38         flushGraphics();
39      }
40  }
9、利用RecordStore类提供的方法可以实现记录文件所有内容的遍历,编程实现以下功能:遍历一个记录文件,按从小到大的顺序输出记录中以6结尾或字节单元数超过3的所有记录。
参考答案:参见《java手机游戏设计基础》p184-188
1   import javax.microedition.midlet.*;
2   import javax.microedition.rms.*;
3   public class HiRecordMIDlet extends MIDlet implements RecordListener
4   {
5       private RecordStore rs;
6       private int recordID;
7       private int num;
8       public HiRecordMIDlet()
9       {
10         try
11         {
12             rs = RecordStore.openRecordStore("HiRecord", true);
13             System.out.println("记录文件打开成功!");
14             rs.addRecordListener(this);
15         }
16         catch (RecordStoreException e)
17         {
18             System.out.println("记录文件打开失败!");
19         }
20         num = 1;
21         try
22         {
23             RecordEnumeration re = rs.enumerateRecords(null, null, false);
24             String record = null;
25             while (re.hasNextElement())
26             {
27                record = printRecord(re.nextRecordId());
28                if (record != null)
29                {
30                    System.out.println("第" + num + "条记录内容是" + record);
31                }
32                num++;
33             }
34             num = 1;
35             MyFilter myFilter = new MyFilter();
36             MyComparator myComparator = new MyComparator();
37             re = rs.enumerateRecords(myFilter, myComparator, false);
39             record = null;
40             while (re.hasNextElement())
41             {
42                record = printRecord(re.nextRecordId());
43                if (record != null)
44                {
45                      System.out.println("过滤并排序后第" + num + "条记录内容是" + record);
46                }
47                num++;
48             }
49         }
50         catch (Exception e)
51         {
52             System.out.println("记录文件遍历失败!");
53         }
54         try
55         {
56             rs.closeRecordStore();
57             System.out.println("关闭记录文件成功!");
58         }
59         catch (Exception e)
60         {
61             System.out.println("关闭记录文件失败!");
62         }
63      }
64      public String printRecord(int recordId)
65      {
66         byte record[];
67         try
68         {
69             record = new byte[rs.getRecordSize(recordId)];
70             rs.getRecord(recordId, record, 0);
71         }
72         catch (Exception e)
73         {
74             return null;
75         }
76         String recordStr = new String();
77         for (byte i = 0; i < record.length - 1; i++)
78         {
79             recordStr += record;
80             recordStr += " , ";
81         }
82         recordStr += record[record.length - 1];
83         return recordStr;
84      }
85      public void startApp() { }
86      public void pauseApp() { }
87      public void destroyApp(boolean unconditional) { }
88  }
1   import javax.microedition.rms.*;
2   public class MyFilter implements RecordFilter
3   {
4       public boolean matches(byte[] record)
5       {
6          if (record[record.length - 1] == 6)
7          {
8              return true;
9          }
10         else if (record.length > 3)
11         {
12             return true;
13         }
14         else
15         {
16             return false;
17         }
18      }
19  }
1   import javax.microedition.rms.*;
2   public class MyComparator implements RecordComparator
3   {
4       public int compare(byte[] record1, byte[] record2)
5       {
6          if (record1 == record2)
7          {
8              return 0;
9          }
10         int length = Math.min(record1.length, record2.length);
11         for (int i = 0; i < length; i++)
12         {
13             if (record1 < record2)
14             {
15                return -1;
16             }
17             if (record1 > record2)
18             {
19                return 1;
20             }
21         }
22         if (record1.length < record2.length)
23         {
24             return -1;
25         }
26         if (record1.length < record2.length)
27         {
28             return 1;
29         }
30         return 0;
31      }
32  }
快速回复 返回顶部 返回列表