课外天地 李树青学习天地清心茶舍 → [讨论]J2ME小程序——WallBall


  共有17028人关注过本帖树形打印复制链接

主题:[讨论]J2ME小程序——WallBall

帅哥哟,离线,有人找我吗?
tonydark
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:9 积分:506 威望:0 精华:0 注册:2008/9/19 7:54:43
[讨论]J2ME小程序——WallBall  发帖心情 Post By:2008/10/30 23:22:34 [只看该作者]

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.util.Random;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.Canvas;
import javax.microedition.media.Manager;
import javax.microedition.media.Player;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;


public class WallBall extends MIDlet {

    public static WallBall instance;
    WelcomeForm wf = new WelcomeForm("欢迎");

    public WallBall() {
        instance = this;
    }

    public void startApp() {
        Display.getDisplay(this).setCurrent(wf);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

//
class WelcomeForm extends Form implements CommandListener {

    Command CMD_Game = new Command("壁球", Command.OK, 1);
    StartList sl = new StartList("CHOICE");

    public WelcomeForm(String str) {
        super(str);
        this.addCommand(CMD_Game);
        this.setCommandListener(this);
    }

    public void commandAction(Command c, Displayable display) {
        if (c == CMD_Game) {
            Display.getDisplay(WallBall.instance).setCurrent(sl);
        }
    }
}
//游戏的选项列界面
class StartList extends List implements CommandListener {

    DrawPanel dp = new DrawPanel();
    GameLevel gl = new GameLevel();
    MusicList ml = new MusicList();
    HeroList hl = new HeroList();
    Command CMD_OK = new Command("OK", Command.OK, 1);
    Command CMD_hBack = new Command("BACK", Command.BACK, 1);
    int index;
    TextBox helpTB = new TextBox("HELP DOCUMENT", "", 100, TextField.UNEDITABLE);
    static musicPlayer mp;

    public StartList(String str) {
        super(str, List.IMPLICIT);
        this.addCommand(CMD_OK);
        this.setCommandListener(this);
        this.append("新游戏", null);
        this.append("难度 : " + GameLevel.hardOfGame, null);
        this.append("音乐 : " + MusicList.selected, null);
        this.append("英雄榜", null);
        this.append("使用说明", null);
    }

    public void commandAction(Command c, Displayable arg1) {
        if (c == CMD_OK) {
            index = this.getSelectedIndex();
            if (index == 0) {
                DrawPanel.life = 3;
                String str = "OPEN";
                if (MusicList.selected == str) {  //有警告提示,如何解决?
                    mp = new musicPlayer();
                    mp.player();
                }
                Display.getDisplay(WallBall.instance).setCurrent(dp);
            } else if (index == 1) {
                Display.getDisplay(WallBall.instance).setCurrent(gl);
            } else if (index == 2) {
                Display.getDisplay(WallBall.instance).setCurrent(ml);
            } else if (index == 3) {
                Display.getDisplay(WallBall.instance).setCurrent(hl);
            } else if (index == 4) {
                String str = "壁球游戏" + "\n" + "你可以使用方向键或数字键控制挡板移动" + "\n" + "小球接触底边界LIFE减少一" + "\n" + "当LIFE归零,游戏结束";
                helpTB.setString(str);
                helpTB.addCommand(CMD_hBack);
                helpTB.setCommandListener(this);
                Display.getDisplay(WallBall.instance).setCurrent(helpTB);
            }
        } else if (c == CMD_hBack) {
            Display.getDisplay(WallBall.instance).setCurrent(new StartList("Chioce"));
        }
    }
}

//NEW GAME PANEL
class DrawPanel extends Canvas implements CommandListener {

    //StartList startL = new StartList("选择");//新生成一个StartList对象,在后面的调用中会出现错误
    Command CMD_Pause = new Command("PAUSE", Command.OK, 1);
    Command CMD_Start = new Command("START", Command.OK, 1);
    Command CMD_Back = new Command("BACK", Command.BACK, 1);
    StoreInfo si;
    int Broad_X;    //挡板的相对位置
    int ball = 30 - GameLevel.hardOfGame * 2;   //小球的直径
    int Broad_width = 60;  //挡板的宽度
    int Broad_height = 8;  //挡板的高度
    int ball_X;  //小球在水平方向上的相对位置
    int ball_Y;  //小球在垂直方向上的相对位置
    int level = 2 * (GameLevel.hardOfGame) + 3;  //小球一次移动的步幅
    int go_X = level;  //小球水平方向上每步移动的距离
    int go_Y = level;  //小球垂直方向上每步移动的距离
    static int life = 3;  //游戏初始生命
    static int recode;    //记录游戏上一次所得的分数
    int score = recode;   //初始化分数
    boolean flag = false; //确定是否重绘画面
    boolean pause = false;//确定游戏是否处于暂停状态
    public DrawPanel() {
        this.addCommand(CMD_Start);
        this.addCommand(CMD_Back);
        this.setCommandListener(this);
    }

    protected void paint(Graphics g) {
        Clear(g);
        this.setTitle("壁球" + "  Life : " + life + "    Lelve :" + GameLevel.hardOfGame + "     Score :" + score);

        //挡板的初始位置及颜色
        g.setColor(0, 0, 0);
        g.fillRect((getWidth() - Broad_width) / 2 + Broad_X, getHeight() - Broad_height, Broad_width, Broad_height);
        //小球的初始位置及颜色
        g.setColor(0, 0, 255);
        g.fillArc(getWidth() / 2 - ball / 2 + ball_X, getHeight() - ball - Broad_height + ball_Y, ball, ball, 0, 360);
        //NOTCE,THE GAME IS PAUSING
        if (pause == true) {
            g.setColor(255, 0, 0);
            Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE);
            g.setFont(font);
            String str = "游戏暂停中";
            int fontWidth = font.stringWidth(str);
            g.drawString(str, getWidth() / 2 + fontWidth / 2, getHeight() / 2, Graphics.TOP | Graphics.RIGHT);
        }

    }
//清屏
    private void Clear(Graphics g) {
        g.setColor(255, 255, 255);
        g.fillRect(0, 0, getWidth(), getHeight());
    }

    protected void keyPressed(int keyCode) {
        if (flag == true) {
            int code = getGameAction(keyCode);//功能区按键
            if (code == Canvas.LEFT || keyCode == Canvas.KEY_NUM4) {
                if (getWidth() / 2 - 30 + Broad_X > 0) {
                    Broad_X -= 5;
                }
            }
            if (code == Canvas.RIGHT || keyCode == Canvas.KEY_NUM6) {
                if (getWidth() / 2 + 30 + Broad_X < getWidth()) {
                    Broad_X += 5;
                }
            }
            repaint();
        }
    }

    protected void keyRepeated(int keyCode) {
        keyPressed(keyCode);
    }

    public void commandAction(Command c, Displayable display) {
        if (c == CMD_Start) {
            this.addCommand(CMD_Pause);
            this.removeCommand(CMD_Start);
            flag = true;
            pause = false;
            Thread thread = new Thread(new getChange());//由事件监听启动一个全新的线程
            thread.start();//线程开始
        } else if (c == CMD_Pause) {
            this.removeCommand(CMD_Pause);
            this.addCommand(CMD_Start);
            flag = false;
            pause = true;
        } else if (c == CMD_Back) {
            life = 3;//退出游戏,信息初始化
            score = recode = 0;
            try {//停止音乐的播放
                StartList.mp.p.stop();
            } catch (Exception e) {
                System.err.println(e.getMessage());
            }
            Display.getDisplay(WallBall.instance).setCurrent(new StartList("Choice"));//如果使用上面生成的实例会出错
        }
    }

    //内部类,用于获取小球的移动方向
    class getChange implements Runnable {

        public void run() {

            while (flag) {
                //小球至右边界
                if ((getWidth() + ball) / 2 + ball_X >= getWidth()) {
                    go_X = -level;
                    System.out.println(go_X);
                }
                //小球至左边界
                if ((getWidth() - ball) / 2 + ball_X <= 0) {
                    go_X = level;
                }
                //小球至上边界
                if (getHeight() - Broad_height - ball + ball_Y <= 0) {
                    go_Y = level;
                }
                //小球至下边界
                if (Broad_height / 2 - ball_Y <= 0) {
                    flag = false;
                    if (life > 0) {
                        life--;//生命减一
                        recode = score;//存储这一次的分数
                        Display.getDisplay(WallBall.instance).setCurrent(new DrawPanel());
                    } else if (life == 0) {
                        try {//停止音乐的播放
                            StartList.mp.p.stop();
                        } catch (Exception e) {
                            System.err.println(e.getMessage());
                        }
                        recode = score;
                        Display.getDisplay(WallBall.instance).setCurrent(new StoreInfo());
                        recode = 0;//将分数记录器数值归零
                    }

                }
                //小球碰撞挡板,判断语句可以简化,但为了便于理解这里不作简化
                if (ball_Y >= 0 && getWidth() / 2 - ball / 2 + ball_X >= (getWidth() - Broad_width) / 2 + Broad_X - ball && getWidth() / 2 - ball / 2 + ball_X <= (getWidth() + Broad_width) / 2 + Broad_X) {
                    Random r = new Random();
                    go_Y = -level;
                    score += (int) (r.nextFloat() * 2 + GameLevel.hardOfGame);//小球每一次被挡板挡回,玩家所得的分数
                }
                ball_X += go_X;
                ball_Y += go_Y;
                try {
                    Thread.sleep(100);
                } catch (Exception e) {
                }
                repaint();
            }
        }
    }
}
//播放背景音乐,音乐功能有较多的漏洞,其加载音频文件的速度很忙
class musicPlayer {

    InputStream in;
    Player p;

    public void player() {

        try {
            in = getClass().getResourceAsStream("/musics/music.wav");
            p = Manager.createPlayer(in, "audio/x-wav");
            p.setLoopCount(Player.UNREALIZED);//音乐循环的次数,在加载了指定的音频文件后才能指定其循环的次数
            p.start();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    }
//游戏难度界面
class GameLevel extends Canvas implements CommandListener {

    int process_width = 140;//进度条的宽度
    int process_height = 20;//进度条的高度
    int Level;
    static int hardOfGame;//静态变量,游戏的难度等级
    String title = "Choice the level of the game";
    Command CMD_OK = new Command("OK", Command.OK, 1);
    Command CMD_BACK = new Command("BACK", Command.BACK, 1);
    // StartList s=new StartList("Choice");
    public GameLevel() {
        this.setTitle(title);
        this.addCommand(CMD_OK);
        this.addCommand(CMD_BACK);
        this.setCommandListener(this);
        Level = hardOfGame * (process_width / 5);//难度进度条初始位置
    }

    protected void paint(Graphics g) {
        g.setColor(255, 255, 255);
        g.fillRect(0, 0, getWidth(), getHeight());//清屏
        //EASY OR HARD
        g.setColor(255, 0, 0);
        Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE);//字体设置
        g.setFont(font);
        String str = "Easy";
        int fontWidth = font.stringWidth(str);
        int fontHeight = font.getHeight();
        g.drawString(str, getWidth() / 2 - fontWidth - process_width / 2 - 10, getHeight() / 2 + fontHeight / 2 - process_height, Graphics.TOP | Graphics.LEFT);
        str = "Hard";
        g.drawString(str, getWidth() / 2 + fontWidth + process_width / 2 + 10, getHeight() / 2 + fontHeight / 2 - process_height, Graphics.TOP | Graphics.RIGHT);
        //进度条外框
        g.setColor(0, 255, 0);
        g.drawRect((getWidth() - process_width) / 2 - 1, (getHeight() - process_height) / 2 - 1, process_width + 1, process_height + 1);
        //进度条
        g.fillRect((getWidth() - process_width) / 2, (getHeight() - process_height) / 2, Level, process_height);

    }

    protected void keyPressed(int keyCode) {
        int code = getGameAction(keyCode);
        if (code == Canvas.RIGHT) {
            if (Level < process_width) {
                Level = Level + process_width / 5;
            }
        } else if (code == Canvas.LEFT) {
            if (Level > 0) {
                Level = Level - process_width / 5;
            }
        }
        repaint();
    }

    public void commandAction(Command c, Displayable display) {
        if (c == CMD_OK) {
            hardOfGame = (int) Level / (process_width / 5);
            Display.getDisplay(WallBall.instance).setCurrent(new StartList("CHOICE"));
        } else if (c == CMD_BACK) {
            Display.getDisplay(WallBall.instance).setCurrent(new StartList("CHOICE"));
        }
    }
}
//Music interface
class MusicList extends List implements CommandListener {

    static String selected;
    Command CMD_OK = new Command("OK", Command.OK, 1);

    public MusicList() {
        super("MUSIC", List.EXCLUSIVE);
        this.append("CLOSE", null);
        this.append("OPEN", null);
        this.addCommand(CMD_OK);
        this.setCommandListener(this);
    }

    public void commandAction(Command c, Displayable arg1) {
        if (c == CMD_OK) {
            if (this.getSelectedIndex() == 0) {
                selected = "CLOSE";
            } else if (this.getSelectedIndex() == 1) {
                selected = "OPEN";
            }
            Display.getDisplay(WallBall.instance).setCurrent(new StartList("CHIOCE"));
        }
    }
}
//英雄榜界面
class HeroList extends List implements CommandListener {

    Heros[] hs;
    StoreInfo si = new StoreInfo();
    Command CMD_BACK = new Command("BACK", Command.BACK, 1);

    public HeroList() {
        super("HERO LIST", List.IMPLICIT);
        this.addCommand(CMD_BACK);
        getList();
        this.setCommandListener(this);
    }

    public void commandAction(Command c, Displayable arg1) {
        if (c == CMD_BACK) {
            Display.getDisplay(WallBall.instance).setCurrent(new StartList("CHIOCE"));
        }
    }
    //信息的读取
    public void getList() {
        RecordStore rs = null;
        try {
            rs = RecordStore.openRecordStore("HerosRMS", false);
            int i = 0;
            RecordEnumeration re = rs.enumerateRecords(null, null, false);
            hs = new Heros[re.numRecords()];
            while (re.hasNextElement()) {
                byte[] data = re.nextRecord();
                hs[i] = Heros.deserialize(data);
                this.append(hs[i].toString(), null);
                i++;
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }

    }
}
//储存玩家姓名及分数信息
class StoreInfo extends Form implements CommandListener {

    Command CMD_SAVE = new Command("SAVE", Command.OK, 1);
    TextField name = new TextField("YOUR NAME", "", 20, TextField.ANY);
    Heros h;
    Heros[] hs;
    int s = DrawPanel.recode;

    public StoreInfo() {
        super("GAME OVER--SCORE : " + DrawPanel.recode);
        this.append(name);
        this.addCommand(CMD_SAVE);
        this.setCommandListener(this);
    }

    public void commandAction(Command c, Displayable arg1) {
        if (c == CMD_SAVE) {
            //向内存管理器存储信息
            //信息的储存
            RecordStore rs = null;
            try {
                rs = RecordStore.openRecordStore("HerosRMS", true);
                h = new Heros(name.getString(), s);
                byte[] data = h.serialize();
                rs.addRecord(data, 0, data.length);
                rs.closeRecordStore();
            } catch (Exception e) {
                System.err.println(e.getMessage());
            }
            Display.getDisplay(WallBall.instance).setCurrent(new StartList("CHIOCE"));
        }
    }
}

class Heros {

    private String Name;
    private int Score;
    //无参构造函数
    public Heros() {
    }
    //带参构造函数
    public Heros(String Name, int Score) {
        this.Name = Name;
        this.Score = Score;
    }

    public String getName() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }

    public int getScore() {
        return Score;
    }

    public void setScore(int Score) {
        this.Score = Score;
    }

    public byte[] serialize() {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            DataOutputStream dos = new DataOutputStream(baos);
            dos.writeUTF(this.Name);
            dos.writeInt(this.Score);
            baos.close();
            dos.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return baos.toByteArray();
    }

    public static Heros deserialize(byte[] data) {
        Heros heros = new Heros();
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        DataInputStream dis = new DataInputStream(bais);
        try {
            heros.Name = dis.readUTF();
            heros.Score = dis.readInt();
            bais.close();
            dis.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return heros;
    }
//返回有效数据
    public String toString() {
        return Name + " : " + Score;
    }
}

//该程序还有不是的漏洞和不足,有兴趣的可以根据自己的需求调整        

[此贴子已经被admin于2010-12-13 20:04:50编辑过]

 回到顶部