继续设置飞翔的小鸟通过障碍物的代码,并设置掉落或者碰到障碍物即游戏结束,弹出重新开始或者结束游戏的对话框
时间: 2024-03-19 15:45:43 浏览: 26
以下是一个带有障碍物和游戏结束提示的 Android 飞翔的小鸟游戏的代码示例,仅供参考:
```
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView bird;
private ImageButton btnJump;
private FrameLayout frame;
private TextView tvScore;
private int frameHeight, birdSize;
private int screenHeight, screenWidth;
private int birdYPosition;
private int gravity = 3;
private int jumpPower = -30;
private int score = 0;
private boolean isJumping = false;
private boolean gameOver = false;
private Handler handler = new Handler();
private Timer timer = new Timer();
private ArrayList<ImageView> obstacleList = new ArrayList<>();
private int obstacleCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bird = findViewById(R.id.bird);
btnJump = findViewById(R.id.btnJump);
frame = findViewById(R.id.frame);
tvScore = findViewById(R.id.tvScore);
// 获取屏幕尺寸
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenHeight = metrics.heightPixels;
screenWidth = metrics.widthPixels;
// 设置点击监听器
btnJump.setOnClickListener(this);
// 设置定时器
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
if (!gameOver) {
birdYPosition += gravity;
bird.setY(birdYPosition);
if (birdYPosition < 0) {
birdYPosition = 0;
}
if (birdYPosition > frameHeight - birdSize) {
birdYPosition = frameHeight - birdSize;
gameOver();
}
for (int i = 0; i < obstacleList.size(); i++) {
ImageView obstacle = obstacleList.get(i);
int obstacleYPosition = (int) obstacle.getTag();
obstacleYPosition += gravity;
obstacle.setTag(obstacleYPosition);
obstacle.setY(obstacleYPosition);
if (obstacleYPosition > frameHeight) {
frame.removeView(obstacle);
obstacleList.remove(obstacle);
score++;
tvScore.setText("Score: " + score);
}
if (obstacleYPosition < birdYPosition + birdSize &&
obstacleYPosition + obstacle.getHeight() > birdYPosition &&
obstacle.getX() < bird.getX() + birdSize &&
obstacle.getX() + obstacle.getWidth() > bird.getX()) {
gameOver();
}
}
if (isJumping) {
birdYPosition += jumpPower;
bird.setY(birdYPosition);
isJumping = false;
}
if (obstacleCount == 0) {
createObstacle();
obstacleCount = 200;
} else {
obstacleCount--;
}
}
}
});
}
}, 0, 20);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btnJump) {
isJumping = true;
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
frameHeight = frame.getHeight();
birdSize = bird.getHeight();
birdYPosition = bird.getTop();
}
}
private void createObstacle() {
Random random = new Random();
int obstacleXPosition = screenWidth;
int obstacleYPosition = random.nextInt(frameHeight - 500);
ImageView obstacle = new ImageView(this);
obstacle.setImageResource(R.drawable.obstacle);
obstacle.setX(obstacleXPosition);
obstacle.setY(obstacleYPosition);
obstacle.setTag(obstacleYPosition);
frame.addView(obstacle);
obstacleList.add(obstacle);
}
private void gameOver() {
gameOver = true;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Game Over");
builder.setMessage("Your score is " + score);
builder.setPositiveButton("Restart", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
restartGame();
}
});
builder.setNegativeButton("Quit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setCancelable(false);
builder.show();
}
private void restartGame() {
birdYPosition = screenHeight / 2;
bird.setY(birdYPosition);
score = 0;
tvScore.setText("Score: " + score);
for (int i = 0; i < obstacleList.size(); i++) {
ImageView obstacle = obstacleList.get(i);
frame.removeView(obstacle);
}
obstacleList.clear();
gameOver = false;
}
}
```
这段代码中,我们在定时器中添加了障碍物,并在游戏主循环中检测小鸟和障碍物之间的碰撞。如果小鸟碰到障碍物或者掉落到屏幕底部,游戏结束并弹出对话框提示玩家重新开始或者退出游戏。在 `createObstacle` 方法中,我们使用随机数来生成障碍物的位置,并添加到游戏画面中。在 `gameOver` 方法中,我们使用 `AlertDialog` 来弹出游戏结束的提示框,并提供重新开始和退出游戏的选项。在 `restartGame` 方法中,我们重新设置小鸟和障碍物的位置,并清除分数和障碍物列表,准备开始下一轮游戏。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![sb3](https://img-home.csdnimg.cn/images/20210720083646.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)