关于飞机射击类游戏的设计原理 (加入时间:2001-3-4)

作者:尹龙

水平有限,请别见怪:)

   众所周知,飞机射击类游戏几乎是我们接触到的第一类计算机游戏,不论是在街机中还是在计算机中,这一类游戏都是非常容易上手和招人喜爱的。就算是在这个即时战略游戏、3D第一视角游戏等盛行的年代,闲暇是玩玩打飞机的游戏也是很惬意的。

   在这几天里学完了有关 DirectX 方面的知识后,就上手编了一下飞机射击的游戏。看起来好象很复杂,其实只不过是些数据结构的集合而已,还是比较容易实现的。

   关于 DirectDraw 方面的编程,我就不想介绍了,因为任何一个人照本书看几天就可以编出象样的示范程序了,无非是在申请的2~3个表面上轮换贴图而已,WIN32 的 API 函数似乎已经让我们不需要花什么精力就可以实现非常平滑的动画了。

   下面简单介绍一下设计方法,关键是PLAYER的飞机和敌人的飞机的控制,以及它们的子弹的控制。

   很显然,用2个对象就可以实现它们的控制了。分别是PLAYER的飞机(可以是2架)、敌人的飞机。

   PLAYER的飞机类:

   

class CPlayer
{
private:
 CPoint ptPos;       //飞机坐标
 struct bullet *stBullet; //飞机所发出的所有子弹的链表

 struct display PlaneDisplay; //即有关飞机的位图信息指针、飞机有效区域等信息

private:
 FreshBullet();     //定时刷新子弹链表,除去已经爆炸或消失的子弹

public:
 int nOil;          //飞机油料
 int nSpeed;        //飞机速度
 int nDisplayState; //显示方式,如果被击中,就转向爆炸状态,以便
                    //飞机显示函数显示爆炸效果,比如,正常是1,
                    //消失是0,而爆炸就是-15。这样,显示函数可以
                    //单纯的按照这个植,在SUFFACE中计算图象位置
                    //直接显示就可以了,每次+1,这样-15加了15次就
                    //变成0了,动画也显示了,飞机也消失了,不需要
                    //其他处理。这样的方法也可以用在子弹的处理上,

public:
 CPoint GetPos();                //获取飞机的坐标
 void SetPos(CPoint);            //社顶设定飞机坐标
 void AddBullet(struct bullet*); //给飞机加入子弹,只要每隔设定的 TickTime
                                 //就加入一次,就可以形成连续的发弹效果

 void RunBullet();               //每隔设定的 TickTime,按Bullet的属性更新
                                 //Bullet的坐标,就可以形成复杂的子弹效果

struct bullet* IsAttack(CPoint); //获取当前坐标是否有子弹,并返回子弹指针

                                //这是为了判断敌机是否被击中所设计的函数

                                //敌机只要将自己的坐标放入CPoint中,就可以

                                //知道是否被击中,并且用指针设定子弹的状态
}

子弹的STRUCT
struct bullet
{
 struct bullet* next; //指向下一个子弹
 int nStyle;          //子弹的种类
 int nSpeed;          //子弹的速度
 int nDirection;      //子弹的方向
 int nDisplayState;   //显示方式,如果击中目标,就转向爆炸状态,以便
                      //Runbullet函数显示爆炸效果,同上边的飞机处理方法一样
}

敌机的类和PLAYER的飞机类差不多,去掉油料等的属性,多加入一个MotionStyle属性,控制飞机的

飞行方式和攻击方式,如直线、斜线、曲线、SIN方式、跟踪方式等。再加入一个Run()方法,利用

MotionStyle在每个TickTime时,决定飞机坐标的变换方法,这样就可以很直观的控制飞机的飞行和攻击。

在判断双方是否被攻击时,只要先用PLAYER对象的IsAttack,将所有敌机对象的坐标放入其中,就可以

获取所有被PLAYER击中的飞机,反过来用所有敌机的对象调用IsAttack,将PLAYER飞机的坐标放入其中,

就可以知道PLAYER是否被击中。

 

至于是否被击中,可以单纯的用矩形来判断,完美的方法当然是用Rgn(区域)来判断,将飞机的轮廓变

成区域就可以了。

 

至于背景的设计就更简单了,只要用一个二维数组,每个数组单位中存放着位图的代号,通过一个代号与

位图RECT的映射,就可以产生一幅背景图了。如果想产生立体感,或者背景中的单位有遮盖现象,可以通过

设定优先级的方法,将优先级底的先画,然后画优先级高的,自然就可以产生立体效果了。更简单的方法就是

直接按从上往下(假设背景立体感是向上的)的顺序贴图,就可以了。
  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p style="color:#666666;"> <span style="font-size:14px;">本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">这样学习方式能让你保持兴趣、充满动力,时刻知道学东西能用在哪、能怎么用。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">平时不明白知识点,放在项目里去理解就恍然大悟了。</span> </p> <p style="color:#666666;"> <span></span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>一、融汇贯通</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">本视频采用了前后端分离开发模式,前端使用Vue.js+Element UI实现了Web页面呈现,后端使用Python Django框架实现了数据访问接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端各自承担工作。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>二、贴近实战</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">本系列课程为练手项目实战:学生管理系统v4.0开发,项目包含了如下几个内容:项目总体介绍、基本功能演示、Vuejs初始化、Element UI使用、在Django中实现针对数据增删改查接口、在Vuejs中实现前端增删改查调用、实现文件上传、实现表格分页、实现导出数据到Excel、实现通过Excel导入数据、实现针对表格批量化操作等等,所有功能都通过演示完成、贴近了实战</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>三、课程亮点</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">在本案例中,最大亮点在于前后端做了分离,真正理解前后端各自承担工作。前端如何和后端交互</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>适合人群:</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">1、有Python语言基础、web前端基础,想要深入学习Python Web框架朋友;</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">2、有Django基础,但是想学习企业级项目实战朋友;</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">3、有MySQL数据库基础朋友</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="font-size:14px;"><img alt="" src="https://img-bss.csdnimg.cn/202009070752197496.png" /><br /> </span> </p> <p style="color:#666666;"> <span style="font-size:14px;"><br /> </span> </p>
<div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;">当前课程中商城项目实战源码是我发布在 GitHub 上开源项目 newbee-mall (新蜂商城),目前已有 6300 多个 star,</span><span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能讲解,让大家实际操作并实践上手一个大型线上商城项目,并学习到一定开发经验以及其中开发技巧。<br /> 商城项目所涉及功能结构图整理如下:<br /> </span> </div> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> <img alt="modules" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3N0b3JlL25ld2JlZS1tYWxsLXMucG5n?x-oss-process=image/format,png" /> </p> </div> <p style="color:rgba(0,0,0,.75);"> <strong><span style="color:#e53333;">课程特色</span></strong> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 对新手开发者十分友好,无需复杂操作步骤,仅需 2 秒就可以启动这个完整商城项目 </li> <li> 最终实战项目是一个企业级别 Spring Boot 大型项目,对于各个阶段 Java 开发者都是极佳选择 </li> <li> 实践项目页面美观且实用,交互效果完美 </li> <li> 教程详细开发教程详细完整、文档资源齐全 </li> <li> 代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜 </li> <li> 技术栈新颖且知识点丰富,学习后可以提升大家对于知识理解和掌握,可以进一步提升你市场竞争力 </li> </ul> </div> <p style="color:rgba(0,0,0,.75);">   </p> <p style="color:rgba(0,0,0,.75);"> <span style="color:#e53333;">课程预览</span> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> 以下为商城项目页面和功能展示,分别为: </p> </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 商城首页 1<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050347585499.gif" /> </li> <li> 商城首页 2<br /> <img alt="" src="https://img-bss.csdn.net/202005181054413605.png" /> </li> <li>   </li> <li> 购物车<br /> <img alt="cart" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvY2FydC5wbmc?x-oss-process=image/format,png" /> </li> <li> 订单结算<br /> <img alt="settle" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvc2V0dGxlLnBuZw?x-oss-process=image/format,png" /> </li> <li> 订单列表<br /> <img alt="orders" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvb3JkZXJzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 支付页面<br /> <img alt="" src="https://img-bss.csdn.net/201909280301493716.jpg" /> </li> <li> 后台管理系统登录页<br /> <img alt="login" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWxvZ2luLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品管理<br /> <img alt="goods" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWdvb2RzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品编辑<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050348242799.png" /> </li> </ul> </div> </div> </div> </div>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值