J2ME RPG游戏边学边做
|
|
Author: 一滴蔚蓝色 | Date: 2007-08-16 |
View: 7126 |
开发技术 - 程序设计 | Digg:
16
|
页面 2 共 6
J2ME RPG游戏边学边做(三)--游戏基本元素类 public class ImageTools { protected ImageTools() { } public static Image getImage(String str){ Image img=null; try { img = Image.createImage(str); } catch (Exception ex) { System.out.println(ex); } finally{ return img; } } } 2.GameObject,提供一个通用的游戏对象。 有了Sprite类,为什么还要GameObject呢?其实我们一般是将Sprite,看作成一个高级的Image,往往一个Sprite要被多个游戏对象调用,GameObject其实就是Sprite的状态类。GameObject提供简单的生命周期概念,动画更新速度; public class GameObject { public Sprite sprite;//内置的Sprite public boolean alive;//存活标记 private int lifecount=0;//生命周期计数器 public int lifetime=0;//生命周期,以桢为单位 public int speed=0;//动画桢更新速度,(0至无穷,0代表每一桢跟新一个画面) private int animcount=0;// /动画桢更新计数器 public GameObject(Image img,int width,int height){ sprite=new Sprite(img,width,height); reset(); } public void move(int dx,int dy){//相对移动 sprite.move(dx,dy); } public void moveto(int x,int y){//绝对移动 sprite.setPosition(x,y); } public void update(){//更新状态,动画桢更新,生命周期更新 if(!alive) return; if(++animcount>speed){ animcount=0; sprite.nextFrame(); if(lifetime!=0 && ++lifecount>lifetime) alive=false; } } public void paint(Graphics g){//Paint if(!alive) return; sprite.paint(g); } public void reset(){//复位 alive=true; lifecount=0; animcount=0; sprite.setFrame(0); } } 3.封装字体类,你需要漂亮的字体吗? public class Font { Sprite sprite; //Sprite int width,height; //每个char的尺寸 int[] charhash; //储存1-127个常见字符在sprite的frameseq中的位置 Graphics g; public Font(Graphics g,Image img, int width, int height, char[] chars) { this.g=g; sprite=new Sprite(img,width,height); this.width=width; this.height=height; charhash=new int[128]; for (int i = 0; i < charhash.length; i++) { charhash[i]=-1;//没有代表此字符的图片 } Character c; for (int i = 0; i < chars.length; i++) { c=new Character(chars[i]); charhash[c.hashCode()]=i; } } public void drawChar(char ch, int x, int y){ Character c=new Character(ch); int hashcode=c.hashCode(); sprite.setPosition(x,y); if(hashcode>=0){ sprite.setFrame(charhash[hashcode]); sprite.paint(g); } } public void drawString(String str, int x, int y){ int length=str.length(); for (int i = 0; i < length; i++) { drawChar(str.charAt(i),x+width*i,y); } } }
J2ME RPG游戏边学边做(四)--爆炸效果 GameObject explosion; 初始化once: img=ImageTools.getImage("/pic/explosion.png"); explosion=new GameObject(img,32,32); 初始化: explosion.reset(); explosion.lifetime=3;//生命周期定位三桢 逻辑处理: if (gameover) {//如果游戏结束,显示效果类 explosion.paint(g); explosion.update(); if(!explosion.alive){//当生命周期结束了 plane.alive=false;//关闭plane g.setColor(255,255,255); g.drawString(StringTools.timeOpinion(gametime),5,22,g.LEFT|g.TOP); g.drawString("fly 0.1 ver by favo yang",2,100,g.LEFT|g.TOP); g.drawString("E-mail : favoyang@yahoo.com",2,115,g.LEFT|g.TOP); g.drawString("simulate from:",2,130,g.LEFT|g.TOP); g.drawString("Mr.tony 's <hold on 20sec 1.20> ",2,145,g.LEFT|g.TOP); g.drawString("hello tony, just funny.",2,160,g.LEFT|g.TOP); } } 现在你看我是如何解决效果层与逻辑层之间的通信的,我使用的是全局变量gameover,在简单游戏中使用大量的全局状态变量也是一种常见的方法,可以避免动脑劲。不过缺点明显,游戏硬编码,结构既不清晰也不漂亮,几乎没有扩展性。所以说最好还是将飞机基于状态机设计,并将效果类设计成含有回调函数的抽象类,然后继承效果类实现回调函数来实现通信。至于总体层次上可以用堆栈将绘画单元串起来。还有分层处理等等…给你个思考的起点… J2ME RPG游戏边学边做 if(bomb.alive){ bomb.moveto(plane.sprite.getX()-20,plane.sprite.getY()-20); bomb.paint(g); bomb.update(); bullets.killbullets(plane.sprite,32); } 在这里我不得不提一句,将生命概念封装在GameObject中是很好的(其实我们只是将其用作显示关键字),但将生命周期安排在GameObject中有欠妥当,生命周期也不一定就是基于桢的,有时基于时间,有时还有别的什么。我是说她足够复杂到交给另一个独立类处理,在这里实际需要的是一个足够强大的显示方法,其支持以桢数为参数显示罢了。
|
||||||||
| 最近更新 ( 2008-04-12 ) | ||||||||
尚无评论发表