游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1742|回复: 0

在MIDP应用程序中播放声音2 wxh zt

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2006-4-20 15:56:00 | 显示全部楼层 |阅读模式
ex. 5
  能查看读取后的图片。

  彩球在图中的分配为横7纵5,读取彩球图片并描画在画面中。用旗表示彩球的状态。保持原来的排列。将一个一个的彩球使用原来的排列并计算出坐标,安排在画面中。(ex. 6)

  // 查看彩球
  g.setColor(0, 0, 255);
  for (int i = 0; i < BLOCK_H; i++) {     for (int j = 0; j < BLOCK_V; j++) {
      if (block[j]) {
        g.drawImage(
          blockImg,
          i * BLOCK_WIDTH,
          (j + 1) * BLOCK_HEIGHT,
          Graphics.LEFT | Graphics.TOP);
      }
    }
  }
ex. 6
  接着查看球和小棒。在paint方法中有以下叙述。(ex. 7)

// 查看球
g.drawImage(ballImg, ballX, ballY, Graphics.LEFT | Graphics.TOP);
// 查看小棒
g.drawImage(barImg, barX, barY, Graphics.LEFT | Graphics.TOP);
ex. 7
4. 使图片运动
  接下来使用线程和按键事件移动球和小棒。为了使用线程就得在AudioCanvas类中安装Runnable接口、记述run方法。使用球和小棒定义的移动速度分别变化球和小棒的坐标。此外,小棒的移动速度根据按键处理而变化。以下记述了run方法 。 (ex. 8)

  /**
   * 线程的运行处理
   */
  public void run() {

    while (state == ACTIVE) {

      moveBall();// 使球运动
      moveBar();// 移动小棒
      repaint();// 再次描画

      try {
        Thread.sleep(50);
      } catch (InterruptedCode Exampleception e) {
        e.printStackTrace();
        break;
      }
    }
  }

  /**
   // 使球运动
   */
  public void moveBall() {
    ballX += ballMovCode Example;
    ballY += ballMoveY;
  }

  /**
   * 移动小棒
   */
  public void moveBar() {
    barX += barMovCode Example;
    // 不能向画面外移动
    if (barX < 0) {
      barX = 0;
    } else if (barX + BAR_WIDTH > getWidth()) {
      barX = getWidth() - BAR_WIDTH;
    }
  }



ex. 8
  以下表示的是按键处理。(ex. 9)

  /*****************************************
  * 按键处理
  *****************************************/
  /**
  * 按按键时
  */
  protected void keyPressed(int key) {
    if (state == ACTIVE) {// 正在运动
      if (getGameAction(key) == Canvas.RIGHT) {
        barMovCode Example = 6;
      } else if (getGameAction(key) == Canvas.LEFT) {
        barMovCode Example = -6;
      }
      repaint();
    }else{// 停止运动后
      // 再次启动
      this.initialize();
    }
  }

  /**
   * 释放按键时
   */
  protected void keyReleased(int key) {
    barMovCode Example = 0;
  }



ex. 9
  5. 球的反弹
   下面是球的反弹。
   球的反弹形式有以下3种。
  · 碰边壁后反弹
  · 碰小棒后反弹
  · 碰彩球后反弹
  记述了每个moveBall方法。(ex. 10)
  碰彩球的反弹时
  block[j] = false;
  blockCount--;
  彩球立刻就破碎。彩球破碎后余下的彩球数量blockCount将有所减少。
  另外,球掉落时,改变游戏状态后游戏结束。


  /**
   // 使球运动
   */
  public void moveBall() {
    ballX += ballMovCode Example;
    ballY += ballMoveY;

    // 反弹
    // 碰边壁后反弹
    if (ballX < 0) {
      ballMovCode Example *= -1;
      ballX = 0;
    } else if (getWidth() < ballX + BALL_HEIGHT) {
      ballX = getWidth() - BALL_HEIGHT;
      ballMovCode Example *= -1;
    }
    if (ballY < 0) {
      ballMoveY *= -1;
      ballY = 0;
    } else if (ballY > getHeight()) { // 球落下后
      // 游戏结束
      state = GAME_OVER;
    }

    // 碰上小棒后反弹
    if (ballY + BALL_HEIGHT > barY
      && ballX + BALL_WIDTH > barX
      && ballX < barX + BAR_WIDTH) {
      ballMoveY *= -1;
      ballY = barY - BALL_HEIGHT;
      if (barMovCode Example < 0) {
        ballMovCode Example -= 2;
      } else if (barMovCode Example > 0) {
        ballMovCode Example += 2;
      }
    }
    // 碰上彩球后反弹
    for (int i = 0; i < BLOCK_H; i++) {
      for (int j = 0; j < BLOCK_V; j++) {
        if (block[j]) {
          if (ballX + BALL_WIDTH > i * BLOCK_WIDTH
            && ballX < (i + 1) * BLOCK_WIDTH) {
            if (ballY + BALL_HEIGHT > (j + 1) * BLOCK_HEIGHT
              && ballY < (j + 2) * BLOCK_HEIGHT) {
              // 清除彩球
              block[j] = false;
              blockCount--;
              ballMoveY *= -1; }
          }
          }
        }
      }
    }

  }



ex. 10
碰小棒后反弹情况如下所示:向右按键时,球就会让右方快速移动,反之,向左按键时,球则向左方快速移动。(ex. 11)

    if (barMoveX < 0) {
        ballMoveX -= 2;
    } else if (barMoveX > 0) {
        ballMoveX += 2;
    }



ex. 11
· 清除检查

至此安装完毕游戏就有雏形了。但是,在现在的程序中即使彩球全部消失,游戏也不能清除。那么,球与彩球相撞时,数出彩球的剩余数。当该数值为0时,则游戏清除。以下记述的是该处理。(ex. 12)

// 清除彩球
block[j] = false;
blockCount--;

ballMoveY *= -1;

// 播放音效
blockSound.play();

// 检查游戏清除
if (blockCount == 0) {
  state = CLEAR;
}



ex. 12
6. 音乐播放

在本讲中的泡泡龙游戏的应用程序中最好使用BGM和音效。游戏开始的同时演奏BGM,音效则是球在碰壁、碰小棒反弹时,以及彩球破碎时才播放的。

· 读取

用BlockApplication构造函数读取音乐数据。而且,这里的BGM能够循环播放,所以可以使用音频事件处理。(ex. 13)

  //声音数据的读取
  bgm = Media.getAudioClip("/bgm.mid");// 背景音乐
  ballSound = Media.getAudioClip("/ball.mid");// 球反弹后的音效
  blockSound = Media.getAudioClip("/block.mid");// 球破碎的音效
  bgm.addAudioListener(this);// 增加 AudioListener



ex. 13
· 播放
读取音乐数据后,接下来进行播放。BGM在游戏开始的同时能够播放,所以在AudioCanvas类的start方法中记述播放处理并能够播放出来。
球的音效:用moveBall方法进行下面反弹判断时,能够播放音效。(ex. 14)

  // 反弹
  // 碰边壁后反弹
  if (ballX < 0) {
    ballMoveX *= -1;
    ballX = 0;
    // 播放音效
    ballSound.play();
  } else if (getWidth() < ballX + BALL_HEIGHT) {
    ballX = getWidth() - BALL_HEIGHT;
    ballMoveX *= -1;
    // 播放音效
    ballSound.play();
  }
  if (ballY < 0) {
    ballMoveY *= -1;
    ballY = 0;
    // 播放音效
    ballSound.play();
  } else if (ballY > getHeight()) { // 球落下后
    // 游戏结束
    state = GAME_OVER;
  }

  // 碰上小棒反弹
  if (ballY + BALL_HEIGHT > barY
    && ballX + BALL_WIDTH > barX
    && ballX < barX + BAR_WIDTH) {
    ballMoveY *= -1;
    ballY = barY - BALL_HEIGHT;

    if (barMoveX < 0) {
      ballMoveX -= 2;
    } else if (barMoveX > 0) {
      ballMoveX += 2;
    }

    // 播放音效
    ballSound.play();
  }



ex. 14
彩球的音效:用moveBall方法判定彩球的碰撞时,如下记述并能够播放。 (ex. 15)

// 碰上彩球后反弹
for (int i = 0; i < BLOCK_H; i++) {
  for (int j = 0; j < BLOCK_V; j++) {
    if (block[j]) {
      if (ballX + BALL_WIDTH > i * BLOCK_WIDTH
        && ballX < (i + 1) * BLOCK_WIDTH) {
        if (ballY + BALL_HEIGHT > (j + 1) * BLOCK_HEIGHT
          && ballY < (j + 2) * BLOCK_HEIGHT) {
          block[j] = false;
          ballMoveY *= -1;

          // 播放音效
          blockSound.play();
        }
      }
    }
  }
}



ex. 15

■ 完成

下面是实际制作的程序一式。 ( BlockApplication.zip )
运行结果如下所示。


  
游戏进行中 游戏结束
   
游戏结束   



总结

在本讲的讲解中能够自由播放音乐数据了。因此,能够制作成创造性的应用程序。但是,扩展应用程序时,不能保存高分、数据等 。在下讲我们将学习如何使用固定存储器保存数据的方法。


N820 问世
在本栏目中简单将N800和N800的后继机种N820进行一下比较。

■ N820的特点

256Kbyte存储空间
255x240(纵x横)和65535色的显示屏
查看png格式的画面文件
播放smf格式的音乐文件
http通信,socket通信
逆光、双感光板控制
Sprite功能
ImageMap功能
各种各样的制图扩展功能
3D引擎

由于N820具有256Kbyte的较大存储空间,所以能制作容量稍大、自由度较高的手机应用程序。另外,也能制作对应http、socket通信的自由度较高网络应用程序。因此,也能够搭载3D引擎、3D描画。而且还能安装N800对应的Sprite功能、ImageMap功能的描画功能。

■ 与N800的比较
下表是N800和N820的比较。(表 6)

项目 N800  N820  
显示屏尺寸 180x162(纵x横) 255x240(纵x横)
JAD文件尺寸 最大 2 KB  最大 2 KB  
JAR文件尺寸 最大 50 KB  最大 1 MB  
RMS尺寸 最大 10 KB  最大 10 KB  
记录存储数量 最大 3 records  最大 3 records  
通信协议 只有http HTTP and socket  
画像文件 PNG  PNG  
音乐文件 SMF(format 0) 最大10Kbyte SMF(format0) 最大10Kbyte
表 6
■ NEC N820 Application模拟器
下面是模拟N820工作的模拟器,称为「NEC 820 Application Emulator」。与以前我们所介绍的「NEC N800 Application Emulator」在外观上没有什么区别


打开模拟器,就是现在的手机画面表示。与N800相比,手机设计多少有些变化,手机的内显示屏变大了。下图是用N820 Application Emulator制作的“泡泡龙”游戏画面。“泡泡龙”游戏由于是假定在N800的屏幕上应用的。因此画面尺寸要比N820中的内屏尺寸稍小。因此,彩球之间存有空隙。■ 总结
N820的优点是具有256Kbyte的大容量存储空间,而且使用3D图表引擎、3D图表应用程序、能够制作成对应socket通信的TCP/IP网络应用程序。对于应用开发者而言,N820是一部制作JAVA应用程序非常有价值的终端。对于寻求高级机种的用户而言,应该是一部高精细画面、高功能的极大满足用户需要的终端。今后N820的用户应该会大幅度增加的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 07:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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