- 浏览: 203327 次
- 性别:
- 来自: 湖南
文章分类
最新评论
游戏画布,图层和游戏精灵
简介
javax.microedition.lcdui.game 包,提高Java 游戏的性能
GameCanvas:游戏画布,比普通画布更加适合游戏开发
Layer:图层,可以表示画布上的某个可视的物体,是抽象类
Sprite:可以充当游戏中的具体角色,一般用于运动角色,如子弹,汽车等
TiledLayer:可以充当游戏中的具体角色,一般用于环境角色,如地图等
LayerManager:管理图层的变换
GameCanvas
基本结构
构造函数传入参数,可以控制特殊键是否被禁用,为true时,可以通过getKeyStates查询状态,一般写法(getKeyStates&相应键值)!=0表示某键
被按下
可以通过getGraphics直接操作画布,不用写paint函数,不用重画开销,flushGraphics()将缓冲画布画到屏幕上
Sprite
Layer的子类,Layer中的重要方法:
int getHeight() /int getWidth()
int getX() /int getY()
boolean isVisible() /voidsetVisible(booleanvisible)
void move(int dx,int dy) /voidsetPosition(intx,inty)
Sprite(Image image) :传入一幅图片/Sprite(Image image,int frameWidth,int frameHeight) :传入图片,设置帧宽度和高度
Sprite.paint(g):将精灵画在界面上
Sprite知识点:旋转和悬挂点
voiddefineReferencePixel(intx,inty) :定义悬挂点
voidsetRefPixelPosition(intx,inty) :将悬挂点定位到某个坐标
int getRefPixelX() :得到悬挂点的横坐标
int getRefPixelY() :得到悬挂点的纵坐标
voidsetTransform(inttransform) :旋转
案例:图像不断旋转并且在界面位置不断变化
SpriteSprite碰撞检测和动画
Sprite知识点:碰撞检测
voiddefineCollisionRectangle(intx,inty,intwidth,intheight) :定义一个矩形的不可碰撞的区域
boolean collidesWith(Sprite s,boolean pixelLevel):判断是否和另一个Sprite发生了碰撞;参数2为true,则认为不透明点发生了碰撞才算
碰撞,否则认为矩形发生了碰撞就算碰撞
boolean collidesWith(TiledLayert,boolean pixelLevel) :判断是否和TiledLayer发生碰撞,TiledLayer后面会讲
boolean collidesWith(Image image,intx,inty,boolean pixelLevel):判断是否和另一个图片碰撞,用的较少,大家可以去查询文档
Sprite知识点:带动画的角色
能否让一个角色本身就含有动画?
切割图片原则:首先走行,一行走完,取下一行,编号从0开始
int getRawFrameCount():得到帧数
voidnextFrame()/voidprevFrame()/voidsetFrame(int sequenceIndex):设置显示某一帧,号码从0开始算
voidsetFrameSequence(int[] sequence)/int getFrameSequenceLength() :设置/得到帧的顺序
int[]seq= newint[]{0,3,2,1};
voidsetImage(Imageimg,int frameWidth,int frameHeight) :改变图片
TiledLayerTiledLayer和图层管理
TiledLayer
TiledLayer(intcolumns,introws, Image image,int tileWidth,int tileHeight):将图片用tileWidth,tileHeight分割,指定将要填充的列数和
行数,注意,图片小块index从1开始
以下例子中,左边图片分为2个图片小块,填充右边的地图,四行四列
TiledLayer
void paint(Graphics g) :画出TiledLayer
voidsetCell(int col,introw,int tileIndex) :将某个图片小块填入相应位置
int getCell(int col,introw) :得到某行某列的图片小块Index
int getCellHeight() /int getCellWidth()
int getColumns() /int getRows()
voidfillCells(int col,introw,int numCols,int numRows,int tileIndex) :用一个图片小块填充整个网格
voidsetStaticTileSet(Image image,int tileWidth,int tileHeight) :修改图片
实际游戏中的技巧
应该将不同的物体弄成不同的图层
右图的地图应该是两个图层:墙壁一个,草地一个,为什么?
便于碰撞检测
图层管理器:LayerManager
有一种更好的方法来在界面上画图,不用针对一个个图层来画图了
void append(Layer l) :添加图层
void remove(Layer l) :去掉图层
voidsetViewWindow(intx,inty,intwidth,intheight) ,设置窗口的可视部分
void paint(Graphics g,intx,inty),将所有图层画统一画出来
简介
javax.microedition.lcdui.game 包,提高Java 游戏的性能
GameCanvas:游戏画布,比普通画布更加适合游戏开发
Layer:图层,可以表示画布上的某个可视的物体,是抽象类
Sprite:可以充当游戏中的具体角色,一般用于运动角色,如子弹,汽车等
TiledLayer:可以充当游戏中的具体角色,一般用于环境角色,如地图等
LayerManager:管理图层的变换
GameCanvas
基本结构
classMyGameCanvasextendsGameCanvasimplementsRunnable{ publicMyGameCanvas(){ super(true); } publicvoidrun(){ } }
构造函数传入参数,可以控制特殊键是否被禁用,为true时,可以通过getKeyStates查询状态,一般写法(getKeyStates&相应键值)!=0表示某键
被按下
可以通过getGraphics直接操作画布,不用写paint函数,不用重画开销,flushGraphics()将缓冲画布画到屏幕上
Sprite
Layer的子类,Layer中的重要方法:
int getHeight() /int getWidth()
int getX() /int getY()
boolean isVisible() /voidsetVisible(booleanvisible)
void move(int dx,int dy) /voidsetPosition(intx,inty)
Sprite(Image image) :传入一幅图片/Sprite(Image image,int frameWidth,int frameHeight) :传入图片,设置帧宽度和高度
Sprite.paint(g):将精灵画在界面上
Sprite知识点:旋转和悬挂点
voiddefineReferencePixel(intx,inty) :定义悬挂点
voidsetRefPixelPosition(intx,inty) :将悬挂点定位到某个坐标
int getRefPixelX() :得到悬挂点的横坐标
int getRefPixelY() :得到悬挂点的纵坐标
voidsetTransform(inttransform) :旋转
案例:图像不断旋转并且在界面位置不断变化
package prj; import java.util.Random; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.lcdui.game.Sprite; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; //让图片绕着左上角旋转 public class MIDlet6 extends MIDlet { private MyGameCanvas mgc = new MyGameCanvas(); private Display dis; protected void startApp() throws MIDletStateChangeException { dis = Display.getDisplay(this); dis.setCurrent(mgc); } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { } protected void pauseApp() { } class MyGameCanvas extends GameCanvas implements Runnable{ private boolean RUN = true; private Random rnd = new Random(); private Graphics gra; private Sprite s1; private Image img; private int STATE = Sprite.TRANS_NONE; public MyGameCanvas(){ super(true); gra = this.getGraphics(); try{ img = Image.createImage("/img1.png"); }catch(Exception ex){ex.printStackTrace();} s1 = new Sprite(img); //定义悬挂点 //s1.defineReferencePixel(s1.getWidth()/2,s1.getHeight()/2);//坐标是图像上的坐标 s1.defineReferencePixel(0,0); s1.setRefPixelPosition(100,100);//悬挂点在界面上的坐标 new Thread(this).start(); } public void run(){ while(RUN){ try{ s1.setTransform(STATE); gra.setColor(255,255,255); gra.fillRect(0,0,this.getWidth(),this.getHeight()); gra.setColor(255,0,0); gra.drawLine(100,100, 150,200); s1.paint(gra); this.flushGraphics(); switch(STATE){ case Sprite.TRANS_NONE: STATE=Sprite.TRANS_ROT90; break; case Sprite.TRANS_ROT90: STATE=Sprite.TRANS_ROT180; break; case Sprite.TRANS_ROT180: STATE=Sprite.TRANS_ROT270; break; case Sprite.TRANS_ROT270: STATE=Sprite.TRANS_NONE; break; } Thread.currentThread().sleep(100); }catch(Exception ex){} } } } }
SpriteSprite碰撞检测和动画
Sprite知识点:碰撞检测
voiddefineCollisionRectangle(intx,inty,intwidth,intheight) :定义一个矩形的不可碰撞的区域
boolean collidesWith(Sprite s,boolean pixelLevel):判断是否和另一个Sprite发生了碰撞;参数2为true,则认为不透明点发生了碰撞才算
碰撞,否则认为矩形发生了碰撞就算碰撞
boolean collidesWith(TiledLayert,boolean pixelLevel) :判断是否和TiledLayer发生碰撞,TiledLayer后面会讲
boolean collidesWith(Image image,intx,inty,boolean pixelLevel):判断是否和另一个图片碰撞,用的较少,大家可以去查询文档
Sprite知识点:带动画的角色
能否让一个角色本身就含有动画?
切割图片原则:首先走行,一行走完,取下一行,编号从0开始
int getRawFrameCount():得到帧数
voidnextFrame()/voidprevFrame()/voidsetFrame(int sequenceIndex):设置显示某一帧,号码从0开始算
voidsetFrameSequence(int[] sequence)/int getFrameSequenceLength() :设置/得到帧的顺序
int[]seq= newint[]{0,3,2,1};
voidsetImage(Imageimg,int frameWidth,int frameHeight) :改变图片
package prj; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.lcdui.game.Sprite; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class MIDlet5 extends MIDlet { private MyGameCanvas mgc = new MyGameCanvas(); private Display dis; protected void startApp() throws MIDletStateChangeException { dis = Display.getDisplay(this); dis.setCurrent(mgc); } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } class MyGameCanvas extends GameCanvas implements Runnable{ private Image img; private Sprite sp1; private Graphics gra; private boolean RUN = true; public MyGameCanvas(){ super(true); try{ img = Image.createImage("/donghua.png"); //sp1 = new Sprite(img); //你可以将img分割成几个图片小块,每个小块有一定的宽度和高度 //以下代码将图片分为4帧, sp1 = new Sprite(img,img.getWidth()/4,img.getHeight()); gra = this.getGraphics(); }catch(Exception ex){ ex.printStackTrace(); } new Thread(this).start(); } public void run(){ while(RUN){ gra.setColor(0,255,0); gra.fillRect(0,0,this.getWidth(),this.getHeight()); sp1.paint(gra); this.flushGraphics(); sp1.move(1, 1); sp1.nextFrame(); try{ Thread.currentThread().sleep(100); }catch(Exception ex){} } } } }
TiledLayerTiledLayer和图层管理
TiledLayer
TiledLayer(intcolumns,introws, Image image,int tileWidth,int tileHeight):将图片用tileWidth,tileHeight分割,指定将要填充的列数和
行数,注意,图片小块index从1开始
以下例子中,左边图片分为2个图片小块,填充右边的地图,四行四列
TiledLayer
void paint(Graphics g) :画出TiledLayer
voidsetCell(int col,introw,int tileIndex) :将某个图片小块填入相应位置
int getCell(int col,introw) :得到某行某列的图片小块Index
int getCellHeight() /int getCellWidth()
int getColumns() /int getRows()
voidfillCells(int col,introw,int numCols,int numRows,int tileIndex) :用一个图片小块填充整个网格
voidsetStaticTileSet(Image image,int tileWidth,int tileHeight) :修改图片
实际游戏中的技巧
应该将不同的物体弄成不同的图层
右图的地图应该是两个图层:墙壁一个,草地一个,为什么?
便于碰撞检测
图层管理器:LayerManager
有一种更好的方法来在界面上画图,不用针对一个个图层来画图了
void append(Layer l) :添加图层
void remove(Layer l) :去掉图层
voidsetViewWindow(intx,inty,intwidth,intheight) ,设置窗口的可视部分
void paint(Graphics g,intx,inty),将所有图层画统一画出来
package prj; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.lcdui.game.LayerManager; import javax.microedition.lcdui.game.TiledLayer; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class MIDlet6 extends MIDlet { private MyGameCanvas mgc = new MyGameCanvas(); private Display dis; protected void startApp() throws MIDletStateChangeException { dis = Display.getDisplay(this); dis.setCurrent(mgc); } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } class MyGameCanvas extends GameCanvas implements Runnable{ private Image map; private TiledLayer tlRoad; private TiledLayer tlWall; private Graphics gra; private LayerManager lm;//图层管理器 private boolean RUN = true; private int Y = 0; public MyGameCanvas(){ super(true); try{ map = Image.createImage("/map.png"); gra = this.getGraphics(); tlRoad = new TiledLayer(4,4,map,map.getWidth()/2,map.getHeight()); tlWall = new TiledLayer(4,4,map,map.getWidth()/2,map.getHeight()); lm = new LayerManager(); lm.append(tlRoad); lm.append(tlWall); int[][] cells = new int[][]{ {1,2,1,2}, {1,2,2,2}, {1,2,1,2}, {1,2,1,2} }; for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ if(cells[j][i]==1){ tlRoad.setCell(j, i, cells[i][j]); } else{ tlWall.setCell(j, i, cells[i][j]); } } } }catch(Exception ex){ ex.printStackTrace(); } new Thread(this).start(); } public void run(){ while(RUN){ gra.setColor(255,255,255); gra.fillRect(0,0,this.getWidth(),this.getHeight()); //通过LayerManager显示 lm.setViewWindow(0,Y,80,30); lm.paint(gra, 30,25); //将图层管理器内的图层画到界面的左上角30,25位置 this.flushGraphics(); Y++; try{ Thread.currentThread().sleep(100); }catch(Exception ex){} } } } }
- J2me源代码.rar (921.8 KB)
- 下载次数: 1
发表评论
-
J2ME代码优化
2011-01-17 10:09 909为什么要优化 CPU不快:10-400MHz 内存有限 ... -
网络编程
2011-01-15 08:11 9781、Socket编程 Socket是什么 Socket是套接字 ... -
MSRMS编程
2011-01-13 08:35 983基础知识 持久化存储的 ... -
画布开发
2011-01-12 13:48 1206CanvasCanvas绘图 画布属于低级界面 Canva ... -
高级开发
2011-01-07 14:08 858高级开发 异常处理 异常的出现 程序运行时由于一些不可预知的 ... -
高级界面开发
2011-01-06 08:33 1011高级界面开发 1:基本界 ... -
体系介绍和环境配置
2010-12-20 14:16 808J2ME简介 Three Java Platforms ...
相关推荐
### MIDP 2.0 Game API 详尽解析 #### 一、引言 随着移动设备功能的增强,游戏开发成为 Java 开发者们热衷的话题之一。在 J2ME(Java 2 Micro Edition)环境下,MIDP 2.0(Mobile Information Device Profile 2.0)...
标题:"MIDP 2.0 Game API快速入门" 描述:"快速软件开发- 电子工业出版社" 标签:"JAVA" 从以上信息中提炼的关键知识点如下: ### 1. MIDP 2.0及其新特性 MIDP 2.0(Mobile Information Device Profile 2.0)...
`midp2_gameapi.pdf` 文件很可能是详细的API文档,包含了这些类和接口的用法说明,而`readme.txt`可能包含关于如何使用这些资源的指南或者开发注意事项。`WAP之家.COM.url`可能是一个链接,指向有关MIDP开发或者移动...
Java GameAPI 是Java Micro Edition (JME) 或者 Lightweight Java Game Library (LWJGL) 中用于游戏开发的一组特定接口和类。这些API专为移动设备和嵌入式系统设计,提供了高效的游戏编程功能,简化了游戏逻辑的实现...
MIDP 2.0是这个平台的一个重要升级,它引入了对游戏开发的强大支持,主要体现在Game API上。这个API使得开发者能够在功能手机上创建复杂的2D游戏,提升了移动游戏的体验。以下将详细讲解MIDP 2.0 Game API的核心组件...
在进入手机_PDA程序设计的世界时,Game API的掌握是至关重要的一步,尤其对于那些希望在移动设备上开发游戏的开发者来说。本文将深入探讨Game API的基础知识,以及如何利用这些API来创建引人入胜的游戏体验。 首先...
《Windows Mobile Game API详解》 Windows Mobile Game API(GAPI)是专为Windows Mobile平台设计的游戏开发接口,它提供了一系列的函数和结构,使得开发者能够充分利用设备的硬件资源,创建高性能、低延迟的游戏...
在进入手机/PDA程序设计的世界时,Game API的掌握是至关重要的一步,尤其对于初学者而言。Game API是专门为了创建游戏或者与游戏相关的应用程序而设计的一组接口和工具,它们提供了一系列的功能,使得开发者能够更...
在进入手机PDA程序设计的世界时,Game API的掌握是至关重要的一步。本文将深入探讨这个主题,并结合“手机PDA程序设计入门-Game API入门”这一资源,为初学者提供一个全面的理解。 Game API(游戏应用程序接口)是...
《使用gameapi构建小游戏——开源实践》 在IT行业中,开源软件已经成为技术创新和发展的重要驱动力。本项目“gameapi-game”正是这样一个实例,它利用gameapi框架开发了一款小游戏,展示了开源精神的魅力以及游戏...
在Android平台上,开发游戏时有时会遇到需要复用或移植早期J2ME(Java 2 Micro Edition)MIDP 2.0中的Game API的情况。MIDP 2.0是J2ME针对移动设备提供的一套游戏开发框架,其中Game API提供了丰富的图形和动画处理...
"GameAPI-0.3.3-py3-none-any.whl" 就是一个这样的库,专门针对游戏开发领域提供服务。 **GameAPI库** "GameAPI" 是一个针对Python 3设计的游戏开发库,版本号为0.3.3。这个库可能包含了各种游戏开发所需的基础...
### 手机PDA程序设计入门:Game API进阶详解 在移动设备程序设计领域,尤其是在游戏开发中,掌握Game API的高级应用是至关重要的。本文将深入探讨Game API的进阶知识,聚焦于TiledLayer的使用以及Sprite的高级功能...
《郭克华J2ME实例教程完整版之GAME API3》是一份专为初学者设计的J2ME游戏开发教程,以WMV视频格式呈现,图文并茂,旨在帮助学习者深入理解并掌握J2ME平台上的游戏编程技术。在这个教程中,郭克华老师详细讲解了J2ME...
### Java游戏开发:利用Siemens Game API #### 1. 引言 本文档旨在介绍如何使用Siemens Game API进行Java游戏开发。该API提供了一系列工具和类,可以帮助开发者高效地创建高质量的游戏应用。 ##### 1.1 关于这份...
### J2ME GameAPI 入门详解 #### 一、J2ME GameAPI 概述 J2ME(Java 2 Micro Edition)是专为移动设备设计的Java平台的一个版本,广泛应用于早期的手机和小型电子设备上。随着智能手机的发展,J2ME逐渐淡出了市场...
本主题将深入探讨“手机PDA程序设计入门-Game API入门”,这是一门针对初学者的教程,旨在帮助他们理解和掌握在Windows CE(WINCE)操作系统上进行游戏应用程序编程的基础知识。 首先,我们要理解什么是Windows CE...
官方版本,亲测可用
在这个特定的场景中,我们关注的是"手机PDA程序设计入门-Game API",这表明我们将深入探讨如何利用API来开发手机和平板设备上的游戏。 J2ME(Java 2 Micro Edition)是Java平台的一个子集,专门用于资源有限的设备...