Java 动画实现

bblzh110

贡献于2012-05-23

字数:7778 关键词: Java开发 Java

动画2 这一讲我们继续学习动画。 好呀,好想马上就能制作Java游戏啊。 恩,学习了本讲,就离制作真正的Java程序又近了一步了啊。 1. 上一讲的程序 先来看一下上一讲我们学习的程序。 import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Display; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; /** * 车动画 */ public class CarAnimation extends MIDlet { private Canvas canvas; private Display display; /** * 开始方法 */ protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); canvas = new CarCanvas(); display.setCurrent(canvas); } protected void pauseApp() { } protected void destroyApp(boolean bool) throws MIDletStateChangeException { } } import java.io.IOException; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; /** * 车动画canvas */ public class CarCanvas extends Canvas implements Runnable{ private Image carImage; private int x = 130;//x坐标 private int y = 130;//y坐标 /** * 构造器 */ public CarCanvas(){ try { carImage = Image.createImage("/car2.png"); } catch (IOException e) { e.printStackTrace(); } //使用线程 Thread th = new Thread(this);//制作新线程 th.start();//开始线程 } /** * 描画用方法 */ protected void paint(Graphics g) { //描画与画面大小一样的长方形 g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); //显示图像 g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER); } /** * 运行线程的处理 */ public void run() { while(true){ y++; x -= 2; //到达一端后从相反端出来 if(x < 0)x = getWidth(); if(y > getHeight()) y = 0; repaint(); try{ Thread.sleep(100);//100毫秒待机 }catch(InterruptedException e){ } } } } 2. 制作游戏 上一讲我们制作了使车移动的程序,这一讲把这个程序改造一下,制作一个游戏程序怎么样? 噢!游戏啊!是不是太难了啊。 没关系。游戏也不复杂,小尼克应该了解的吧。 是什么样的游戏呢? 躲闪障碍物,最后到达终点的racing game。来试试制作可以移动障碍物的车程序吧。 真有你说的那么简单么… 当然了,用目前为止咱们学的就够了。下面是制作步骤,按照这个步骤试试吧。 1. 准备图像 2. 车的操作 3. 配置障碍物 4. 移动障碍物 5. 判定与障碍物的冲突 2.1. 准备图像 首先要准备游戏使用的图像。本讲除了要准备车的图像之外,还要准备障碍物的车的图像。     2.2. 车的操作 下面我们对车进行改造,利用十字键使车左右移动。 要使用以前用过的key event吧。 没错,那么尼克你就做做看吧。 是这样么?改造CarCanvas,使按左右键时改变x坐标。 import java.io.IOException; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; /** * 车动画canvas */ public class CarCanvas extends Canvas implements Runnable{ private Image carImage; private int x = 100;//x坐标 private int y = 180;//y坐标 /** * 构造器 */ public CarCanvas(){ try { carImage = Image.createImage("/car3.png"); } catch (IOException e) { e.printStackTrace(); } //使用线程 Thread th = new Thread(this);//制作新线程 th.start();//开始线程 } /** * 描画用方法 */ protected void paint(Graphics g) { //描画与画面大小一样的长方形 g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); //显示图像 g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER); } /** * 运行线程的处理 */ public void run() { while(true){ y--; //到达一端后从相反端出来 if(x < 0)x = getWidth(); if(y > getHeight()) y = 0; repaint(); try{ Thread.sleep(100);//100毫秒待机 }catch(InterruptedException e){ } } } /************************************************** * key event处理 **************************************************/ /** * 键被按下时的处理 */ protected void keyPressed(int key) { int gameaction = getGameAction(key); switch(gameaction){ case Canvas.RIGHT: x += 3; break; case Canvas.LEFT: x -= 3; break; default : } } } 这样就可以用左右键来控制车的左右移动了。 2.3. 配置障碍物 好,这样就使车移动了。下面是配置障碍物的车,先试着在(30,30)的位置配置一个看看。 好的。 import java.io.IOException; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; /** * 车动画canvas */ public class CarCanvas extends Canvas implements Runnable{ private Image carImage; private Image enemyImage; private int x = 100;//x坐标 private int y = 180;//y坐标 /** * 构造器 */ public CarCanvas(){ try { carImage = Image.createImage("/car3.png"); enemyImage = Image.createImage("/enemycar.png"); } catch (IOException e) { e.printStackTrace(); } //使用线程 Thread th = new Thread(this);//制作新线程 th.start();//开始线程 } /** * 描画用方法 */ protected void paint(Graphics g) { //描画与画面大小一样的长方形 g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); //显示图像 g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER); g.drawImage(enemyImage,30,30,Graphics.HCENTER|Graphics.VCENTER); } /** * 运行线程的处理 */ public void run() { while(true){ y--; //到达一端后从相反端出来 if(x < 0)x = getWidth(); if(y > getHeight()) y = 0; repaint(); try{ Thread.sleep(100);//100毫秒待机 }catch(InterruptedException e){ } } } /************************************************** * key event处理 **************************************************/ /** * 键被按下时的处理 */ protected void keyPressed(int key) { int gameaction = getGameAction(key); switch(gameaction){ case Canvas.RIGHT: x += 3; break; case Canvas.LEFT: x -= 3; break; default : } } } 使用上一讲学的就可以了吧…      接下来就试着使障碍物移动吧。 如果静止不动会显得很奇怪啊。 那你知道怎么使障碍物移动么? 设障碍物的坐标为变量,利用线程处理对它进行改变。 import java.io.IOException; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; /** * 车动画canvas */ public class CarCanvas extends Canvas implements Runnable{ private Image carImage; private Image enemyImage; private int x = 100;//x坐标 private int y = 180;//y坐标 private int enemyX = 30;//敌人x坐标 private int enemyY = 30;//敌人y坐标 /** * 构造器 */ public CarCanvas(){ try { carImage = Image.createImage("/car3.png"); enemyImage = Image.createImage("/enemycar.png"); } catch (IOException e) { e.printStackTrace(); } //使用线程 Thread th = new Thread(this);//制作新线程 th.start();//开始线程 } /** * 描画用方法 */ protected void paint(Graphics g) { //描画与画面大小一样的长方形 g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); //显示图像 g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER); g.drawImage(enemyImage,enemyX,enemyY,Graphics.HCENTER|Graphics.VCENTER); } /** * 运行线程的处理 */ public void run() { while(true){ y--; enemyX += 3; //到达一端后从相反端出来 if(x < 0)x = getWidth(); if(y > getHeight()) y = 0; if(enemyX > getWidth())enemyX = 0; repaint(); try{ Thread.sleep(100);//100毫秒待机 }catch(InterruptedException e){ } } } /************************************************** * key event处理 **************************************************/ /** * 键被按下时的处理 */ protected void keyPressed(int key) { int gameaction = getGameAction(key); switch(gameaction){ case Canvas.RIGHT: x += 3; break; case Canvas.LEFT: x -= 3; break; default : } } } 利用线程处理改变障碍物的坐标,就能使障碍物移动了。   2.4. 判定与障碍物的冲突 最后是判定与障碍物的冲突。与障碍物发生冲突后,游戏就停顿了。 自己的车与障碍物的车发生冲突,游戏停顿…恩,自己的车的图像与障碍物的车的图像开始重合,就是发生冲突了吧? 就是这样。 那么就必须要知道图像的尺寸了。 要取得图像的尺寸可以使用以下两个方法。 image.getHeight(); image.getWidth’(); 使用上面两个方法,制作判定车与障碍物的冲突的if语句吧。要注意的是,车与障碍物的坐标都要位于图像的中心。 好,是下面这样么? //冲突判定 if(x-carImage.getWidth()/2 < enemyX + enemyImage.getWidth()/2 && x+carImage.getWidth()/2 > enemyX - enemyImage.getWidth()/2){ if(y-carImage.getHeight()/2 < enemyY + enemyImage.getHeight()/2 && y+carImage.getHeight()/2 > enemyY - enemyImage.getHeight()/2){ //发生冲突时的处理 } } 哦,做的不错啊。那么使游戏停顿的处理如下所示。 wait() Wait方法可以停止线程的处理,这时会有例外发生。 那就必须要加入例外处理了? 恩,没错。加到程序里面试试吧。 加入使游戏停顿的处理后的source code是这样的吧。 import java.io.IOException; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; /** * 车动画canvas */ public class CarCanvas extends Canvas implements Runnable{ private Image carImage; private Image enemyImage; private int x = 100;//x坐标 private int y = 180;//y坐标 private int enemyX = 30;//敌人x坐标 private int enemyY = 30;//敌人y坐标 /** * 构造器 */ public CarCanvas(){ try { carImage = Image.createImage("/car3.png"); enemyImage = Image.createImage("/enemycar.png"); } catch (IOException e) { e.printStackTrace(); } //使用线程 Thread th = new Thread(this);//制作新线程 th.start();//开始线程 } /** * 描画用方法 */ protected void paint(Graphics g) { //描画与画面大小一样的长方形 g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); //显示图像 g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER); g.drawImage(enemyImage,enemyX,enemyY,Graphics.HCENTER|Graphics.VCENTER); } /** * 运行线程的处理 */ public void run() { while(true){ y--; enemyX += 3; //到达一端后从相反端出来 if(x < 0)x = getWidth(); if(y > getHeight()) y = 0; if(enemyX > getWidth())enemyX = 0; //冲突判定 try { if(x-carImage.getWidth()/2 < enemyX + enemyImage.getWidth()/2 && x+carImage.getWidth()/2 > enemyX - enemyImage.getWidth()/2){ if(y-carImage.getHeight()/2 < enemyY + enemyImage.getHeight()/2 && y+carImage.getHeight()/2 > enemyY - enemyImage.getHeight()/2){ //发生冲突时的处理 wait();//使游戏停顿 } } } catch (InterruptedException e1) { } repaint(); try{ Thread.sleep(100);//100毫秒待机 }catch(InterruptedException e){ } } } /************************************************** * key event处理 **************************************************/ /** * 键被按下时的处理 */ protected void keyPressed(int key) { int gameaction = getGameAction(key); switch(gameaction){ case Canvas.RIGHT: x += 3; break; case Canvas.LEFT: x -= 3; break; default : } } } 计算各个坐标的位置,就可以得知是否与障碍物相撞了!     3. 结束语 这一讲的讲座学的如何呀? 恩,感觉把以前学的东西又复习了一遍,比想象中的要简单啊。 恩,没错。把本讲的程序进行改造,也可以制作出复杂的游戏呢。你可以试试增加一些障碍物,使程序变得更有意思一些。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ]
1 人已下载

下载文档

相关文档