基于C++ EasyX框架开发的飞机大战小游戏

c++飞机大战 C++飞机大战 长春理工大学大一下学期面向对象课程设计 本程序于2018年7月完成 这个飞机大战运用了easyX库,这个库可以帮助新手快速上手图形界面编程 声明 本人为长春理工大学2018级学生,程序为本人制作,本程序未经允许请勿做商用 资源包包含一个课程设计论文,详细设计见论文,代码就不打出来了,自己去下载 功能需求 地图选择 难度选择 分数模块 激光模块 … 概述 飞机大战游戏是基于Win... 阅读详情

正式使用Easyx之前,你需要先安装他!!

EasyX 2022 版 (2022-9-1 更新) - EasyXhttps://easyx.cn/easyx选择合适的版本安装

安装结束后就可以开始敲代码啦!

这里作者使用的是Visual Studio 2022所以安装EasyX_20220901版本

启动Visual Studio 2022,新建一个空项目

这是工程目录:

 

首先来看看Bullet(子弹)类

头文件:

#pragma once
class Bullet
{
public:
	Bullet(int x, int y, int owner);
	int owner; // 0 means player, 1 means enemy
	int x;
	int y;
	int speed;
	int pic_w = 5;
	int pic_h = 11;
	bool dead = false;
	void move();
	void checkBound();
};

源文件:

#include "Bullet.h"
#include "constants.h"

Bullet::Bullet(int x, int y, int owner) {
	this->x = x;
	this->y = y;
	this->owner = owner;
	speed = 12;
}

void Bullet::move() {
	if (owner == 0) {
		y -= speed;
	}
	else {
		y += speed;
	}
}

void Bullet::checkBound() {
	if (owner == 0) {
		if (y + pic_h <= 0) {
			dead = true;
		}
	}
	else {
		if (y >= HEIGHT) {
			dead = true;
		}
	}
}

这里简单地实现了子弹的移动和检测超出边界,不难理解

Enemy类头文件:

#pragma once
class Enemy
{
public:
	Enemy(int type);
	int x;
	int y;
	int speed;
	int pic_w;
	int pic_h;
	int type;
	int health;
	int static_health;
	bool dead = false;
	void move();
	void checkBound();
};

源文件:

#include "Enemy.h"
#include "constants.h"

Enemy::Enemy(int type) {
	this->type = type;
	switch (type) {
	case 1:
		pic_w = 60;
		pic_h = 44;
		health = random(1, 2);
		break;
	case 2:
		pic_w = 70;
		pic_h = 100;
		health = random(3, 4);
		break;
	case 3:
		pic_w = 160;
		pic_h = 250;
		health = random(5, 6);
		break;
	default:
		pic_w = 60;
		pic_h = 44;
		health = 1;
		break;
	}
	x = random(0, WIDTH - pic_w);
	y = 0 - pic_h;
	speed = random(5,8);
	static_health = health;
}

void Enemy::move() {
	y += speed;
}

void Enemy::checkBound() {
	if (y >= HEIGHT || health <= 0) {
		dead = true;
	}
}

这里的类成员变量type表示敌机大小,3最大,同时血量最多,也实现了移动和检测超出边界功能

有的人会发现random方法以及WIDTH常量等,这里是因为我们将这些常量写在一个头文件下:

constants.h:

#pragma once

#ifndef WIDTH
#define WIDTH 800
#endif

#ifndef HEIGHT
#define HEIGHT 1000
#endif

#include <cstdlib>
#include <string>

using namespace std;

#ifndef random(a,x)
#define random(a,x) a+rand()%x
#endif

const string PATH = "./resources/";

接下来是Player.h

#pragma once
#include <string>
#include "constants.h"
using namespace std;

class Player
{
public:
	Player();
	int speed;
	int y;
	int x;
	int pic_w;
	int pic_h;
	void move(int a);
	void checkBound();
};

Player.cpp:

#include "Player.h"
#include "constants.h"

Player::Player() {
	speed = 12;
	y = HEIGHT - 170;
	x = 300;
	pic_w = 100;
	pic_h = 126;
}

void Player::move(int a) {
	if (a == 0) { // left
		x -= speed;
	}
	else { // right
		x += speed;
	}
}

void Player::checkBound() {
	if (x < 0) {
		x = 0;
	}
	else if (x + pic_w > WIDTH) {
		x = WIDTH - pic_w;
	}
}

代码都很短,也实现了移动和限制活动区域(checkBound)操作,不难理解

接下来是作者自己写了一个实用的头文件,用于判断2者是否碰撞,CheckCollide.h:

#pragma once

bool collide(
	int l,
	int r,
	int t,
	int d,
	int el,
	int er,
	int et,
	int ed) {
	if ((l <= er && t <= ed && l >= el && t >= et) ||
		(r >= el && t <= ed && r <= er && t >= et) ||
		(l <= er && d >= et && l >= el && d <= ed) ||
		(r >= el && d >= et && r <= er && d <= ed)) {
		return true;
	}
	return false;
}

其中,l、r、t、d分别为第一个物体的左边x坐标、右边x坐标、上边y坐标、下边y坐标,el、er、et、ed是第二个物体的,然后进行判断,返回bool值,这个待会在main.cpp会用到

接下来也是一个常用的头文件,因为easyx渲染透明图片很麻烦,所以这个方法通过计算来绘制,这个是借用了EasyX 绘制透明背景图 - Bluemultipl - 博客园这篇文章的代码,PhotoTransparent.h

#pragma once

#include <graphics.h>
#include "constants.h"

void drawAlpha(IMAGE* image, int x, int y, int width, int height, int pic_x = 0, int pic_y = 0, double AA = 1)
{
	// 变量初始化
	DWORD* dst = GetImageBuffer();			// GetImageBuffer() 函数,用于获取绘图设备的显存指针, EasyX 自带
	DWORD* draw = GetImageBuffer();
	DWORD* src = GetImageBuffer(image);		// 获取 picture 的显存指针
	int imageWidth = image->getwidth();		// 获取图片宽度
	int imageHeight = image->getheight();	// 获取图片宽度
	int dstX = 0;							// 在 绘图区域 显存里像素的角标
	int srcX = 0;							// 在 image 显存里像素的角标

	// 实现透明贴图 公式: Cp=αp*FP+(1-αp)*BP , 贝叶斯定理来进行点颜色的概率计算
	for (int iy = 0; iy < height; iy++)
	{
		for (int ix = 0; ix < width; ix++)
		{
			// 防止越界
			if (ix + pic_x >= 0 && ix + pic_x < imageWidth && iy + pic_y >= 0 && iy + pic_y < imageHeight &&
				ix + x >= 0 && ix + x < WIDTH && iy + y >= 0 && iy + y < HEIGHT)
			{
				// 获取像素角标
				int srcX = (ix + pic_x) + (iy + pic_y) * imageWidth;
				dstX = (ix + x) + (iy + y) * WIDTH;

				int sa = ((src[srcX] & 0xff000000) >> 24) * AA;			// 0xAArrggbb; AA 是透明度
				int sr = ((src[srcX] & 0xff0000) >> 16);				// 获取 RGB 里的 R
				int sg = ((src[srcX] & 0xff00) >> 8);					// G
				int sb = src[srcX] & 0xff;								// B

				// 设置对应的绘图区域像素信息
				int dr = ((dst[dstX] & 0xff0000) >> 16);
				int dg = ((dst[dstX] & 0xff00) >> 8);
				int db = dst[dstX] & 0xff;
				draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16)  //公式: Cp=αp*FP+(1-αp)*BP  ; αp=sa/255 , FP=sr , BP=dr
					| ((sg * sa / 255 + dg * (255 - sa) / 255) << 8)         //αp=sa/255 , FP=sg , BP=dg
					| (sb * sa / 255 + db * (255 - sa) / 255);              //αp=sa/255 , FP=sb , BP=db
			}
		}
	}
}

接下来这一个是作者自己写的一个常用的头文件StringCharExchange.h:

#pragma once

#include <graphics.h>
#define BUFFERSIZE 1024

TCHAR* Transform(char c[BUFFERSIZE]) {
	TCHAR result[BUFFERSIZE];
	MultiByteToWideChar(CP_ACP, 0, c, -1, result, BUFFERSIZE);
	return result;
}

TCHAR* Transform(string s) {
	TCHAR result[BUFFERSIZE];
	char c[BUFFERSIZE];
	strcpy_s(c, s.c_str());
	MultiByteToWideChar(CP_ACP, 0, c, -1, result, BUFFERSIZE);
	return result;
}

上面实现了char*转TCHAR*以及string转TCHAR*

最后是main.cpp

#include <graphics.h>
#include "constants.h"
#include "Player.h"
#include "PhotoTransparent.h"
#include <time.h>
#include <vector>
#include "Bullet.h"
#include "Enemy.h"
#include "CheckCollide.h"
#include "StringCharExchange.h"

Player* player = new Player();
vector<Bullet>* bullets = new vector<Bullet>;
vector<Enemy>* enemies = new vector<Enemy>;

int startTime[5] = { 0 };
int durations[5] = { 200,1000,0,0,0 };

int health = 5;
int score = 0;
bool lose = false;

void DrawBackGroundImage() {
	IMAGE img;
	loadimage(&img, Transform(PATH+"background2.png"), WIDTH, HEIGHT);
	putimage(0, 0, &img);
}

void DrawPlayer() {
	IMAGE img;
	loadimage(&img, Transform(PATH + "myplane1.png"), player->pic_w, player->pic_h);
	drawAlpha(&img, player->x, player->y, player->pic_w, player->pic_h);
}

void DrawBullets() {
	for (int i = 0;i < bullets->size();i++) {
		Bullet* bullet = &(bullets->at(i));
		IMAGE img;
		loadimage(&img, Transform(PATH + "bullet1.png"));
		drawAlpha(&img, bullet->x, bullet->y, bullet->pic_w, bullet->pic_h);
	}
}

void DrawEnemies() {
	for (int i = 0;i < enemies->size();i++) {
		Enemy* enemy = &(enemies->at(i));
		IMAGE img;
		switch (enemy->type) {
		case 1:
			loadimage(&img, Transform(PATH + "small_enemy.png"));
			break;
		case 2:
			loadimage(&img, Transform(PATH + "mid_enemy.png"));
			break;
		case 3:
			loadimage(&img, Transform(PATH + "big_enemy.png"));
			break;
		default:
			break;
		}
		drawAlpha(&img, enemy->x, enemy->y, enemy->pic_w, enemy->pic_h);
	}
}

void UpdateBullets() {
	for (int i = 0;i < bullets->size();i++) {
		Bullet* bullet = &(bullets->at(i));
		bullet->move();
		bullet->checkBound();
		if (bullet->dead) {
			swap(bullets->at(i), bullets->at(bullets->size() - 1));
			bullets->pop_back();
			i--;
		}
	}
}

void UpdateEnemies() {
	for (int i = 0;i < enemies->size();i++) {
		Enemy* enemy = &(enemies->at(i));
		enemy->move();
		enemy->checkBound();
		if (enemy->dead) {
			swap(enemies->at(i), enemies->at(enemies->size() - 1));
			enemies->pop_back();
			i--;
		}
	}
}

void CheckPlayerHit() {
	for (int i = 0;i < enemies->size();i++) {
		Enemy* enemy = &(enemies->at(i));
		int l, r, t, d;
		int el, er, et, ed;
		l = player->x;
		r = player->x + player->pic_w;
		t = player->y;
		d = player->y + player->pic_h;
		el = enemy->x;
		er = enemy->x + enemy->pic_w;
		et = enemy->y;
		ed = enemy->y + enemy->pic_h;
		if (collide(l, r, t, d, el, er, et, ed)) {
			health--;
			swap(enemies->at(i), enemies->at(enemies->size() - 1));
			enemies->pop_back();
			i--;
		}
	}
}

void CheckBulletHit() {
	for (int i = 0;i < bullets->size();i++) {
		Bullet* bullet = &(bullets->at(i));
		int l, r, t, d;
		l = bullet->x;
		r = bullet->x + bullet->pic_w;
		t = bullet->y;
		d = bullet->y + bullet->pic_h;
		for (int j = 0;j < enemies->size();j++) {
			Enemy* enemy = &(enemies->at(j));
			int el, er, et, ed;
			el = enemy->x;
			er = enemy->x + enemy->pic_w;
			et = enemy->y;
			ed = enemy->y + enemy->pic_h;
			if (collide(l, r, t, d, el, er, et, ed)) {
				enemy->health--;
				if (enemy->health <= 0 || enemy->dead) {
					score += enemy->static_health;
					swap(enemies->at(j), enemies->at(enemies->size() - 1));
					enemies->pop_back();
				}
				j--;
				swap(bullets->at(i), bullets->at(bullets->size() - 1));
				bullets->pop_back();
				i--;
				break;
			}
		}
	}
}

void _DrawText() {
	settextcolor(RGB(0, 0, 255));
	settextstyle(26, 0, _T("simhei"));
	char c[BUFFERSIZE];
	snprintf(c, 64, "Health: %d", health);
	TCHAR* c2 = Transform(c);
	outtextxy(10, 10, c2);
	settextcolor(RGB(255, 0, 0));
	settextstyle(26, 0, _T("simhei"));
	char c3[BUFFERSIZE];
	snprintf(c3, 64, "Score: %d", score);
	TCHAR* c4 = Transform(c3);
	outtextxy(10, 44, c4);
}

void CheckLose() {
	if (health <= 0) {
		lose = true;
	}
}

void Draw() {
	CheckLose();
	DrawBackGroundImage();
	_DrawText();
	if (!lose) {
		UpdateBullets();
		UpdateEnemies();
		CheckPlayerHit();
		CheckBulletHit();
		DrawPlayer();
		DrawEnemies();
		DrawBullets();
	}
}

void Timer() {
	int endTime = clock();
	if (endTime - startTime[0] >= durations[0]) { // Create bullet event
		bullets->push_back(Bullet(player->x + player->pic_w / 2, player->y, 0));
		startTime[0] = endTime;
	}
	if (endTime - startTime[1] >= durations[1]) { // Create enemy event
		enemies->push_back(Enemy(random(1,3)));
		startTime[1] = endTime;
	}
}

int Listen() {
	if (GetAsyncKeyState(VK_ESCAPE)) {
		return 1;
	}
	if (GetAsyncKeyState(VK_LEFT)) {
		player->move(0);
		player->checkBound();
	}
	if (GetAsyncKeyState(VK_RIGHT)) {
		player->move(1);
		player->checkBound();
	}
	return 0;
}

int main() {
	initgraph(WIDTH, HEIGHT);
	setbkmode(TRANSPARENT);
	BeginBatchDraw();
	while (true) {
		Draw();
		if (Listen()) {
			break;
		}
		Timer();
		FlushBatchDraw();
	}
	EndBatchDraw();
	closegraph();
	return 0;
}

实现了程序的主流程


这个是作者学习C++做的第一个小游戏,十分简陋~~~

喜欢就来个3连吧~~~

逐步实现一个简易的飞机大战(c++) 用easy图形库做一个简单的c++小游戏—简单版飞机大战 某大一学生,无奈在家上网课,慌得无聊。无意间认识了easyx图形库,便有了新的想法,搞一个飞机大战。当时每天写一点,日积月累,也就完成了。 以下为某大一学生,学习了半年c++以及一些课外知识所实现的:(其实课上学不了多少东西,很多知识都要课外自学的) 开发环境:visual c++6.0 库:easyx图形库 下载地址>>> (https://easyx.cn/downloads/) 我当初分成6步实现(瞎设计的,其实就是想到啥写啥 阅读详情

相关推荐

笨方法实现基于EasyX的飞机大战

笨方法实现基于EasyX的飞机大战 此代码只能用于学习用途 因为此代码还存在大量不足,只能给你一定的参考。话不多说,我直接附上代码吧。 我这里的宏定义太多了,不建议大家使用,所以大家直接在结构体里面定义图片的高宽度就好了,游戏素材下载链接在最下方 // Planegame.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // // 飞机大战.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include<graphics.h> #in

qwrewt的博客 1563

EasyX实现简易贪吃蛇

EasyX实现简易贪吃蛇

congfen214的博客 2161

飞机大战c语言

飞机大战c语言、简单游戏 欢迎使用飞机大战 概述 项目:飞机大战 主要功能有以下几点:飞机发射子弹,击中敌机敌机血量减少,敌机与飞机碰撞飞机血量减少,击中敌机分数增加,到达一定分数进入下一个关卡,直到通关或游戏结束。 关卡设置 本次飞机大战游戏中共设置了三个关卡,第一关的难度设置较低,仅有敌机对其进行攻击;第二关背景切换,在原有的基础上子弹数量增加;第三关在第二关的基础上子弹数量增加,新出现了大血量boss,当大boss被消灭后通关成功。 敌机设置 敌机随机出现,当敌机与战机相撞或被战机的子弹击中时,小敌机

qq_52478247的博客 5624

小白也能用C/C++做游戏--EasyX库配置(保姆级)

通过这篇文章,你可以完成对EasyX库的配置,开始开发属于自己的C/C++游戏!!!

m0_64086536的博客 8326

C/C++游戏项目教程:看完只会说“编译飞机大战太简单了吧”

《飞机大战》这是一款经典飞行射击类游戏,为玩家呈现一场不一样射击体验。简单的触屏操作,触屏按住随意一个地方,左右移动,便可自动攻击敌人,上下移动亦可躲避强敌。玩家在游戏中要做的就是驾驶着最新战机,向敌人发起冲击。 今天我就用C++带大家一步步去完成风靡全球的小程序飞机大战小游戏~ PS:要安装easyx图形库哦 #include<easyx.h> 开发工具为VS2013 正片开始: 第一步: 打开vs2013,创建一个项目,并将准备好的素材资源放到同级目录下(素材可以在文章

yx5666的博客 1万+

如何用C语言加上easyx做出一个高逼格的迷宫游戏

迷宫游戏有多种类型,例如营救公主类、闯关类等,其他类型就不一一列举了。但无论哪种类型的迷宫游戏,其核心功能始终是迷宫的实现。不同的游戏只会根据自身的性质,在迷宫中加入一些特定元素。我们今天的任务,便是用C语言来实现这一核心功能,确保其原汁原味,不添加任何额外功能。

基于easyX制作的C语言小游戏

游戏基于贪吃蛇和飞机大战思想制作,利用easyX实现的纯C语言小游戏

weixin_42098648的博客 9530

捷联惯导总结--初始对准,位置标定,INS姿态更新,GPS/INS组合

惯导及组合导航回顾  2018.09.16 今天和17系的同学一起把惯导的流程捋了一遍,为了加深自己的记忆,这里在前面把心得大致列出来。 我们这里只考虑捷联式惯导及松组合 首先拿到惯性传感器(加速度计和陀螺仪)需要对其进行标定,是为了求出零偏,比例因子,交轴耦合这些误差。这些误差有的虽然在出厂时会给出,但是考虑到实际环境不同,还是要做标定。一般采用的是六位置旋转法,针对加速度计和陀螺仪同时...

赤豆几维 5万+

飞翔的小鸟--easyx版

飞翔的小鸟--easyx版

来自想要赚大钱的小周同学 2014

Wireshark抓包实战:5个CTF比赛中高频出现的流量分析技巧(附真实案例)

本文分享了Wireshark在CTF比赛和实战渗透中的五个核心流量分析技巧。内容涵盖从宏观统计概览锁定可疑目标、深度解析ICMP与HTTP等协议、追踪重组完整会话流,到利用字符串搜索和命令行工具进行自动化分析。掌握这些高阶技巧能显著提升分析海量网络流量的效率与精准度。

rrr55的博客 260

群晖NAS搭建Git Server避坑指南:从SSH配置到权限管理的完整流程

本文提供了一份详尽的群晖NAS搭建Git Server实战指南。文章从启用并安全配置SSH服务入手,深入解析了用户权限体系设计、SSH连接与仓库初始化、客户端SSH密钥配置等核心步骤,并提供了常见错误排查与生产环境加固方案,帮助开发者成功构建私有、安全的代码托管平台。

rock5的博客 418

Easyx | 游戏实例:2048 大作战

C/C++编写2048大作战!

黑洞极客的博客 3647

基于CrossSim的存储硬件原型机ANN仿真:MNIST手写数字识别实现与分析

本项目基于CrossSim仿真平台,在存储硬件原型机上实现了MNIST手写数字识别的ANN模型。通过搭建CrossSim仿真环境,设计传统ANN基准模型和考虑硬件非理想特性的CrossSim模型,对比分析了不同配置下的识别性能。实验结果表明,在引入硬件噪声和器件变异的情况下,模型准确率仍能达到95%以上,验证了存储内计算架构的可行性。研究为存储硬件与计算单元融合提供了实验依据,展示了CrossSim在神经形态计算系统仿真中的实用价值。

huanghm88的专栏 594

!新手小白C/C++小游戏飞机大战 小白入手!!!Easyx库

你们好呀! 相信大家学习着c/c++的时候,总是感觉黑黑的运行界面感觉不太漂亮 本人作为一条大学咸鱼,也这么觉得。后来啊接触到了Easyx库。毕竟咸鱼嘛,学的不怎么样。但是这个库请各位和我一样的小白看一看,个人觉得不错(咸鱼的认可HHHH),对新手很友好。 废话不多说!看下面咱们进入正题↓ 这就是用Easyx做出来的一个简单小游戏啦,自己做的不太好 因为是懒虫(HHHH),飞机和敌人什么的图片都没有弄好,都是在网上随便找的图片。敌人我就随便放了个照片 相信大家一定比我设计的好!!(飞机是真的丑哈哈哈)。

老拆的博客 1万+

海思3516A移植MT7601U编译过程记录

官方地址:https://www.mediatek.com/products/broadbandWifi/mt7601 tar -xjf DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2 cd DPO_MT7601U_LinuxSTA_3.0.0.4_20130913 1> Makefile替换 PLATFORM = HISI_3516A ifeq ($(PLATFORM),HISI_3516A) LINUX_SRC = /home/wbk/test/linu

qq_39048131的博客 1230

OpenCV实战(1)——OpenCV与图像处理基础

OpenCV 是一个跨平台计算机视觉和机器学习库,实现了图像处理和计算机视觉方面的很多通用算法。本节将介绍 OpenCV 的基础知识,以及如何编译运行 OpenCV 程序,并介绍如何完成最基本的图像处理任务——读取、显示和保存图像。除此之外,鼠标事件和图形绘制也是 OpenCV 计算机视觉项目中常用的基本功能,本节介绍了如何使用这两个重要的 OpenCV 功能。

盼小辉丶的博客 12万+

【C++】飞机大战项目记录

本文记录我进行飞机大战项目的思路,(源代码与图片参考自《你好编程》)

叫我龙翔的博客 7719

【AI智能体】Hermes Agent 从部署到项目实战操作详解

Hermes Agent 桌面版从安装到实战操作详解

congge 5130

飞机大战——图文详解

文章目录1.前言2.效果展示3.图片素材的准备4.需要构建的函数5.变量的定义6.数据的初始化7.画面的呈现8.飞机移动的实现9.子弹的构建和移动9.1子弹的构建9.2子弹的移动10.敌机的创建和移动11.敌机消灭函数12.结束语13.完整代码 1.前言 本次需要用到easyx图形库,关于easyx的安装和一些基本函数,我在另外一篇推箱子小游戏中也有介绍,需要了解的小伙伴也可以点击进去看一看,下面会附上链接; 在写程序过程中需要的图片,可以去百度找,也可以自己制作,有想要了解如何制作的小伙伴也可以点击我下面

ych9527的博客 1万+

基于Python实现学习进度跟踪系统

{{ task }}: {{ "%.1f"|format(hours) }}小时

寒寒豆豆软件公司的博客 195

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

《C++ 小游戏:简易飞机大战游戏的实现》

《C++ 小游戏:简易飞机大战游戏的实现》

TTKunn的博客 2698

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言课程设计-基于EasyX的飞机大战游戏

EasyX是基于C++的图形库,使用EasyX学习C语言,可以摆脱黑洞洞的控制台,快速做出有意思的项目。编程是有趣的,但是传统的C语言教学,教学的目的却是考试与刷题。于是我写了一个飞机大战的游戏,可以作为C语言的课程设计。完整的代码接近1000行,编写的过程也比较复杂。我带过一些学生的实训课,授课过程录屏了,放在B站上了。如果列位看官老爷感兴趣,再考虑下整理文档教程吧。 C课程设计-基于EasyX的飞机大战游戏

geekYatao 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

用C语言实现飞机大战小游戏

我的个人博客:谋仁·Blog 该项目已上传至GitHub:点击跳转 文章目录摘要运行环境整体功能思维导图效果预览具体功能的实现图形界面:EasyXEasyX图形库简介EasyX图形库的一些基本功能(该项目用到的)菜单界面玩法介绍界面游戏界面玩家图片的透明背景输出玩家的移动敌机的产生与移动攻击系统玩家的血量控制游戏评分及结束界面背景音乐的播放源代码一些细节&技巧icon图标的制作与插入游戏的素材收集封面的平面设计易错集存在的缺陷参考资料 摘要 这是一个用C语言实现的基于EasyX图形库的飞机大战小

谋仁·BLOG 2096

easyx图形库6:实现飞机大战:

1.我们的父目录:两个方法,x,y,宽和高;2.两个图像(mask+img)的指针数组:3.飞机的状态:4.飞机的生命数值值:5.飞机或者的计数器(作用:不要让飞机生成的太快:)//枚举类型可以和图片的状态非常好的联系起来://普通状态//毁坏过程//销毁状态://作为基本的成员变量://两个图片//状态://生命数值:int lift;//记数器//初始化英雄飞机://销毁英雄飞机:1.精灵的父对象://父对象int yA;

2201_75943325的博客 1686

使用 C++ 开发出 【飞机大战】

本文主要作为自己之前学习C++的总结,顺便做一个游戏小项目,回顾一下之前的知识,加深数组、循环、结构体的一些的理解

身在边城 心在编程 2909

easyX飞机大战demo

源代码 main.cpp #include "game.h" int main() { Run(); } game.h #include <easyx.h> #include <conio.h> #include <time.h

legroft的博客 1376
上一篇: 解决Visual Studio中C++创建类时报错“未能返回新代码元素,可能是语法错误,新元素名:xxx”的问题
下一篇: 解决C++ Easyx char和string无法转为LPCTSTR的问题
Leleprogrammer
博客等级 码龄5年 1万+粉丝 103原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值