J2ME例子-钢琴

/*
 * PianoMIDlet.java
 *
 * Created on 2005年12月6日, 下午2:02
 */

package demo;

import javax.microedition.media.*;

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class PianoMIDlet extends MIDlet {
 public void startApp() {
  Displayable d = new PianoCanvas();
  d.addCommand(new Command("Exit", Command.EXIT, 0));
  d.setCommandListener(new CommandListener() {
   public void commandAction(Command c, Displayable s) {
    notifyDestroyed();
   }
  });
  Display.getDisplay(this).setCurrent(d);
 }

 public void pauseApp() {
 }

 public void destroyApp(boolean unconditional) {
 }
}

class PianoCanvas extends Canvas {
 private static final int[] kNoteX = { 0, 11, 16, 29, 32, 48, 59, 64, 76,
   80, 93, 96 };

 private static final int[] kNoteWidth = { 16, 8, 16, 8, 16, 16, 8, 16, 8,
   16, 8, 16 };

 private static final int[] kNoteHeight = { 96, 64, 96, 64, 96, 96, 64, 96,
   64, 96, 64, 96 };

 private static final boolean[] kBlack = { false, true, false, true, false,
   false, true, false, true, false, true, false };

 private int mMiddleCX, mMiddleCY;

 private int mCurrentNote;

 public PianoCanvas() {
  int w = getWidth();
  int h = getHeight();
  int fullWidth = kNoteWidth[0] * 8;
  mMiddleCX = (w - fullWidth) / 2;
  mMiddleCY = (h - kNoteHeight[0]) / 2;
  mCurrentNote = 60;
 }

 public void paint(Graphics g) {
  int w = getWidth();
  int h = getHeight();
  g.setColor(0xffffff);
  g.fillRect(0, 0, w, h);
  g.setColor(0x000000);
  for (int i = 60; i <= 72; i++)
   drawNote(g, i);
  drawSelection(g, mCurrentNote);
 }

 private void drawNote(Graphics g, int note) {
  int n = note % 12;
  int octaveOffset = ((note - n) / 12 - 5) * 7 * kNoteWidth[0];
  int x = mMiddleCX + octaveOffset + kNoteX[n];
  int y = mMiddleCY;
  int w = kNoteWidth[n];
  int h = kNoteHeight[n];
  if (isBlack(n))
   g.fillRect(x, y, w, h);
  else
   g.drawRect(x, y, w, h);
 }

 private void drawSelection(Graphics g, int note) {
  int n = note % 12;
  int octaveOffset = ((note - n) / 12 - 5) * 7 * kNoteWidth[0];
  int x = mMiddleCX + octaveOffset + kNoteX[n];
  int y = mMiddleCY;
  int w = kNoteWidth[n];
  int h = kNoteHeight[n];
  int sw = 6;
  int sx = x + (w - sw) / 2;
  int sy = y + h - 8;
  g.setColor(0xffffff);
  g.fillRect(sx, sy, sw, sw);
  g.setColor(0x000000);
  g.drawRect(sx, sy, sw, sw);
  g.drawLine(sx, sy, sx + sw, sy + sw);
  g.drawLine(sx, sy + sw, sx + sw, sy);
 }

 private boolean isBlack(int note) {
  return kBlack[note];
 }

 public void keyPressed(int keyCode) {
  int action = getGameAction(keyCode);
  switch (action) {
  case LEFT:
   mCurrentNote--;
   if (mCurrentNote < 60)
    mCurrentNote = 60;
   repaint();
   break;
  case RIGHT:
   mCurrentNote++;
   if (mCurrentNote > 72)
    mCurrentNote = 72;
   repaint();
   break;
  case FIRE:
   try {
    Manager.playTone(mCurrentNote, 1000, 100);
   } catch (MediaException me) {
   }
   break;
  
  default:
   break;
  }
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值