从零开始构建Java游戏及多边形游戏开发指南
立即解锁
发布时间: 2025-08-26 00:32:32 阅读量: 3 订阅数: 7 


Android游戏开发:从零开始构建经典射击游戏
### 从零开始构建 Java 游戏及多边形游戏开发指南
#### 一、SpaceBlaster 游戏开发
##### 1. 创建星空背景
在游戏中创建随机星空背景是个不错的技巧。可以通过使用每个星星的 X 和 Y 坐标数组来实现,同时使用 Paint 对象设置样式和颜色。以下是创建随机星空的代码:
```java
/**
* create the star field in the background
*/
public void initStars() {
starsX = new int[numStars];
starsY = new int[numStars];
starsC = new Paint[numStars];
for (int i = 0; i < numStars; i++) {
starsX[i] = (int) ((Math.random() * xSize - 1) + 1);
starsY[i] = (int) ((Math.random() * ySize - 1) + 1);
starsC[i] = newColor();
}
}
public Paint newColor() {
int r = Math.random() * 255;
int g = Math.random() * 255;
int b = Math.random() * 255;
Paint p = new Paint();
p.setARGB(255, r, g, b);
return p;
}
```
##### 2. 处理音频
在 Android 开发游戏时,处理声音有两种选择:
- 使用 Android 的 MediaPlayer API 在 Java 中实现声音逻辑。
- 以原生方式(使用 C 或 C++)实现声音。不过,目前 Google 不支持原生开发。
使用 MediaPlayer API 实现 Java 声音有一些缺点:
- 只能打开原始资源或文件系统中的文件,对于将精灵和声音打包在一个文件中的游戏不适用。
- 开发时存在一些问题,如在声音播放前暂停或同时发出两个播放命令会抛出 IllegalState 异常。
- 消耗大量资源,尤其是在有很多声音的情况下会使游戏变慢。
为了解决这些问题,可以使用 AudioClip 类,它包装了 MediaPlayer 实例并处理媒体事件:
```java
package ch03.common;
import android.content.Context;
import android.media.MediaPlayer;
public class AudioClip {
private MediaPlayer mPlayer;
private String name;
private boolean mPlaying = false;
private boolean mLoop = false;
public AudioClip(Context ctx, int resID)
{
// clip name
name = ctx.getResources().getResourceName(resID);
// Create a media player
mPlayer = MediaPlayer.create(ctx, resID);
// Listen for completion events
mPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mPlaying = false;
if (mLoop) {
mp.start();
}
}
});
}
public synchronized void play() {
if (mPlaying)
return;
if (mPlayer != null) {
mPlaying = true;
mPlayer.start();
}
}
public synchronized void stop() {
try {
mLoop = false;
if (mPlaying) {
mPlaying = false;
mPlayer.pause();
}
} catch (Exception e) {
System.err.println("AduioClip::stop " + name + " "
+ e.toString());
}
}
public synchronized void loop() {
mLoop = true;
mPlaying = true;
mPlayer.start();
}
public void release() {
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
}
```
Space Blaster 有三种声音可以通过以下代码加载:
```java
blast = getAudioClip(R.raw.sb_blast); // Laser shot
crash = getAudioClip(R.raw.sb_collisn); // Ship collision
kill = getAudioClip(R.raw.sb_mdestr); // meteor destruction
```
其中 `getAudioClip` 方法定义如下:
```java
protected AudioClip getAudioClip(int id) {
return new AudioClip(mContex, id);
}
```
**注意**:音频资源必须保存在项目的 `res/raw` 文件夹中。
关于原生声音,由于 Android 不是标准的 Linux 发行版,标准 Linux 声音设备和混音器不被支持,使用 OpenAL/OpenGL 的原生代码也存在问题。不过,可以通过 JNI 将声音名称传递回 Java 并使用 AudioClip 播放。
##### 3. 处理按键和触摸事件
可以通过重载以下方法来处理按键和触摸事件:
- `onKeyDown`:按键按下时触发,接收按键代码和 KeyEvent 作为参数。
- `onKeyUp`:按键释放时触发,参数与 `onKeyDown` 相同,还可以检查 Shift 或 Alt 键的状态。
- `onTouchEvent`:屏幕点击时触发,接收 MotionEvent,可以检查点击状态和
0
0
复制全文
相关推荐










