基于c++语言与EASY-X图形库编写:一个飞机大战小游戏,hero与enemy碰撞后跳转到gameover界面
时间: 2024-02-13 21:03:47 浏览: 36
下面是一个基于C++语言和EasyX图形库编写的简单飞机大战小游戏,当hero与enemy碰撞后,会跳转到Game Over界面:
```c++
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
// 游戏界面大小
const int WIDTH = 480;
const int HEIGHT = 640;
// 英雄飞机的大小
const int HERO_WIDTH = 60;
const int HERO_HEIGHT = 60;
// 敌机的大小
const int ENEMY_WIDTH = 40;
const int ENEMY_HEIGHT = 40;
// 子弹的大小
const int BULLET_WIDTH = 10;
const int BULLET_HEIGHT = 20;
// 英雄飞机的初始位置
int heroX = WIDTH / 2 - HERO_WIDTH / 2;
int heroY = HEIGHT - HERO_HEIGHT;
// 敌机的初始位置和速度
int enemyX = rand() % (WIDTH - ENEMY_WIDTH);
int enemyY = 0;
int enemySpeed = 3;
// 子弹的初始位置和速度
int bulletX = 0;
int bulletY = 0;
int bulletSpeed = 10;
// 是否按下空格键
bool isSpacePressed = false;
// 是否游戏结束
bool isGameOver = false;
// 绘制英雄飞机
void drawHero()
{
// 绘制英雄飞机的图像
IMAGE hero;
loadimage(&hero, _T("hero.png"), HERO_WIDTH, HERO_HEIGHT, true);
putimage(heroX, heroY, &hero);
}
// 绘制敌机
void drawEnemy()
{
// 绘制敌机的图像
IMAGE enemy;
loadimage(&enemy, _T("enemy.png"), ENEMY_WIDTH, ENEMY_HEIGHT, true);
putimage(enemyX, enemyY, &enemy);
}
// 绘制子弹
void drawBullet()
{
// 绘制子弹的图像
IMAGE bullet;
loadimage(&bullet, _T("bullet.png"), BULLET_WIDTH, BULLET_HEIGHT, true);
putimage(bulletX, bulletY, &bullet);
}
// 更新英雄飞机的位置
void updateHero()
{
if (GetAsyncKeyState(VK_LEFT) & 0x8000 && heroX > 0) {
heroX -= 5;
}
if (GetAsyncKeyState(VK_RIGHT) & 0x8000 && heroX < WIDTH - HERO_WIDTH) {
heroX += 5;
}
if (GetAsyncKeyState(VK_UP) & 0x8000 && heroY > 0) {
heroY -= 5;
}
if (GetAsyncKeyState(VK_DOWN) & 0x8000 && heroY < HEIGHT - HERO_HEIGHT) {
heroY += 5;
}
}
// 更新敌机的位置
void updateEnemy()
{
enemyY += enemySpeed;
if (enemyY > HEIGHT) {
enemyX = rand() % (WIDTH - ENEMY_WIDTH);
enemyY = 0;
}
}
// 更新子弹的位置
void updateBullet()
{
if (isSpacePressed) {
bulletY -= bulletSpeed;
if (bulletY < 0) {
isSpacePressed = false;
}
}
}
// 判断是否碰撞
bool isCollide(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
if (x1 + w1 < x2 || x1 > x2 + w2 || y1 + h1 < y2 || y1 > y2 + h2) {
return false;
}
return true;
}
// 处理碰撞事件
void handleCollide()
{
if (isCollide(heroX, heroY, HERO_WIDTH, HERO_HEIGHT, enemyX, enemyY, ENEMY_WIDTH, ENEMY_HEIGHT)) {
isGameOver = true;
}
if (isCollide(bulletX, bulletY, BULLET_WIDTH, BULLET_HEIGHT, enemyX, enemyY, ENEMY_WIDTH, ENEMY_HEIGHT)) {
enemyX = rand() % (WIDTH - ENEMY_WIDTH);
enemyY = 0;
isSpacePressed = false;
}
}
// 游戏结束界面
void gameOver()
{
// 绘制游戏结束的图像
IMAGE gameover;
loadimage(&gameover, _T("gameover.png"));
putimage(0, 0, &gameover);
// 等待用户按下空格键重新开始游戏
while (true) {
if (GetAsyncKeyState(VK_SPACE) & 0x8000) {
isGameOver = false;
heroX = WIDTH / 2 - HERO_WIDTH / 2;
heroY = HEIGHT - HERO_HEIGHT;
enemyX = rand() % (WIDTH - ENEMY_WIDTH);
enemyY = 0;
break;
}
}
}
int main()
{
// 初始化随机数种子
srand((unsigned)time(NULL));
// 创建窗口并初始化图形库
initgraph(WIDTH, HEIGHT, SHOWCONSOLE);
while (true) {
// 清空屏幕
cleardevice();
// 绘制英雄飞机
drawHero();
if (!isGameOver) {
// 绘制敌机
drawEnemy();
// 绘制子弹
if (isSpacePressed) {
drawBullet();
}
// 更新英雄飞机的位置
updateHero();
// 更新敌机的位置
updateEnemy();
// 更新子弹的位置
updateBullet();
// 处理碰撞事件
handleCollide();
// 检测空格键是否按下
if (GetAsyncKeyState(VK_SPACE) & 0x8000) {
isSpacePressed = true;
bulletX = heroX + HERO_WIDTH / 2 - BULLET_WIDTH / 2;
bulletY = heroY - BULLET_HEIGHT;
}
} else {
// 游戏结束界面
gameOver();
}
// 刷新屏幕
flushbatch();
}
return 0;
}
```
在这个示例中,我们使用了EasyX图形库来实现游戏界面的绘制和交互。首先,我们定义了游戏界面的大小和各种元素的大小和位置。然后,在主循环中,我们不断更新各个元素的位置和状态,并根据用户的输入来控制英雄飞机的移动和发射子弹。在处理碰撞事件时,我们检测英雄飞机和敌机、子弹和敌机之间是否有碰撞,如果有,就把游戏状态设置为结束,并在屏幕上显示游戏结束的图像。在游戏结束界面中,我们等待用户按下空格键重新开始游戏。