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

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

虽然名义上是C语言的游戏,本质上,只是借着游戏的名头,产生了一些需求,然后用C语言解决问题而已。游戏的耐玩性一般,重点在于解决思路。我主要解决的问题有:

0、素材的处理

游戏中用到的所有素材都是在爱给网上下载。部分图片使用3D画图的神器选择功能,进行抠图,得到png图片。过程略。

1、透明贴图

使用png格式的图片,图片需要处理产生透明通道。easyX默认的putimage函数,会有黑色背景。

我查到的一些解决办法是,使用MASK,用类似于掩码的机制。而采用alpha透明贴图,会更加简单一些。
实现的效果:

2、获取按键输入

调用的函数为GetAsyncKeyState。相比于getchar函数,使用起来更加方便,也不会阻塞程序。

3、解决easyX动画造成的画面闪烁问题

以绿色的小球在黑色的背景移动为例,这是因为每次画一个小球,不论是绘制新的小球,还是绘制背景色的小球,对于小球当前位置和下个位置重叠的部分,会被重复操作,看上去是绿色→黑色→绿色。如下图所示。先是绘制了绿球(A区域),延时后绘制黑球遮挡住刚才绘制的绿球(B区域),改变小球的坐标后,在更新的坐标在绘制绿球(C区域)。

重叠的部分绿色和黑色交替出现(D区域),便会有闪烁的现象。EasyX提供了BeginBatchDraw(),FlushBatchDraw(),EndBatchDraw()批量绘图函数处理画面闪烁的问题。

4、动态控制刷新率,显示FPS

一些基于EasyX的游戏,每一轮的休眠的时间是固定的,但这种做法是不合理的。因为不同的电脑有不同的运行速度,每一轮执行所消耗的时间也不相同,所以一成不变的休眠时间会造成游戏在不同电脑上,或者处理不同业务逻辑的时候,游戏速度不同。
此处使用了动态控制刷新率的方法,获取某一轮已经运行的时间,然后休眠剩余的时间。例如将FPS控制在70左右,则每一轮休眠13ms。如果这一列的其它任务已经执行了5ms,那么需要休眠8ms。如果一起任务只用掉了3ms,那么休眠10ms。

5、敌机的运动路线,与画一条直线

此处画一条直线并非调用line函数,而是敌机运行轨迹的一种。我设计的敌机运行轨迹如下:

游戏中有3种UFO,每种UFO都有不同的移动方式,大型UFO缓慢向前,一段时间后再退回去;中型UFO向前蛇形走位,遇边折返;小型UFO快速撞向玩家飞机。
所以小UFO的实际路线是,根据自身出生的位置与当前我方所在的位置,画一条直线,然后沿着直线前进。

6、链表的使用

不同的飞行器都在发射子弹,跑出屏幕与击中敌人的子弹都会消失。每个子弹都有自身的属性,如坐标,速度,伤害,存在标记等。
子弹需要使用结构体来储存。如果使用结构体数组,数组长度是固定的,且从数组中删除一个元素很麻烦。因此,子弹理想的保存方式就是链表。
游戏中共有3个链表,实现了指定链表尾插,按值删除的功能。为不同的飞行器的子弹设置了不同的速度,实现了多种子弹的效果。

7、判断点是否在三角形内

这是一个很棒的算法。我方飞机的形象是三角形的纸飞机,我方飞机是否被击中,其实就是判断敌机发射的子弹是否在我方飞机的三角形内。
如果我方是个矩形,那么多几个判断语句,总能判断是否被击中;如果我方是个圆形,计算距离,也能判断是否被击中。但是,我方是个三角形,就必须采用特殊的算法。仍然采用矩形判断的方法,会出现明明子弹没有击中我方飞机,飞机却掉血的情况,用户体验很差。

本游戏采用了向量计算的方法,能够以很小的计算量,判断出点是否在三角形内。主要算法参考了这篇博客

8、插入音效

应用了windows的API,函数为mciSendString,实现背景音乐,射击音效与敌机消失音效。

具体的设计与讲解过程请移步B站视频,配套的笔记与源码,左侧扫描关注公众号yummy说电子,发送“飞机大战”

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

  1. 基于Java的飞机大战游戏的设计与实现论文

    源码下载 http://www.byamd.xyz/hui-zong-1/ 摘 要 现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communicat ...

  2. 基于Java的飞机大战游戏的设计与实现(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 基于Java的飞机大战游戏的设计与实现 摘   要 现如今,随着智能手机的兴起与普及,加上4G( ...

  3. 基于Java的飞机大战游戏的设计与实现(论文+源码)

    毕业设计(论文)任务书 第1页 毕业设计(论文)题目:基于Java的飞机大战游戏的设计与实现毕业设计(论文)要求及原始数据(资料):1.综述基于Java的飞机大战游戏的现状:2.深入了解Java的设计 ...

  4. 毕业设计 基于Java的飞机大战游戏的设计与实现

    文章目录 前言 一.项目设计 1. 模块设计 功能需求 游戏状态控制功能模块 游戏难度的调整模块 游戏界面绘画功能模块 玩家游戏控制功能模块 2. 实现效果 二.部分源码 项目源码 前言 今天学长向大 ...

  5. 基于Java的飞机大战游戏的设计与实现

    项目介绍 飞机大战主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐.我方飞机可以随意移动,敌方飞机无规律出现.游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就 ...

  6. 基于python的飞机大战游戏设计与实现

    基于python的飞机大战游戏设计与实现,采用MySQL+pygame+Tkinter实现飞机大战游戏,主要功能有注册+登录+游戏初始化(开始游戏+游戏操作说明+版权信息)+游戏主界面[设置敌机种类并 ...

  7. 飞机大战游戏python_基于Python的飞机大战游戏

    基于 Python 的飞机大战游戏 杨铠 [期刊名称] <电脑迷> [年 ( 卷 ), 期] 2017(000)021 [摘要] 我们每天都享受到科技带来的好处 , 了解计算机编程对每个人 ...

  8. 以java语言为工具的粗糙的飞机大战游戏的开发与实现

    以java语言为工具的粗糙的飞机大战游戏的开发与实现 第一步,导入外部图片的素材库 第二步,构建窗体和面板 第三步,在GamePanel上面构建背景图画 第四步,构建英雄机和敌人的机器,支援机器之类( ...

  9. 基于Java Swing 飞机大战游戏

    一.项目概要: 基于Java Swing飞机大战游戏,打死飞机,可以随机出现加血包.子弹升级包.并支持根据游戏的分数,调整游戏难度. 二.界面展示: 三.主要代码: package com.maoxu ...

  10. 电影售票管理c语言课程设计,基于c#图形编程的电影院售票信息管理系统设计与实现...

    内容简介: 课程设计 基于c#图形编程的电影院售票信息管理系统设计与实现,共24页,9487字. 摘要:利用计算机进行电影院售票信息管理,不仅能够保证准确.无误.快速输出,而且还可以利用计算机对有关信 ...

最新文章

  1. 使用KMeanCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小距离点
  2. sublime 写lua相关的插件 cocos
  3. HTTP协议---HTTP请求中的常用请求字段和HTTP的响应状态码及响应头
  4. 5-14卷积神经网添加正则化
  5. docker 打包部署 python项目_Docker如何部署Python项目的实现详解
  6. Kvm虚拟化性能测试与性能优化实践
  7. win11如何设置始终以管理员身份运行 windows11设置始终以管理员身份运行的方法步骤
  8. OPENCV3.0 双目立体标定
  9. npm命令启动前端项目
  10. 关于Y400 电源管理 Win10解决方案
  11. ckplay video.php,CKPLAYER播放器的教程-小白看
  12. python之随机生成一个手机号码
  13. 智能编程计算机表演赛,中国儿童青少年计算机表演赛在京闭幕
  14. 【SEED Labs 2.0】ARP Cache Poisoning Attack Lab
  15. 中职计算机专业英语说课稿,中职英语说课稿范文
  16. Network 【HTTPS请求/AFN】
  17. Vue Video.js播放m3u8视频流格式(video+videojs-contrib-hl)
  18. 解决伪原创视频 改变视频md5原创
  19. rt thread 使用FAL遇到fal_init() undefined reference
  20. 树莓派 3的新手指南

热门文章

  1. 提取锂离子电池IC(容量增量)曲线的详细过程处理
  2. 桌面widget详解(二)—— 基本的与service通信
  3. 隐藏jupyter notebook或jupyterlab运行代码后显示的红色警示框
  4. 「天锐绿盾」——数据防泄露(智能透明加密保护)企业加密软件
  5. Linux原生软件推荐
  6. 创建dataframe的几种方式——读取parquet格式的文件
  7. 教师工资管理系统毕业设计
  8. python程序员工资一般多少-没想到,学会Python即使不做程序员都能月入过万!
  9. Java程序设计(高级及专题)- GUI
  10. android5.1支持4g,安卓5.1系统4G网络 美伴M8智能后视镜_行车记录仪_汽车电子导购-中关村在线...