安卓游戏开发:Mr.Nom项目全解析
立即解锁
发布时间: 2025-08-24 00:52:49 阅读量: 1 订阅数: 8 


Android游戏开发实战指南
### 安卓游戏开发:Mr. Nom 项目全解析
在安卓游戏开发中,将一个游戏移植到安卓平台需要考虑多个方面,包括资源管理、用户设置、屏幕切换等。下面我们将详细介绍如何实现一个名为 Mr. Nom 的安卓游戏。
#### 1. 项目准备
在开始游戏开发之前,需要进行一些准备工作:
- **权限设置**:确保应用程序具有适当的权限,如写入外部存储、使用唤醒锁等。
- **资源放置**:将之前章节的所有资源放置在项目的 `assets/` 文件夹中。同时,将 `icon.png` 文件分别放入 `res/drawable`、`res/drawable-ldpi`、`res/drawable-mdpi` 和 `res/drawable-hdpi` 文件夹中。可以将 `Mr. Nom` 的 `headright.png` 重命名为 `icon.png`,并调整大小后放入相应文件夹。
- **代码放置**:将游戏代码放入 Eclipse 项目的 `com.badlogic.androidgames.mrnom` 包中。
#### 2. 主活动类 MrNomGame
游戏需要一个主入口点,即安卓上的默认活动。我们将这个默认活动命名为 `MrNomGame`,并让它继承自 `AndroidGame` 类,该类用于运行游戏。`MrNomGame` 类的代码如下:
```java
package com.badlogic.androidgames.mrnom;
import com.badlogic.androidgames.framework.Screen;
import com.badlogic.androidgames.framework.impl.AndroidGame;
public class MrNomGame extends AndroidGame {
@Override
public Screen getStartScreen() {
return new LoadingScreen(this);
}
}
```
我们只需要继承 `AndroidGame` 类并实现 `getStartScreen()` 方法,该方法将返回 `LoadingScreen` 类的一个实例。
#### 3. 资源存储类 Assets
加载屏幕将加载游戏的所有资源。为了方便存储和访问这些资源,我们创建一个 `Assets` 类,该类包含大量静态公共成员,用于存储从资源中加载的所有 `Pixmap` 和 `Sound`。代码如下:
```java
package com.badlogic.androidgames.mrnom;
import com.badlogic.androidgames.framework.Pixmap;
import com.badlogic.androidgames.framework.Sound;
public class Assets {
public static Pixmap background;
public static Pixmap logo;
public static Pixmap mainMenu;
public static Pixmap buttons;
public static Pixmap help1;
public static Pixmap help2;
public static Pixmap help3;
public static Pixmap numbers;
public static Pixmap ready;
public static Pixmap pause;
public static Pixmap gameOver;
public static Pixmap headUp;
public static Pixmap headLeft;
public static Pixmap headDown;
public static Pixmap headRight;
public static Pixmap tail;
public static Pixmap stain1;
public static Pixmap stain2;
public static Pixmap stain3;
public static Sound click;
public static Sound eat;
public static Sound bitten;
}
```
如果需要使用这些资源,可以通过以下方式访问:
```java
game.getGraphics().drawPixmap(Assets.background, 0, 0)
Assets.click.play(1);
```
需要注意的是,这些静态成员不是 `final` 的,因此可以被覆盖。为了避免这种情况,更干净的解决方案是在单例类中使用 `setter` 和 `getter` 来隐藏资源。
#### 4. 用户设置类 Settings
在加载屏幕中,还需要加载另外两个内容:用户设置和高分记录。我们创建一个 `Settings` 类来存储和管理这些信息。代码如下:
```java
package com.badlogic.androidgames.mrnom;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import com.badlogic.androidgames.framework.FileIO;
public class Settings {
public static boolean soundEnabled = true;
public static int[] highscores = new int[] { 100, 80, 50, 30, 10 };
public static void load(FileIO files) {
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(
files.readFile(".mrnom")));
soundEnabled = Boolean.parseBoolean(in.readLine());
for (int i = 0; i < 5; i++) {
highscores[i] = Integer.parseInt(in.readLine());
}
} catch (IOException e) {
// :( It's ok we have defaults
} catch (NumberFormatException e) {
// :/ It's ok, defaults save our day
} finally {
try {
if (in != null)
in.close();
} catch (IOException e) {
}
}
}
public static void save(FileIO files) {
BufferedWriter out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
files.writeFile(".mrnom")));
out.write(Boolean.toString(soundEnabled));
for (int i = 0; i < 5; i++) {
out.write(Integer.toString(highscores[i]));
}
} catch (IOException e) {
} finally {
try {
if (out != null)
out.close();
} catch (IOException e) {
}
}
}
public static void addScore(int score) {
for (int i = 0; i < 5; i++) {
if (highscores[i] < score) {
for (int j = 4; j > i; j--)
highscores[j] = highscores[j - 1];
highscores[i] = score;
break;
}
}
}
}
```
`Settings` 类包含以下功能:
- `soundEnabled`:一个公共静态布尔值,用于确定是否播放音效。
- `highscores`:一个包含五个元素的整数数组,按从高到低的顺序存储高分记录。
- `load()` 方法:尝试从外部存储的 `.mrnom` 文件中加载设置。如果出现问题,将使用默认值。
- `save()` 方法:将当前设置序列化到外部存储的 `.mrnom` 文件中。
- `addScore()` 方法:用于将新的分数添加到高分记录中,并自动重新排序。
#### 5. 加载屏幕类 LoadingScreen
有了上述类,我们可以轻松实现加载屏幕。`LoadingScreen` 类的代码如下:
```java
package com.badlogic.androidgames.mrnom;
import com.badlogic.androidgames.framework.Game;
import com.badlogic.androidgames.framework.Graphics;
import com.badlogic.androidgames.framework.Screen;
import com.badlogic.androidgames.framework.Graphics.PixmapFormat;
public class LoadingScreen extends Screen {
public LoadingScreen(Game game) {
super(game);
}
@Override
public void update(float deltaTime) {
Graphics g = game.getGraphics();
Assets.background = g.newPixmap("background.png", PixmapFormat.RGB565);
Assets.logo = g.newPixmap("logo.png", PixmapFormat.ARGB4444);
Assets.mainMenu = g.newPixmap("mainmenu.png", PixmapFormat.ARGB4444);
Assets.buttons = g.newPixmap("buttons.png", PixmapFormat.ARGB4444);
Assets.help1 = g.newPixmap("help1.png", PixmapFormat.ARGB4444);
Assets.help2 = g.newPixmap("help2.png", PixmapFormat.ARGB4444);
Assets.help3 = g.newPixmap("help3.png", PixmapFormat.ARGB4444);
Assets.numbers = g.newPixmap("numbers.png", PixmapFormat.ARGB4444);
Assets.ready = g.newPixmap("ready.png", PixmapFormat.ARGB4444);
Asse
```
0
0
复制全文
相关推荐










