正在阅读:跟我学Java Swing之游戏设计(4)跟我学Java Swing之游戏设计(4)

2005-11-04 10:50 出处: 作者:张剑 责任编辑:xietaoming

  改变鼠标光标的样式

  目前为止,我们在程序界面上已经花了很多功夫,界面也慢慢变得漂亮起来。不过,装饰永无止境,下面就来谈谈如何改变鼠标光标的样式吧。实际上,createCustomCursor(Image cursor, Point hotSpot, String name)就能满足要求。其中,cursor是要设置为光标的图片,hotSpot是图片显示在实际光标位置的位移,name是给光标起的名字。现在挑选一张自己喜欢的图片来作为程序的光标吧(见图3)。

图3:自定义光标

  如果仍然觉得意犹未尽,那么还可以制作动画光标。首先准备好一系列图片,然后使用Timer()方法来设置一个定时器,每隔一段时间就变换光标的图片,这样,光标不就动起来了?

  声音

  声音是Swing的一部分吗?回答是否定的。虽然声音不属于Swing,但为了让我们的游戏更加完美,还是一起来看看怎样处理声音吧。

  Java自出道之日就能处理声音,但那时只能在Applet中进行处理,即便如此,声音的格式也只能是少见的AU格式。幸好,SUN意识到了这个问题,在JDK1.3之后,Java就提供了专门的声音处理包来满足声音处理的需求。

  Java支持MIDI和WAV格式的声音文件,javax.sound.midi和javax.sound.sampled这两个包就是用来处理MIDI和WAV文件的。MIDI格式优点在于文件小,缺点是只能保存乐曲而无法包含波形声音信息,WAV格式虽然能包含波形声音信息,可惜文件太大。因此,我们可以将MIDI作为游戏背景音乐,WAV作为音效。

  由于对WAV格式文件的操作和MIDI格式文件的操作十分相似,他们的区别仅在于使用的包不同,因此,我们就以处理MIDI格式的文件为例子吧:

// 读取midi文件
public void loadMidi(String filename) throws IOException, InvalidMidiDataException {
  URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();
  URL url = urlLoader.findResource(filename);

  sequence = MidiSystem.getSequence(url);
  //sequence保存着MIDI的音序结构
}

// 播放sequence
public void play() {
  if (isPlaying) { // 如果已经在播放,返回
    return;
  }
  try {
    sequencer = MidiSystem.getSequencer();
    sequencer.open();
    sequencer.setSequence(sequence); // 加载sequence
    sequencer.addMetaEventListener(this); // 添加事件处理
  } catch (InvalidMidiDataException ex) {
  } catch (MidiUnavailableException e) {
  }
 
  // Start playing
  thread = new Thread(this);
  thread.start();
}

public void run() {
  Thread currentThread = Thread.currentThread();
  while (currentThread == thread && !isPlaying) {
    // 当MIDI没有播放的时候,播放MIDI音乐
    sequencer.start();
    isPlaying = true;
    try {
      thread.sleep( 1000l );
    }
    catch (InterruptedException ex) {
    }
  }
}

  以上是处理MIDI文件的主要代码,代码并不是很长,却已经能很好地完成我们需要的功能了。当然,如果你还不满意,Java也提供了多种方法让你对MIDI格式的文件进行音调、频率的改变。需要提醒的是,声音处理一定要做为一个单独的线程来进行,究其原因嘛,还是大家自己思考一下了。

  结束语

  至此,我们的连连看已经成为一道色香俱全的美味佳肴了,虽然游戏中还有很多的技术没有讲解到,然而,作为一个Swing教程,相信对大家也会有所帮助的。

  不知道这样的教程是否能够让大家完成连连看这个游戏,如果你有困难或者疑问的话,可以通过leftmoon@163.com与我联系,或者将你感兴趣的部分告诉编辑吧,我会将自己所知道部分的拿出来与大家共同探讨。在此我衷心感谢大家能够耐心将Swing这杯咖啡品完,谢谢大家的支持,欢迎大家随时光临我们的咖啡馆哦!

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品