⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 piano.java

📁 java游戏编程导学系列一 使用说明 所有范例
💻 JAVA
字号:
package piano;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.URL;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class Piano
    extends Applet
    implements MouseListener, KeyListener {
  //键盘、鼠标释放时显示的键盘图片
  Image m_ImgUp;
  //键盘、鼠标按下时显示的键盘图片
  Image m_ImgDown;
  final int IMG_WIDTH = 17;
  final int IMG_HEIGHT = 85;
  int[] m_nState = new int[14];
  final int STATE_UP = 0;
  final int STATE_DOWN = 1;
  AudioClip[] m_AudioClip = new AudioClip[14];
  int m_nOldDownCount = -1;

  //Construct the applet
  public Piano() {
  }

  //Initialize the applet
  public void init() {
    try {
      jbInit();
      for (int i = 0; i < 14; i++) {
        m_nState[i] = STATE_UP;
      }
      m_nState[10] = STATE_DOWN;
      //将第11个琴键初始化为按下的状态的。
      try {
        URL url = Class.forName("piano.Piano").getResource("img/up.gif");
        m_ImgUp = getToolkit().getImage(url);

        url = Class.forName("piano.Piano").getResource("img/down.gif");
        m_ImgDown = getToolkit().getImage(url);

      }
      catch (Exception e) {
        e.printStackTrace();
      }
      MediaTracker mediaTracker = new MediaTracker(this);
      mediaTracker.addImage(m_ImgUp, 0);
      //将m_ImgUp加入到监视队列中,标识号为0
      mediaTracker.addImage(m_ImgDown, 1);
      //将m_ImgDown加入到监视队列中,标识号为1
      try {
        mediaTracker.waitForID(0);
      }
      catch (Exception e) {
        System.out.println("m_ImgUp is not loaded right");
      }
      try {
        mediaTracker.waitForID(1);
      }
      catch (Exception e) {
        System.out.println("m_ImgDown is not loaded right");
      }
      for (int i = 0; i < 14; i++) {
        try {
          URL url = Class.forName("piano.Piano").getResource("au/" + i + ".au");
          m_AudioClip[i] = getAudioClip(url);
        }
        catch (Exception e) {
          e.printStackTrace();
        }

      }

      //监听键盘消息
      addKeyListener(this);
      //监听鼠标消息
      addMouseListener(this);

    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  //Component initialization
  private void jbInit() throws Exception {
    this.addMouseMotionListener(new Piano_this_mouseMotionAdapter(this));

  }

  public void paint(Graphics g) {

    for (int i = 0; i < 14; i++) {
      switch (m_nState[i]) {
        case 0:
          g.drawImage(m_ImgUp, i * IMG_WIDTH, 0, this);
          break;
        case 1:
          g.drawImage(m_ImgDown, i * IMG_WIDTH, 0, this);
          break;
      }
    }
  }

  void showSound(int nCount) {
    m_AudioClip[nCount].play();

  }

  public void mouseClicked(MouseEvent e) {
    //Invoked when the mouse has been clicked on a component.
    int nMouseCount = e.getClickCount();

    //System.out.println("你触发了"+nMouseCount+"击事件");
  }

  public void mouseEntered(MouseEvent e) {
    //Invoked when the mouse enters a component.

  }

  public void mouseExited(MouseEvent e) {
    //Invoked when the mouse exits a component.
    if (m_nOldDownCount != -1) {
      m_nState[m_nOldDownCount] = STATE_UP;
    }
    m_nOldDownCount = -1;

  }

  public void mousePressed(MouseEvent e) {
    //Invoked when a mouse button has been pressed on a component.
    //System.out.println("你的鼠标已被按下");
    int nX = e.getX();
    int nY = e.getY();

    // System.out.println("你的鼠标时在坐标:"+nX+","+nY+"处按下");
    // System.out.println(nX);
    int nCount = nX / IMG_WIDTH;
    m_nState[nCount] = STATE_DOWN;
    showSound(nCount);
    m_nOldDownCount = nCount;//获得按下的琴键的序号,并存到nCount变量里。
    Graphics g = getGraphics();
    //g.fillRect(nCount*IMG_WIDTH,0,IMG_WIDTH,IMG_HEIGHT);
    g.drawImage(m_ImgDown, nCount * IMG_WIDTH, 0, this);
    //repaint();





  }

  public void mouseReleased(MouseEvent e) {
    //Invoked when a mouse button has been released on a component.
    //System.out.println("你的鼠标已被松开");
    int nX = e.getX();
    int nY = e.getY();
    //System.out.println("你的鼠标时在坐标:" + nX + "," + nY + "处松开");

    int nCount = nX / IMG_WIDTH;
    m_nState[nCount] = STATE_UP;
    m_nOldDownCount = -1;
    Graphics g = getGraphics();//获得鼠标释放时所对应的琴键的序号,并存到nCount变量里。
    g.drawImage(m_ImgUp, nCount * IMG_WIDTH, 0, this);
    //repaint();




  }

  public void keyPressed(KeyEvent e) {
    //System.out.println("你的键盘已经按下");
    int nKeyCode = e.getKeyCode();
    //System.out.println("现在按下的键值是"+nKeyCode);
    String sKeyName = e.getKeyText(nKeyCode);
    // System.out.println("现在按下的键名是"+sKeyName);
    //        System.out.println("KeyEvent的VK_8常量是"+KeyEvent.VK_8);
    boolean bControlDown = e.isControlDown();
    //	    if(bControlDown)System.out.println("Ctrl键按下");
    //	    else System.out.println("Ctrl键没有被按下");

    int nCount = -1;
    switch (nKeyCode) {
      case KeyEvent.VK_1:
        nCount = 0;
        break;
      case KeyEvent.VK_2:
        nCount = 1;
        break;
      case KeyEvent.VK_3:
        nCount = 2;
        break;
      case KeyEvent.VK_4:
        nCount = 3;
        break;
      case KeyEvent.VK_5:
        nCount = 4;
        break;
      case KeyEvent.VK_6:
        nCount = 5;
        break;
      case KeyEvent.VK_7:
        nCount = 6;
        break;
      default:
        return;
    }
    if (bControlDown) {
      nCount = nCount + 7;
    }
    setPianoKeyDown(nCount);
    showSound(nCount);
    Graphics g = getGraphics();
    g.drawImage(m_ImgDown, nCount * IMG_WIDTH, 0, this);

//        repaint();
    //Invoked when a key has been pressed.

  }

  public void keyReleased(KeyEvent e) {
    //Invoked when a key has been released.
    System.out.println("你的键盘已经松开");
    int nKeyCode = e.getKeyCode();
//        System.out.println("现在松开的键值是"+nKeyCode);
    String sKeyName = e.getKeyText(nKeyCode);
//        System.out.println("现在松开的键名是"+sKeyName);
//        System.out.println("KeyEvent的VK_8常量是"+KeyEvent.VK_8);
    boolean bControlDown = e.isControlDown();
    int nCount = -1;
    switch (nKeyCode) {
      case KeyEvent.VK_1:
        nCount = 0;
        break;
      case KeyEvent.VK_2:
        nCount = 1;
        break;
      case KeyEvent.VK_3:
        nCount = 2;
        break;
      case KeyEvent.VK_4:
        nCount = 3;
        break;
      case KeyEvent.VK_5:
        nCount = 4;
        break;
      case KeyEvent.VK_6:
        nCount = 5;
        break;
      case KeyEvent.VK_7:
        nCount = 6;
        break;
      default:
        return;
    }
    if (bControlDown) {
      nCount = nCount + 7;
    }
    m_nState[nCount] = STATE_UP;
    Graphics g = getGraphics();
    g.drawImage(m_ImgUp, nCount * IMG_WIDTH, 0, this);
//        repaint();

  }

  private void setAllPianoKeyUp() {
    for (int i = 0; i < 14; i++) {
      m_nState[i] = STATE_UP;
    }

  }

  void setPianoKeyDown(int nCount) {
    for (int i = 0; i < 14; i++) {
      m_nState[i] = STATE_UP;
    }
    m_nState[nCount] = STATE_DOWN;
  }

  public void keyTyped(KeyEvent e) {
    //System.out.print("你的键盘已经按下");
    int nKeyCode = e.getKeyChar();
          System.out.println("现在按下的键值是"+nKeyCode);
    String sKeyName = e.getKeyText(nKeyCode);
     //     System.out.println("现在按下的键名是"+sKeyName);
    //        System.out.println("KeyEvent的VK_8常量是"+KeyEvent.VK_8);
    boolean bControlDown = e.isControlDown();
    //	    if(bControlDown)System.out.println("Ctrl键按下");
    //	    else System.out.println("Ctrl键没有被按下");

    int nCount = -1;
    switch (nKeyCode) {
      case KeyEvent.VK_1:
        nCount = 0;
        break;
      case KeyEvent.VK_2:
        nCount = 1;
        break;
      case KeyEvent.VK_3:
        nCount = 2;
        break;
      case KeyEvent.VK_4:
        nCount = 3;
        break;
      case KeyEvent.VK_5:
        nCount = 4;
        break;
      case KeyEvent.VK_6:
        nCount = 5;
        break;
      case KeyEvent.VK_7:
        nCount = 6;
        break;
      default:
        return;
    }
    if (bControlDown) {
      nCount = nCount + 7;
    }
    setPianoKeyDown(nCount);
    showSound(nCount);
    Graphics g = getGraphics();
    g.drawImage(m_ImgDown, nCount * IMG_WIDTH, 0, this);

  }

  void mouseDragged(MouseEvent e) {
    //Invoked when a mouse button is pressed on a component and then dragged.
    //int nX = e.getX();
    //int nY = e.getY();
    //System.out.println("鼠标拖动到:x=" + nX + "   y=" + nY);
    int nX=e.getX();
          //得到鼠标当前位置的X坐标
       int m_nTempCount=nX/IMG_WIDTH;
           //获得鼠标位置所对应的琴键序号
       if(m_nTempCount==m_nOldDownCount)return;
       //如果鼠标在一个琴键上移动,则返回
       m_nState[m_nTempCount]=STATE_DOWN;
       //将刚刚移进的琴键置于按下状态
       m_nState[m_nOldDownCount]=STATE_UP;
          //将鼠标刚刚移出的琴键置于释放状态
       showSound(m_nTempCount);
       m_nOldDownCount=m_nTempCount;
       //存下这次所按的琴键


  }

  void mouseMoved(MouseEvent e) {
    //Invoked when the mouse button has been moved on a component
//(with no buttons no down)
    //int nX = e.getX();
    //int nY = e.getY();
    //System.out.println("鼠标移动到:x=" + nX + "   y=" + nY);

  }

}

class Piano_this_mouseAdapter
    extends java.awt.event.MouseAdapter {
  Piano adaptee;

  Piano_this_mouseAdapter(Piano adaptee) {
    this.adaptee = adaptee;
  }

  public void mouseClicked(MouseEvent e) {
    adaptee.mouseClicked(e);
  }

  public void mouseEntered(MouseEvent e) {
    adaptee.mouseEntered(e);
  }

  public void mouseExited(MouseEvent e) {
    adaptee.mouseExited(e);
  }

  public void mousePressed(MouseEvent e) {
    adaptee.mousePressed(e);
  }

  public void mouseReleased(MouseEvent e) {
    adaptee.mouseReleased(e);
  }
}

class Piano_this_keyAdapter
    extends java.awt.event.KeyAdapter {
  Piano adaptee;

  Piano_this_keyAdapter(Piano adaptee) {
    this.adaptee = adaptee;
  }

  public void keyPressed(KeyEvent e) {
    adaptee.keyPressed(e);
  }

  public void keyReleased(KeyEvent e) {
    adaptee.keyReleased(e);
  }

  public void keyTyped(KeyEvent e) {
    adaptee.keyTyped(e);
  }
}

class Piano_this_mouseMotionAdapter
    extends java.awt.event.MouseMotionAdapter {
  Piano adaptee;

  Piano_this_mouseMotionAdapter(Piano adaptee) {
    this.adaptee = adaptee;
  }

  public void mouseDragged(MouseEvent e) {
    adaptee.mouseDragged(e);
  }

  public void mouseMoved(MouseEvent e) {
    adaptee.mouseMoved(e);
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -