站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题Canvas和Media实现钢琴效果

Canvas和Media实现钢琴效果

摘要: Canvas和Media实现钢琴效果
<tr><td>
http:///tech/article868.html
[转载于J2MEDev]

[]声明:本站收集的源码来自互联网,经过了管理员的细心整理,提供给开发者学习之用。未经本站允许请勿转载!

本例使用Canvas绘制钢琴的界面,同时使用了MIDP 2.0的media子系统来播放钢琴按键触发的声音效果。是个不错的图形用户界面和音效结合的范例。

下载源码



540) this.width = 540'>




<table cellpadding=0 cellspacing=0 width=94% bgcolor=#000000 align=center style='table-layout:fixed'><tr><td><table width=100% cellpadding=5 cellspacing=1 style='table-layout:fixed'><tr><td bgcolor=#FFFFFF style='left: 0px; width: 100%; word-wrap: break-word'>代码:

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

package com.j2medev.piano;

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;
}
}
}


</td></tr></table></td></tr></table>
http:///tech/article868.html
</td></tr></table></td> </tr> <tr> <td background="/pic/split.gif" height=1></td> </tr> <tr> <td class="tdMargin1">
↑返回目录
前一篇: 使用J2ME高级用户界面技术开发的猜数字游戏
后一篇: 在Canvas上绘制可修改的图片