1-2 飞机大战游戏场景
前言:
根据前面的项目框架,搭建游戏的运行场景......
1.0 框架预览

基于该框架首先实现游戏的运行场景
2.0 图片文件
创建图片文件,本次项目使用easyx作为图形库文件,在easyx中想要显示图片,需要有一张图片和图片的掩码文件,创建image.h文件和image.cpp文件用于图片设置,具体创建效果如下所示。创建的头文件中做了函数的声明,包含函数的x,y轴的坐标和图片的地址,掩码图片的地址。

#ifndef __IMAGE_H_
#define __IMAGE_H_
#include <easyx.h>void put_trans_parent_image
(int x, int y, const IMAGE* mask, const IMAGE* img
);#endif

#define _CRT_SECURE_NO_WARNINGS
#include "image.h"void put_trans_parent_image(int x, int y, const IMAGE *mask, const IMAGE *img)
{putimage(x, y, mask, SRCAND);putimage(x, y, img, SRCPAINT);
}
3.0 程序对象
注:对于这款飞机大战游戏,对应的对象就是精灵,然后将将所有元素的共性抽象成一个对象进行方便后续的调用,具体程序如下所示。

这个精灵对象就是所有游戏中出现的对象的共同特性,我们只需要继承精灵,就能在此基础上,续写其他的对象了。将上面的代码写入文件 sprite.h,并添加上头文件守卫。
#ifndef __SPRITE_H_
#define __SPRITE_H_// 飞机的属性和方法
typedef struct sprite
{void (*draw)(sprite*);void (*update)(sprite*);int x;int y;int width;int height;
}sprite_t;#endif
hero.h文件,继承sprite对象的属性和方法

#ifndef __HERO_H_
#define __HERO_H_#include "sprite.h"
#include <easyx.h>typedef enum heroStatus
{hero_normal0 = 0, // 英雄处于正常的状态hero_normal1 = 1, // 英雄处于正常的状态hero_down0 = 3, // 英雄处于销毁状态1hero_down1 = 4, // 英雄处于销毁状态2hero_down2 = 5, // 英雄处于销毁状态3hero_down3 = 6, // 英雄处于销毁状态4hero_destory // 英雄完全被销毁
}heroStatus_e;typedef struct hero
{sprite_t super;IMAGE* imgArrHero[6]; // 对应6种不同状态的图片IMAGE* imgArrHeroMask[6]; // 对应6种不同状态的掩码heroStatus_e status; // 英雄的状态更换int life; // 英雄的生命值int heroUpdateCnt; // 计数值
}hero_t;void heroInit(hero_t* h);void heroDestory(hero_t* h);#endif
hero.cpp文件,对hero.h文件中的对象和参数进行处理

#define _CRT_SECURE_NO_WARNINGS
#include "hero.h"
#include <stdio.h>
#include "image.h"#define HERO_IMAGE_STRUCT 6
#define IMAGE_PAST 50
#define MASK_IMAGE_PAST 50
#define IMAGE_TYPE_NORMAL 2
#define IMAGE_TYPE_DOWN 4enum heroStatus heroStatusSqauence[7] =
{hero_normal0,hero_normal1,hero_down0,hero_down1,hero_down2,hero_down3,hero_destory
};void heroDraw(hero_t* h) // 绘制函数
{put_trans_parent_image(h->super.x,h->super.y,h->imgArrHero[h->status],h->imgArrHeroMask[h->status]);
};void heroUpdate(hero_t* h) // 飞机状态更新
{h->heroUpdateCnt++;if (h->heroUpdateCnt >= 15){h->heroUpdateCnt = 0;if (h->life != 0){if (h->status == hero_normal0){h->status = hero_normal1;}else if (h->status == hero_normal1){h->status = hero_normal0;}}else{// 状态向后变化if (h->status < hero_destory){h->status = heroStatusSqauence[h->status + 1];}}}
}void heroInit(hero_t *h)
{h->super.draw = (void (*)(sprite_t*))heroDraw;h->super.update = (void (*)(sprite_t*))heroUpdate;h->heroUpdateCnt = 0;h->status = hero_normal0;h->life = 1;h->super.x = 178;h->super.y = 600;for (int i = 0; i < HERO_IMAGE_STRUCT; i++){h->imgArrHero[i] = new IMAGE;h->imgArrHeroMask[i] = new IMAGE;}char imgPath[IMAGE_PAST];char imgMaskPath[MASK_IMAGE_PAST];for (int i = 0; i < IMAGE_TYPE_NORMAL; i++) // 飞机完整的2种状态{sprintf(imgPath, "asset/img/hero/hero%d.png", i);sprintf(imgMaskPath, "asset/img/hero/hero%d_mask.png", i);loadimage(h->imgArrHero[i], imgPath);loadimage(h->imgArrHeroMask[i], imgMaskPath);}for (int i = 0; i < IMAGE_TYPE_DOWN; i++) // 飞机销毁的4种状态{sprintf(imgPath, "asset/img/hero/hero_down%d.png", i);sprintf(imgMaskPath, "asset/img/hero/hero_down%d_mask.png", i);loadimage(h->imgArrHero[i + 2], imgPath);loadimage(h->imgArrHeroMask[i + 2], imgMaskPath);}
}// 销毁飞机函数
void heroDestory(hero_t* h)
{for (int i = 0; i < HERO_IMAGE_STRUCT; i++){delete h->imgArrHero[i];delete h->imgArrHeroMask[i];}
}
4.0 游戏循环
gameLoop.h文件:现在,我们将这个循环封装成一个函数,放置到源文件 gameloop.cpp 当中。函数的参数为 sprite 对象
指针与游戏帧率 fps 。为了保证 sprite 对象的 draw 方法与 update 方法,每一帧都被执行一次。可以在循环中,调用 sprite 的 draw 方法与 update 方法。

gameLoop.cpp文件
#define _CRT_SECURE_NO_WARNINGS
#include <easyx.h>
#include "gameloop.h"
#include "sprite.h"void gameLoop(sprite_t* s, int fps)
{timeBeginPeriod(1); // 设置系统计时器的分辨率到 1 毫秒,提高时间测量精度LARGE_INTEGER startCount, endCount, F; // 声明用于高精度计时的变量QueryPerformanceFrequency(&F); // 获取高性能计数器每秒的频率(即每秒计数值),存储在 F 中BeginBatchDraw(); // 开始批处理绘图模式,减少不必要的屏幕刷新,优化绘图效率while(1) // 无限循环,保持游戏运行{QueryPerformanceCounter(&startCount); // 获取当前计数器值作为起始时间点cleardevice(); // 清除绘图设备,准备新一帧的绘制s->draw(s); // 绘制 s->update(s); // 状态更新 QueryPerformanceCounter(&endCount); // 获取当前计数器值作为结束时间点long long elapse = // 算从帧开始到结束所经过的时间,单位是微秒(endCount.QuadPart - startCount.QuadPart) /F.QuadPart * 1000000;while (elapse < 1000000 / fps) // 确保每一帧的时间间隔大致等于 1000000 / fps 微秒(即每秒帧数的倒数){Sleep(1);QueryPerformanceCounter(&endCount);elapse = (endCount.QuadPart - startCount.QuadPart)* 1000000 / F.QuadPart;}FlushBatchDraw(); // 将批处理中的绘图操作立即提交并显示在屏幕上}EndBatchDraw(); // 结束批处理绘图模式timeEndPeriod(1); // 恢复系统计时器的默认分辨率
}
5.0 游戏场景
background.h文件,背景文件中包含背景A和背景B,背景还继承了精灵的属性和方法,同时包含存储背景图片地址的参数。

#ifndef __BACKGROUND_H_
#define __BACKGROUND_H_
#include "sprite.h"
#include <easyx.h>typedef struct background
{sprite_t super;int yA;int yB;IMAGE* imgBackground;
}background_t;void backgroundInit(background_t *);void backgroundDestory(background_t *);#endif
background.cpp文件:
backgroundpraw 为分别绘制A、B两幅背景的函数。两幅背景图片的左上角坐标分别为:(0, yA),(0,yB) 图片为 imgBackground。
backgroundupdate 更新两幅图片的左上角坐标,每次移动1像素。若 yA 大于等于0,则将 yA 复位
为-750,yB 复位为0。
接着就是初始化函数,将 draw 和 update 两个方法赋值为 backgroundpraw 和backgroundupdate yA初始值设置为-750, y8 初始值设置为0。创建并载入图片 img/bg·png。
最后是 backgroundDestroy 函数,销毁初始化时创建的 IMAGE 对象即可。
把当前主函数中 hero 对象,改为 background 对象,可以看到游戏循环 gameloop ,正常渲染并更新了背景对象。
6.0 渲染更新

#define _CRT_SECURE_NO_WARNINGS
#include "gameloop.h"
#include "hero.h"
#include "background.h"int main(void)
{initgraph(422, 750); // 初始化画布setbkcolor(WHITE); // 设置画布颜色cleardevice(); // 清除画布hero_t h;heroInit(&h);gameLoop((sprite*)&h, 60);heroDestory(&h);background b;backgroundInit(&b);gameLoop((sprite_t*)&b, 60);backgroundDestory(&b);closegraph();return 0;
}
7.0 运行结果

相关文章:
1-2 飞机大战游戏场景
前言: 根据前面的项目框架,搭建游戏的运行场景...... 1.0 框架预览 基于该框架首先实现游戏的运行场景 2.0 图片文件 创建图片文件,本次项目使用easyx作为图形库文件,在easyx中想要显示图片,需要有一张图片和图片的掩码…...
Mac Electron 应用签名(signature)和公证(notarization)
在MacOS 10.14.5之后,如果应用没有在苹果官方平台进行公证notarization(我们可以理解为安装包需要审核,来判断是否存在病毒),那么就不能被安装。当然现在很多人的解决方案都是使用sudo spctl --master-disable,取消验证模式&#…...
Sklearn 中的逻辑回归
逻辑回归的数学模型 基本模型 逻辑回归主要用于处理二分类问题。二分类问题对于模型的输出包含 0 和 1,是一个不连续的值。分类问题的结果一般不能由线性函数求出。这里就需要一个特别的函数来求解,这里引入一个新的函数 Sigmoid 函数,也成…...
【阅读笔记】New Edge Diected Interpolation,NEDI算法,待续
一、概述 由Li等提出的新的边缘指导插值(New Edge—Di-ected Interpolation,NEDI)算法是一种具有良好边缘保持效果的新算法,它利用低分辨率图像与高分辨率图像的局部协方差问的几何对偶性来对高分辨率图像进行自适应插值。 2001年Xin Li和M.T. Orchard…...
编程题-最长的回文子串(中等)
题目: 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: 输入:s &…...
Versal - 基础3(AXI NoC 专题+仿真+QoS)
目录 1. 简介 2. 示例 2.1 示例说明 2.2 创建项目 2.2.1 平台信息 2.2.2 AXI NoC Automation 2.2.3 创建时钟和复位 2.3 配置 NoC 2.4 配置 AXI Traffic 2.5 配置 Memory Size 2.6 Validate BD 2.7 添加观察信号 2.8 运行仿真 2.9 查看结果 2.9.1 整体波形 2.9…...
知识库建设对提升团队协作与创新能力的影响分析
内容概要 在当今快速变革的商业环境中,知识库建设的重要性愈发凸显。它不仅是信息存储的载体,更是推动组织内部沟通与协作的基石。通过系统整理与管理企业知识,团队成员能够便捷地访问相关信息,使得协作过程更为流畅,…...
Java 实现Excel转HTML、或HTML转Excel
Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,以便更好地利用和展示数据。本文将介绍如何通过 Java 实现 E…...
stack 和 queue容器的介绍和使用
1.stack的介绍 1.1stack容器的介绍 stack容器的基本特征和功能我们在数据结构篇就已经详细介绍了,还不了解的uu, 可以移步去看这篇博客哟: 数据结构-栈数据结构-队列 简单回顾一下,重要的概念其实就是后进先出,栈在…...
云计算与虚拟化技术讲解视频分享
互联网各领域资料分享专区(不定期更新): Sheet 前言 由于内容较多,且不便于排版,为避免资源失效,请用手机点击链接进行保存,若链接生效请及时反馈,谢谢~ 正文 链接如下(为避免资源失效&#x…...
python flask 使用 redis写一个例子
下面是一个使用Flask和Redis的简单例子: from flask import Flask from redis import Redisapp Flask(__name__) redis Redis(hostlocalhost, port6379)app.route(/) def hello():# 写入到Redisredis.set(name, Flask Redis Example)# 从Redis中读取数据name re…...
深入解析 Linux 内核内存管理核心:mm/memory.c
在 Linux 内核的众多组件中,内存管理模块是系统性能和稳定性的关键。mm/memory.c 文件作为内存管理的核心实现,承载着页面故障处理、页面表管理、内存区域映射与取消映射等重要功能。本文将深入探讨 mm/memory.c 的设计思想、关键机制以及其在内核中的作用,帮助读者更好地理…...
跟我学C++中级篇——64位的处理
一、计算机的发展 计算机从二进制为基础开始描述整个世界,但正如现实世界一样,十进制为主的世界也会有万千百概念。所以在实际的应用中,会出现32位和64位的计算机系统。当然,前面还有过16位、8位和4位等,以后还可以会…...
指针的介绍2后
1.二级指针 1.1二级指针的介绍 二级指针是指向指针的指针 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 100;int* pa &a;int** ppa &pa;printf("a %d\n", a);printf("&a(pa) %p\n", pa);prin…...
Linux 学习笔记__Day3
十八、设置虚拟机的静态IP 1、VMware的三种网络模式 安装VMware Workstation Pro之后,会在Windows系统中虚拟出两个虚拟网卡,如下: VMware提供了三种网络模式,分别是:桥接模式(Bridged)、NAT…...
Ubuntu x64下交叉编译ffmpeg、sdl2到目标架构为aarch64架构的系统(生成ffmpeg、ffprobe、ffplay)
一、编译SDL2-2.0.9 (1), ./configure --prefix/home/z/Desktop/sdl2 --enable-sharedyes --enable-nasmno --enable-audiono --enable-ossno --enable-alsano --enable-alsa-sharedno --enable-pulseaudiono --enable-pulseaudio-sharedno …...
【时时三省】(C语言基础)文件的随机读写
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 fseek 根据文件指针的位置和偏移量来定位文件指针 示例: 这个输出的就是ade seek_cur的意思是从当前偏移量 2就是从a往后偏移两个就是d 偏移量 SEEK_CUR…...
HPO3:提升模型性能的高效超参数优化工具
引言 在当今快速发展的数据科学和机器学习领域中,超参数优化(Hyperparameter Optimization, HPO)是构建高性能模型不可或缺的一环。为了简化这一复杂过程,恒通网络科技团队推出了HPO3模块——一个专为Python开发者设计的强大库&a…...
【Docker】Docker入门了解
文章目录 Docker 的核心概念Docker 常用命令示例:构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么?****为什么 C 开发者需要 Docker?** **二、核心概…...
AIGC(生成式AI)试用 19 -- AI Agent
AI Agent:自主完成特定目标任务。 AI Agent:以大语言模型为大脑驱动的系统,具备自主理解、感知、规划、记忆和使用工具的能力,能够自动化执行完成复杂任务的系统。AI Agent不同于传统的人工智能,它具备通过独立思考、调…...
深入解析Safe智能合约钱包:架构、安全与开发实践
1. 项目概述:一个面向未来的智能合约钱包架构如果你在Web3领域待过一段时间,尤其是深度参与过以太坊生态的DApp开发或资产管理,那么你一定对“钱包”这个入口工具有着复杂的感情。一方面,它是我们通往链上世界的钥匙;另…...
Steam创意工坊模组下载终极指南:轻松获取1000+游戏模组的完整解决方案
Steam创意工坊模组下载终极指南:轻松获取1000游戏模组的完整解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为无法下载Steam创意工坊模组而烦恼吗&…...
合宙BluePill开发板:9.9元ARM Cortex-M核心板硬件解析与实战指南
1. 项目概述:一块“炸场”的开发板意味着什么最近在嵌入式开发圈子里,一块名为“合宙BluePill”的新品开发板以9.9元包邮的价格开售,瞬间点燃了众多开发者、电子爱好者和学生群体的热情。这个价格,别说是一块功能完整的开发板&…...
ROFL-Player:打破英雄联盟回放观看壁垒的革命性工具
ROFL-Player:打破英雄联盟回放观看壁垒的革命性工具 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 你是否曾经因为游戏版本…...
模型哈密顿量构建:从第一性原理到可计算有效模型的实践指南
1. 项目概述:从“黑箱”到“白箱”的化学计算桥梁 在计算化学和材料科学领域,我们常常面临一个核心矛盾:一方面,我们希望模型足够精确,能够捕捉到电子结构最细微的相互作用,比如使用密度泛函理论࿰…...
AI智能体配置管理实战:基于agent-config-manager的解决方案
1. 项目概述与核心价值最近在折腾一个多智能体协作的项目,发现配置文件的管理简直是个灾难。每个智能体(Agent)都有自己的一堆参数:API密钥、模型选择、系统提示词、温度值、最大token数……更别提不同环境(开发、测试…...
百度网盘Mac版终极加速方案:免费解锁SVIP级下载体验
百度网盘Mac版终极加速方案:免费解锁SVIP级下载体验 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版的蜗牛下载速度而烦…...
OpenRGB:打破RGB灯光控制壁垒的开源统一解决方案
OpenRGB:打破RGB灯光控制壁垒的开源统一解决方案 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. Releases ca…...
别再只盯着网线了!从双绞线到光纤,聊聊家庭网络布线选材的实战避坑指南
家庭网络布线实战指南:从铜缆到光缆的智能选择 装修新房或升级旧宅网络时,面对琳琅满目的网线规格和新兴的光纤方案,普通消费者往往陷入选择困境。Cat5e、Cat6、Cat7这些数字背后究竟意味着什么?光纤是否真的高不可攀?…...
Banana Pi BPI-M2S边缘AI开发板:双千兆网口与5TOPS NPU实战指南
1. 项目概述:一块为边缘AI与网络应用而生的全能型单板计算机 最近在捣鼓一些边缘计算和轻量级网络服务的项目,一直在寻找一块性能足够、接口丰富,同时性价比又不错的开发板。市面上常见的树莓派4B固然经典,但在面对需要一定AI推理…...
