1、第12章 MIDP游戏编程主讲教师:贾震斌本章目录 12.1 MIDP 2.0 Game API 概述 12.2 游戏容器GameCanvas类 12.3 游戏精灵Sprite 12.4 游戏地图TiledLayer类 12.5 图层管理LayerManager类 12.6 游戏实例:蜜蜂射击本章学习目标 了解MIDP游戏编程基本概念、常用类及方法、基本程序框架12.1 MIDP 2.0 Game API 概述12.1.1 Game API类库简介MIDP提供了GameCanvas类库实现游戏编程所需功能,GameCanvas是Canvas的扩展为了便于操控图像,可以使图像中不同的内容位于不同
2、的层面上,这就是图层的概念,如让人物和背景位于不同的图层上。对每一图层可以分别管理、操控。为此,MIDP提供了图层功能,图层由类Layer实现,而多个图层的管理又由LayerManger类负责。不同的图层叠加在一起形成了一个完整的图像。由于受屏幕大小限制,图像可能无法完全显示出来,LayerManger类提供了观察窗口View Window,通过移动观察窗口实现图像不同部分的显示。图层中有两个特殊图层:Sprite和TiledLayer,Sprite存放游戏角色,TiledLayer存放游戏背景12.2 游戏容器GameCanvas类 12.2.1 屏幕缓冲 每一个GameCanvas对象创建
3、时首先在内存中开辟屏幕大小的缓冲区,在缓冲区中绘制图形,需要时再将缓冲区内容复制到屏幕上GameCanvas使用过程 创建GameCanvas对象,同时在内存中创建缓冲区 建立Graphics对象,调用GameCanvas的getGraphics()方法,获得Graphics对象,通过Graphics对象往内存中绘图,绘图过程与Canvas中不同的是绘图过程不一定要在paint()方法中 调用GameCanvas的flushGraphics()方法将图像送到屏幕上12.2.2 获得键盘输入状态 利用继承于Canvas类的键盘按键事件 利用Game Canvas专用的getKeyStates()
4、方法。可以取得多个同时按下的键值的组合 键值常量,参见教材p.20812.3 游戏精灵Sprite 12.3.1 帧控制 Sprite是Layer类的子类,负责主要角色图层,这个图层由一个个图像组合起来,每一个图像称为一帧,每一帧图像按照一定时间间隔显示出来形成动画 创建帧的方法如下:Sprite(Image image,int framWeidth,int frameHeight)帧的顺序也就是帧的索引值从0开始,Sprite提供了切换顺序的方法 void setFrame(int sequenceIndex)void nextFrame()void prevFrame()12.3.2 精灵
5、翻转 图像可以以任何位置为中心旋转,Sprite提供了方法,如:void defineReferencePixel(int x,int y)void setRefPixelPosition(int x,int y)12.3.3 碰撞检测在GameCanvas中可以通过collidesWith()方法的不同参数的重载形式检测Sprite与Image、Sprite与Sprite、Sprite与TiledLayer之间是否相遇(即碰撞检测),方法如下:boolean collidesWith(Image image,int x,int y,boolean pixelLevel)Checks for
6、a collision between this Sprite and the specified Image with its upper left corner at the specified location.boolean collidesWith(Sprite s,boolean pixelLevel)Checks for a collision between this Sprite and the specified Sprite.boolean collidesWith(TiledLayer t,boolean pixelLevel)Checks for a collisio
7、n between this Sprite and the specified TiledLayer.其中参数pixelLevel表示检测模式,在MIDP 2.0 中定义了两种模式:像素模式和边界模式。像素模式用于两个不透明的像素重叠的碰撞检测,而边界模式用于边界相接时表示相遇的情况。12.4 游戏地图TiledLayer类 12.4.1 游戏中的地图 Sprite将屏幕分成大小相同的网格,在每个网格里面显示一张图像,每个图像都会有一个索引值,然后组合成一个完整的图像,这种方式适合用于一个图像,并且图像很复杂的情况。TiledLayer也是将一个大图像分割成网格状,形成很多小的图像,按照需要将
8、一些小图像组合起来,形成一个完整的图像。TiledLayer在分网格的时候,这些分割成的小图像都有一个索引值,索引时有动态和静态之分,静态索引值从1开始计数,动态索引值从-1开始计数,动态索引值和静态索引值之间存在关联。TiledLayer类 构造函数:TiledLayer(int columns,int rows,Image image,int tileWidth,int tileHeight)参数说明:int columns:网格的列数 int rows:网格的行数 Image image:被分割的图像 int tileWidth:分割的小图宽度 int tileHeight:分割的小图高
9、度 注:构造函数获得的是静态网格TiledLayer类 获得与静态网络关联的动态网格的方法:void setAnimatedTile(int animatedTileIndex,int staticTileIndex)将Tiley放到指定的网络里:void setCell(int col,int row,int tileIndex)将Tiley放到指定区域的网络里:void fillCells(int col,int row,int numCols,int numRows,int tileIndex)12.5 图层管理LayerManager类 图层的概念就是将图像分层处理叠加显示形成完整游戏
10、图像,图层用Layer类处理,各图层的管理由LayerManager负责。LayerManager类的方法 将各图层添加到屏幕上:void append(Layer layer)删除某个图层:void remove(Layer layer)插入某个图层:void insert(Layer layer,int index)设置视图观察窗口:void setViewWindow(int x,int y,int width,int height)图层显示:void paint(Graphics g,int x,int y)Layer类的方法 将图层添加到画布上:void setPosition(int x,int y)移动图层:void move(int dx,int dy)显示或隐藏图层:void setVisible(boolean visible)12.6 游戏实例:蜜蜂射击 略