在上一篇教程中,我们介绍了如何在 Android 中创建一个简单的小游戏,今天我们将继续完善游戏,重点讲解如何实现 移动飞机 的功能,让玩家能够控制飞机的移动。

目标

  • 实现玩家飞机的移动功能,使玩家能够通过触摸屏的方式控制飞机的上下左右移动。
  • 保证飞机能够随着触摸点的变化而平滑移动。

实现步骤

1. 创建游戏界面

首先,我们需要一个基本的游戏界面,定义一个简单的 SurfaceView 用于显示游戏内容,并且通过它来管理游戏的绘制和触摸事件。这里的代码可以参考上一篇教程中的基础部分。

2. 设置玩家飞机的基本属性

我们可以通过一个 Player 类来管理飞机的相关属性。

public class Player {
    private int x, y;  // 飞机的坐标
    private Bitmap bitmap;  // 飞机的图像

    public Player(Bitmap bitmap, int x, int y) {
        this.bitmap = bitmap;
        this.x = x;
        this.y = y;
    }

    public Bitmap getBitmap() {
        return bitmap;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    // 绘制玩家飞机
    public void draw(Canvas canvas) {
        canvas.drawBitmap(bitmap, x, y, null);
    }
}

3. 在 GameView 中实现触摸事件

我们需要在 GameView 中重写 onTouchEvent 方法,来响应玩家的触摸,控制飞机的位置。

public class GameView extends SurfaceView implements SurfaceHolder.Callback {
    private Player player;
    private Bitmap playerBitmap;
    private int screenWidth, screenHeight;

    public GameView(Context context) {
        super(context);
        getHolder().addCallback(this);
        playerBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.player_plane);  // 你可以替换成自己的飞机图片
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 初始化玩家飞机的位置
        screenWidth = getWidth();
        screenHeight = getHeight();
        player = new Player(playerBitmap, screenWidth / 2 - playerBitmap.getWidth() / 2, screenHeight - playerBitmap.getHeight() - 30);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 获取触摸点的坐标
        int touchX = (int) event.getX();
        int touchY = (int) event.getY();

        // 设置飞机的 X 和 Y 坐标
        if (touchX >= 0 && touchX <= screenWidth - playerBitmap.getWidth()) {
            player.setX(touchX - playerBitmap.getWidth() / 2);  // 让飞机的中心点与触摸点对齐
        }

        if (touchY >= 0 && touchY <= screenHeight - playerBitmap.getHeight()) {
            player.setY(touchY - playerBitmap.getHeight() / 2);  // 同样调整 Y 坐标
        }

        return true;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // 不需要处理
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // 不需要处理
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        if (canvas != null) {
            canvas.drawColor(Color.BLACK);  // 设置背景颜色
            player.draw(canvas);  // 绘制飞机
        }
    }
}

4. 更新 MainActivity 来加载 GameView

在 MainActivity 中,我们需要设置 GameView 来启动游戏。

public class MainActivity extends AppCompatActivity {
    private GameView gameView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        gameView = new GameView(this);
        setContentView(gameView);
    }
}

5. 调整飞机移动的平滑度

在上述代码中,我们通过触摸事件来控制飞机的移动。为了让飞机移动更平滑,我们可以通过以下几个方式优化:

  • 调整触摸的响应方式:现在,飞机的位置是根据触摸点的实时位置来移动的,这可能会导致飞机跳动或者不流畅。我们可以加一些缓冲,减少触摸点位置变化带来的瞬时变化。
  • 设置动画效果:如果想让飞机更加流畅,可以增加动画效果,比如通过 ObjectAnimator 来平滑地移动飞机。

优化代码:平滑移动

我们可以让飞机沿着触摸点缓慢移动,而不是立即跳到触摸位置,这样看起来会更加平滑。

@Override
public boolean onTouchEvent(MotionEvent event) {
    int touchX = (int) event.getX();
    int touchY = (int) event.getY();

    // 使用插值器平滑移动飞机
    ValueAnimator xAnimator = ValueAnimator.ofInt(player.getX(), touchX - playerBitmap.getWidth() / 2);
    ValueAnimator yAnimator = ValueAnimator.ofInt(player.getY(), touchY - playerBitmap.getHeight() / 2);

    xAnimator.addUpdateListener(animation -> {
        player.setX((int) animation.getAnimatedValue());
    });
    yAnimator.addUpdateListener(animation -> {
        player.setY((int) animation.getAnimatedValue());
    });

    xAnimator.setDuration(300);  // 动画持续时间
    yAnimator.setDuration(300);
    xAnimator.start();
    yAnimator.start();

    return true;
}

小结

到这里,我们已经实现了一个可以控制玩家飞机移动的简单小游戏。通过触摸屏幕,玩家可以控制飞机的上下左右移动。你还可以进一步优化游戏的其他功能,如敌机生成、碰撞检测、得分系统等。

如果你想要继续扩展游戏,可以加入更多的游戏元素,比如敌人、子弹、特效、音效等,让游戏更加完整。