j2me简易赛车游戏

来源:互联网 发布:java成员方法 编辑:程序博客网 时间:2024/04/28 05:12

 效果图:

MIDlet代码:

Code:
  1. package com.javaME.MyRacingGames;  
  2.   
  3. import javax.microedition.lcdui.Display;  
  4. import javax.microedition.midlet.MIDlet;  
  5. import javax.microedition.midlet.MIDletStateChangeException;  
  6.   
  7. public class HelloRacingGames extends MIDlet {  
  8.     private Display dis;  
  9.       
  10.       
  11.     public HelloRacingGames() {  
  12.         // TODO Auto-generated constructor stub  
  13.     }  
  14.   
  15.     protected void destroyApp(boolean arg0) throws MIDletStateChangeException {  
  16.         // TODO Auto-generated method stub  
  17.   
  18.     }  
  19.   
  20.     protected void pauseApp() {  
  21.         // TODO Auto-generated method stub  
  22.   
  23.     }  
  24.   
  25.     protected void startApp() throws MIDletStateChangeException {  
  26.         // TODO Auto-generated method stub  
  27.         dis = Display.getDisplay(this);  
  28.         CarRaceCanvas canvas = new CarRaceCanvas();  
  29.         dis.setCurrent(canvas);  
  30.     }  
  31.   
  32. }  

自定义的GameCanvas代码:

Code:
  1. package com.javaME.MyRacingGames;  
  2.   
  3. import java.util.Random;  
  4.   
  5. import javax.microedition.lcdui.Command;  
  6. import javax.microedition.lcdui.CommandListener;  
  7. import javax.microedition.lcdui.Displayable;  
  8. import javax.microedition.lcdui.Font;  
  9. import javax.microedition.lcdui.Graphics;  
  10. import javax.microedition.lcdui.Image;  
  11. import javax.microedition.lcdui.game.GameCanvas;  
  12. import javax.microedition.lcdui.game.Sprite;  
  13.   
  14. public class CarRaceCanvas extends GameCanvas implements CommandListener,  
  15.         Runnable {  
  16.     private Graphics gra;  
  17.     // 定义按钮  
  18.     private Command cmdStart = new Command("开始", Command.SCREEN, 1);  
  19.     private Command cmdPause = new Command("暂停", Command.SCREEN, 1);  
  20.   
  21.     private Sprite myCar;  
  22.     private Sprite[] enemy = new Sprite[5];  
  23.   
  24.     private Thread game;  
  25.     private boolean loop = true;  
  26.   
  27.     private int road;  
  28.     private Random rnd = new Random();  
  29.     private int score = 100;  
  30.     private Font font = null;  
  31.   
  32.     public CarRaceCanvas() {  
  33.         super(true);  
  34.         this.prepareResource();  
  35.         this.addCommand(cmdStart);  
  36.         this.setCommandListener(this);  
  37.         gra = this.getGraphics();  
  38.         font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE);  
  39.     }  
  40.   
  41.     // 初始化资源  
  42.     public void prepareResource() {  
  43.         try {  
  44.             Image myImage = Image.createImage("/myCar.gif");  
  45.             myCar = new Sprite(myImage);  
  46.   
  47.             for (int i = 0; i < enemy.length; i++) {  
  48.                 Image enemyImg = Image.createImage("/enemy.gif");  
  49.                 enemy[i] = new Sprite(enemyImg);  
  50.             }  
  51.         } catch (Exception e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.   
  55.         for (int i = 0; i < enemy.length; i++) {  
  56.             setEnemy(i);  
  57.         }  
  58.   
  59.         myCar.setPosition((this.getWidth() - myCar.getWidth()) / 2, (this  
  60.                 .getHeight() - myCar.getHeight()) / 2);  
  61.     }  
  62.   
  63.     public void run() {  
  64.         while (loop) {  
  65.             drawScreen();  
  66.             int state = this.getKeyStates();  
  67.             switch (state) {  
  68.             case GameCanvas.LEFT_PRESSED:  
  69.                 myCar.move(-100);  
  70.                 judgeMyCar();  
  71.                 break;  
  72.             case GameCanvas.UP_PRESSED:  
  73.                 myCar.move(0, -10);  
  74.                 judgeMyCar();  
  75.                 break;  
  76.             case GameCanvas.DOWN_PRESSED:  
  77.                 myCar.move(010);  
  78.                 judgeMyCar();  
  79.                 break;  
  80.             case GameCanvas.RIGHT_PRESSED:  
  81.                 myCar.move(100);  
  82.                 judgeMyCar();  
  83.                 break;  
  84.             }  
  85.   
  86.             try {  
  87.                 Thread.sleep(50);  
  88.             } catch (Exception e) {  
  89.                 e.printStackTrace();  
  90.             }  
  91.         }  
  92.     }  
  93.   
  94.     // 判断自己的车是否出界  
  95.     public void judgeMyCar() {  
  96.         if (myCar.getX() < 0) {  
  97.             myCar.setPosition(0, myCar.getY());  
  98.         } else if (myCar.getY() > this.getHeight() - myCar.getHeight()) {  
  99.             myCar.setPosition(myCar.getX(), this.getHeight()  
  100.                     - myCar.getHeight());  
  101.         } else if (myCar.getX() > this.getWidth() - myCar.getWidth()) {  
  102.             myCar.setPosition(this.getWidth() - myCar.getWidth(), myCar.getY());  
  103.         } else if (myCar.getY() < 0) {  
  104.             myCar.setPosition(myCar.getX(), 0);  
  105.         }  
  106.     }  
  107.     //设置敌人的位置  
  108.     public void setEnemy(int en) {  
  109.         int x, y;  
  110.         loop: while (true) {  
  111.             x = rnd.nextInt((intthis.getWidth() - enemy[en].getWidth());  
  112.             y = -rnd.nextInt(this.getWidth() * 10);  
  113.             enemy[en].setPosition(x, y);  
  114.             //防止敌人车辆重叠  
  115.             for (int j = 0; j < enemy.length; j++) {  
  116.                 if (j != en && enemy[j].collidesWith(enemy[en], true)) {  
  117.                     continue loop;  
  118.                 }  
  119.             }  
  120.             break;  
  121.         }  
  122.     }  
  123.   
  124.     // 按钮事件  
  125.     public void commandAction(Command cmd, Displayable dis) {  
  126.         if (cmd == cmdStart) {  
  127.             loop = true;  
  128.             game = new Thread(this);  
  129.             game.start();  
  130.             this.removeCommand(cmdStart);  
  131.             this.addCommand(cmdPause);  
  132.         } else if (cmd == cmdPause) {  
  133.             loop = false;  
  134.             game = null;  
  135.             this.removeCommand(cmdPause);  
  136.             this.addCommand(cmdStart);  
  137.         }  
  138.     }  
  139.   
  140.     public void drawScreen() {  
  141.         gra.setColor(120120120);  
  142.         gra.fillRect(00this.getWidth(), this.getHeight());  
  143.   
  144.         drawRoad();  
  145.   
  146.         gra.setColor(25500);  
  147.         gra.setFont(font);  
  148.   
  149.         for (int i = 0; i < enemy.length; i++) {  
  150.             enemy[i].move(015);  
  151.             enemy[i].paint(gra);  
  152.             if (enemy[i].getY() > this.getHeight()) {  
  153.                 setEnemy(i);  
  154.             }  
  155.             check(enemy[i]);  
  156.         }  
  157.   
  158.         gra.drawString("当前分数:" + score, this.getWidth() / 20, Graphics.TOP  
  159.                 | Graphics.HCENTER);  
  160.   
  161.         myCar.paint(gra);  
  162.         this.flushGraphics();  
  163.     }  
  164.   
  165.     public void drawRoad() {  
  166.         road += 80;  
  167.   
  168.         gra.setColor(255255255);  
  169.         gra.fillRect((intthis.getWidth() / 2 - 10, road, 20150);  
  170.         if (road >= this.getHeight()) {  
  171.             road = -150;  
  172.         }  
  173.     }  
  174.   
  175.     // 用于敌人的车辆相互碰撞的检测  
  176.     public void checkEnemy(Sprite s) {  
  177.         for (int i = 0; i < enemy.length; i++) {  
  178.             if (s != enemy[i]) {  
  179.                 if (s.collidesWith(enemy[i], true)) {  
  180.                     if (s.getX() > enemy[i].getX()) {  
  181.                         s.move(200);  
  182.                         enemy[i].move(-200);  
  183.                     } else {  
  184.                         s.move(-200);  
  185.                         enemy[i].move(200);  
  186.                     }  
  187.                 }  
  188.             }  
  189.         }  
  190.     }  
  191.   
  192.     // 用于自己的车辆和敌方的车辆碰撞检测  
  193.     public void check(Sprite en) {  
  194.         if (myCar.collidesWith(en, true)) {  
  195.             score--;  
  196.             if (myCar.getX() > en.getX()) {  
  197.                 en.move(-200);  
  198.                 myCar.move(200);  
  199.                 checkEnemy(en);  
  200.             } else {  
  201.                 en.move(200);  
  202.                 myCar.move(-200);  
  203.                 checkEnemy(en);  
  204.             }  
  205.         }  
  206.   
  207.         if (score == 0) {  
  208.             loop = false;  
  209.             game = null;  
  210.   
  211.             gra.setColor(120120120);  
  212.             gra.fillRect(00, getWidth(), getHeight());  
  213.             gra.setColor(25500);  
  214.             gra.setFont(font);  
  215.             gra.drawString("您输了"this.getWidth() / 220, Graphics.TOP  
  216.                     | Graphics.HCENTER);  
  217.             this.removeCommand(cmdPause);  
  218.             this.removeCommand(cmdStart);  
  219.         }  
  220.     }  
  221. }