在上一篇教程中,我们介绍了如何在 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;
}
小结
到这里,我们已经实现了一个可以控制玩家飞机移动的简单小游戏。通过触摸屏幕,玩家可以控制飞机的上下左右移动。你还可以进一步优化游戏的其他功能,如敌机生成、碰撞检测、得分系统等。
如果你想要继续扩展游戏,可以加入更多的游戏元素,比如敌人、子弹、特效、音效等,让游戏更加完整。
发表回复