Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 332|回复: 0

[J2ME学习]声音演示程序:小鸡过街

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 01:58:28 | 显示全部楼层 |阅读模式
    MIDP 2.0手机支持的常见音频MIME类型:
    . audio/x-tone-seq 单个的音符和音符序列
    . audio/x-wav 声波声音
    . audio/mid MIMD 声乐
    . audio/mpeg MP3 音频 Player接口中提供了一些重要的方法来播放和控制声音播放 . realize():实现没有获取音频资源的播放器
    . prefetch():获取音频资源以减少播放滞后
    . getState():获取播放器的状态
    . setLoopCount():设置声音的循环次数
    . start():开始播放一个声音
    . stop():停止播放一个声音
    . getDuration():获取声音总的播放时间(毫秒)
    . getMediaTime():获取当前的播放点(毫秒),声音已经播放了多久
    . setMediaTime():设置当前的播放点(毫秒)
    . close():关闭播放器
      一、从一个jar文件中播放 try {
       Player musicPlayer;
       InputStream is = getClass().getResourceAsStream("/Music.mid");
       musicPlayer = Manager.createPlayer(is, "audio/midi");//创建播放器
       musicPlayer.prefetch();//确保声音已经准备好以最小的滞后播放。
       musicPlayer.start();//开始播放
    } catch (IOException ioe) { }
       catch (MediaException me) { } 二、播放来自url的音乐 try {
       Player musicPlayer;
       musicPlayer = Manager.createPlayer("http://yourserver/Music.mid");
       musicPlayer.prefetch();
       musicPlayer.start();
    }
       catch (IOException ioe) {
    }
       catch (MediaException me) {
    }  
      
       
       

         
       

         
       
      
    1. 三、声音演示程序:小鸡过街,来自《J2ME手机游戏编程入门》

    2. [img]http://img.javaxxz.com/2014/10/11/015806718.jpg[/img]

    3. 1、HCanvas.java
    4. import javax.microedition.lcdui.*;
    5. import javax.microedition.lcdui.game.*;
    6. import java.util.*;
    7. import java.io.*;
    8. import javax.microedition.media.*;
    9. import javax.microedition.media.control.*;
    10. public class HCanvas extends GameCanvas implements Runnable {
    11.   private Display  display;
    12.   private boolean  sleeping;
    13.   private long     frameDelay;
    14.   private int      inputDelay;
    15.   private Random   rand;
    16.   private Image    background;
    17.   private Image    chickenHead;
    18.   private Sprite   chickenSprite;//小鸡
    19.   private Sprite[] carSprite = new Sprite[4];//四个汽车
    20.   private int[]    carYSpeed = new int[4];//汽车在y方向上的速度
    21.   private boolean  gameOver;
    22.   private int      numLives;//开始时的小鸡数
    23.   private int      score;
    24.   private Player   musicPlayer;//背景音乐播放器
    25.   private Player   celebratePlayer;//
    26.   private Player   squishPlayer;
    27.   private Player   gameoverPlayer;
    28.   public HCanvas(Display d) {
    29.     super(true);
    30.     display = d;
    31.     // 设置帧速率(30 帧每秒)
    32.     frameDelay = 33;
    33.     // 清除输入延迟
    34.     inputDelay = 0;
    35.   }
    36.   
    37.   public void start() {
    38.     // 把canvas设置为当前屏幕
    39.     display.setCurrent(this);
    40.    
    41.     rand = new Random();
    42.    
    43.     gameOver = false;
    44.     numLives = 3;
    45.     score = 0;
    46.     //初始化背景图像,小鸡和汽车精灵
    47.     try {
    48.       background = Image.createImage("/Highway.png");
    49.       chickenHead = Image.createImage("/ChickenHead.png");
    50.       chickenSprite = new Sprite(Image.createImage("/Chicken.png"), 22, 22);
    51.       chickenSprite.setPosition(2, 77);
    52.       carSprite[0] = new Sprite(Image.createImage("/Car1.png"));
    53.       carSprite[0].setPosition(27, 0);
    54.       carYSpeed[0] = 3;
    55.       carSprite[1] = new Sprite(Image.createImage("/Car2.png"));
    56.       carSprite[1].setPosition(62, 0);
    57.       carYSpeed[1] = 1;
    58.       carSprite[2] = new Sprite(Image.createImage("/Car3.png"));
    59.       carSprite[2].setPosition(93, 67);
    60.       carYSpeed[2] = -2;
    61.       carSprite[3] = new Sprite(Image.createImage("/Car4.png"));
    62.       carSprite[3].setPosition(128, 64);
    63.       carYSpeed[3] = -5;//最后一辆汽车最快
    64.     }
    65.     catch (IOException e) {
    66.       System.err.println("Failed loading images!");
    67.     }
    68.     // 初始化声音和播放器
    69.     try {
    70.       InputStream is = getClass().getResourceAsStream("/Music.mid");//重复的背景音乐
    71.       musicPlayer = Manager.createPlayer(is, "audio/midi");
    72.       musicPlayer.prefetch();
    73.       is = getClass().getResourceAsStream("/Celebrate.wav");//小鸡过街后的庆祝声
    74.       celebratePlayer = Manager.createPlayer(is, "audio/X-wav");
    75.       celebratePlayer.prefetch();
    76.       is = getClass().getResourceAsStream("/Squish.wav");//小鸡被汽车压扁声
    77.       squishPlayer = Manager.createPlayer(is, "audio/X-wav");
    78.       squishPlayer.prefetch();
    79.       is = getClass().getResourceAsStream("/GameOver.wav");//游戏结束
    80.       gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
    81.       gameoverPlayer.prefetch();
    82.     }
    83.     catch (IOException ioe) {
    84.     }
    85.     catch (MediaException me) {
    86.     }
    87.     // 开始背景音乐
    88.     try {
    89.       musicPlayer.setLoopCount(-1);//-1表示无限次重复
    90.       musicPlayer.start();
    91.     }
    92.     catch (MediaException me) {
    93.     }
    94.    
    95.     sleeping = false;
    96.     Thread t = new Thread(this);
    97.     t.start();
    98.   }
    99.   
    100.   public void stop() {
    101.     // 关闭音乐和播放器
    102.     musicPlayer.close();
    103.     celebratePlayer.close();
    104.     squishPlayer.close();
    105.     gameoverPlayer.close();
    106.     // 停止动画
    107.     sleeping = true;
    108.   }
    109.   
    110.   public void run() {
    111.     Graphics g = getGraphics();
    112.    
    113.     // 游戏的主循环
    114.     while (!sleeping) {
    115.       update();
    116.       draw(g);
    117.       try {
    118.         Thread.sleep(frameDelay);
    119.       }
    120.       catch (InterruptedException ie) {}
    121.     }
    122.   }
    123.   private void update() {
    124.     // 游戏是否重新开始
    125.     if (gameOver) {
    126.       int keyState = getKeyStates();
    127.       if ((keyState & FIRE_PRESSED) != 0) {
    128.         
    129.         try {
    130.           musicPlayer.setMediaTime(0);
    131.           musicPlayer.start();
    132.         }
    133.         catch (MediaException me) {
    134.         }
    135.         chickenSprite.setPosition(2, 77);
    136.         gameOver = false;
    137.         score = 0;
    138.         numLives = 3;
    139.       }
    140.       // 游戏已结束,不必作任何更新
    141.       return;
    142.     }
    143.     // 处理用户输入以移动小鸡
    144.     if (++inputDelay > 2) {
    145.       int keyState = getKeyStates();
    146.       if ((keyState & LEFT_PRESSED) != 0) {
    147.         chickenSprite.move(-6, 0);
    148.         chickenSprite.nextFrame();
    149.       }
    150.       else if ((keyState & RIGHT_PRESSED) != 0) {
    151.         chickenSprite.move(6, 0);
    152.         chickenSprite.nextFrame();
    153.       }
    154.       if ((keyState & UP_PRESSED) != 0) {
    155.         chickenSprite.move(0, -6);
    156.         chickenSprite.nextFrame();
    157.       }
    158.       else if ((keyState & DOWN_PRESSED) != 0) {
    159.         chickenSprite.move(0, 6);
    160.         chickenSprite.nextFrame();
    161.       }
    162.       checkBounds(chickenSprite, false);
    163.       // 重置输入延迟,这个变量用来调整按键的响应
    164.       inputDelay = 0;
    165.     }
    166.     // 小鸡是否通过
    167.     if (chickenSprite.getX() > 154) {
    168.       // 放庆祝声
    169.       try {
    170.         celebratePlayer.start();
    171.       }
    172.       catch (MediaException me) {
    173.       }
    174.       //重置小鸡位置并加分
    175.       chickenSprite.setPosition(2, 77);
    176.       score += 25;
    177.     }
    178.     // 更新汽车
    179.     for (int i = 0; i < 4; i++) {
    180.       // 移动汽车
    181.       carSprite[i].move(0, carYSpeed[i]);
    182.       checkBounds(carSprite[i], true);
    183.       // 检查小鸡和汽车是不有冲突
    184.       if (chickenSprite.collidesWith(carSprite[i], true)) {
    185.         // 放小鸡被压扁的声音
    186.         try {
    187.           squishPlayer.start();
    188.         }
    189.         catch (MediaException me) {
    190.         }
    191.         // 检查游戏是否结束
    192.         if (--numLives == 0) {
    193.           // 停止背景音乐并放游戏结束的声音
    194.           try {
    195.             musicPlayer.stop();
    196.             gameoverPlayer.start();
    197.           }
    198.           catch (MediaException me) {
    199.           }
    200.           gameOver = true;
    201.         } else {
    202.           // 重轩小鸡
    203.           chickenSprite.setPosition(2, 77);
    204.         }
    205.         
    206.         break;
    207.       }
    208.     }
    209.   }
    210.   private void draw(Graphics g) {
    211.     // 绘制背景公路
    212.     g.drawImage(background, 0, 0, Graphics.TOP | Graphics.LEFT);
    213.    
    214.     // 绘制剩下的小鸡数目
    215.     for (int i = 0; i < numLives; i++)
    216.       g.drawImage(chickenHead, 180 - ((i + 1) * 8), 170, Graphics.TOP | Graphics.LEFT);
    217.     // 绘小鸡
    218.     chickenSprite.paint(g);
    219.     // 绘汽车
    220.     for (int i = 0; i < 4; i++)
    221.       carSprite[i].paint(g);
    222.    
    223.     if (gameOver) {
    224.       // 绘游戏结束信息
    225.       g.setColor(255, 255, 255); // white
    226.       g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE));
    227.       g.drawString("GAME OVER", 90, 40, Graphics.TOP | Graphics.HCENTER);
    228.       g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_MEDIUM));
    229.       g.drawString("You scored " + score + " points.", 90, 70, Graphics.TOP |
    230.         Graphics.HCENTER);
    231.     }
    232.     // 刷新屏外图形缓冲
    233.     flushGraphics();
    234.   }
    235.   private void checkBounds(Sprite sprite, boolean wrap) {
    236.     // 检查精灵是否到达边界,如有必要,折返或停止精灵
    237.     if (wrap) {
    238.       // Wrap the sprite around the edges of the screen
    239.       if (sprite.getX() < -sprite.getWidth())
    240.         sprite.setPosition(getWidth(), sprite.getY());
    241.       else if (sprite.getX() > getWidth())
    242.         sprite.setPosition(-sprite.getWidth(), sprite.getY());
    243.       if (sprite.getY() < -sprite.getHeight())
    244.         sprite.setPosition(sprite.getX(), getHeight());
    245.       else if (sprite.getY() > getHeight())
    246.         sprite.setPosition(sprite.getX(), -sprite.getHeight());
    247.     }
    248.     else {
    249.       
    250.       if (sprite.getX() < 0)
    251.         sprite.setPosition(0, sprite.getY());
    252.       else if (sprite.getX() > (getWidth() - sprite.getWidth()))
    253.         sprite.setPosition(getWidth() - sprite.getWidth(), sprite.getY());
    254.       if (sprite.getY() < 0)
    255.         sprite.setPosition(sprite.getX(), 0);
    256.       else if (sprite.getY() > (getHeight() - sprite.getHeight()))
    257.         sprite.setPosition(sprite.getX(), getHeight() - sprite.getHeight());
    258.     }
    259.   }
    260. }
    261. 2、HenwayMIDlet.java
    262. import javax.microedition.midlet.*;
    263. import javax.microedition.lcdui.*;
    264. public class HenwayMIDlet extends MIDlet implements CommandListener {
    265.   private HCanvas canvas;
    266.   
    267.   public void startApp() {
    268.     if (canvas == null) {
    269.       canvas = new HCanvas(Display.getDisplay(this));
    270.       Command exitCommand = new Command("Exit", Command.EXIT, 0);
    271.       canvas.addCommand(exitCommand);
    272.       canvas.setCommandListener(this);
    273.     }
    274.    
    275.     // Start up the canvas
    276.     canvas.start();
    277.   }
    278.   
    279.   public void pauseApp() {}
    280.   
    281.   public void destroyApp(boolean unconditional) {
    282.     canvas.stop();
    283.   }
    284.   public void commandAction(Command c, Displayable s) {
    285.     if (c.getCommandType() == Command.EXIT) {
    286.       destroyApp(true);
    287.       notifyDestroyed();
    288.     }
    289.   }
    290. }
    291.                   
    复制代码


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://203.93.208.26/kj/cwb/dir7/Henway2.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-17 15:02 , Processed in 0.389813 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表