首页 > 其他分享 >Html飞机大战(七):发射第一颗子弹

Html飞机大战(七):发射第一颗子弹

时间:2022-08-30 04:47:13浏览次数:67  
标签:img BULLET lastShootTime 子弹 width Html 第一颗 config

好家伙,终于到子弹了

 

我们先来理一理思路:

子弹由飞机射出,所以我们把发射子弹的方法写在英雄类中

 

当然了,子弹也必须有自己独立的类

 

后期会有很多子弹射出,所以一个个将子弹类实例化肯定是不对的

 

我们也需要一个弹夹(一个数组)去装子弹(子弹对象)

 

我们先把第一个子弹渲染到飞机的头上

 

开搞:

1.子弹的配置项和类编辑

//子弹配置项
        const BULLET = {
            img: b,
            width: 9,
            height: 21,
        }

        //子弹类编辑
        class Bullet {
            constructor(config, x, y) {
                this.img = config.img;
                this.width = config.width;
                this.height = config.height;
                this.x = x;
                this.y = y;
            }
            move() {}
            paint(context) {
                console.log(this.img, this.x, this.y)
                context.drawImage(this.img, this.x, this.y)
            }
        }

 

 

2.补充图片的src

const b = new Image();
b.src = "img/bullet.jpg"

网上偷图,妙啊

 

 

 

3.我们为Hero类添加新的方法

class Hero {
            constructor(config) {
                this.width = config.width;
                // this.height = config.heigth;
                this.widthh = config.widthh;
                this.x = (480 - config.width) / 2;
                this.y = 650 - config.widthh;
                // this.y = 650 - config.height;
                this.frame = config.frame;
                //用死/活来控制要渲染的图片组
                this.img = null;
                this.live = true;
                //子弹上次设计的时间
                this.lastShootTime = new Date().getTime();
                //子弹射击的间隔
                this.shootInterval = 200;
                //子弹夹数组
                this.bulletList = [];
            }
            judge() {

            }

            paint(context) {
                this.img = this.frame.live[0];
                context.drawImage(this.img, this.x, this.y, this.width, this.widthh);
            }
            //英雄的子弹设计间隔
            shoot() {
                //获取当前的时间
                const currentTime = new Date().getTime();
                console.log(currentTime - this.lastShootTime);
                if (currentTime - this.lastShootTime > this.shootInterval) {
                    //初始化一个子弹对象
                    console.log("测试shoot");
                    let bullet = new Bullet(BULLET, this.x + this.width / 2 - BULLET.width / 2 + 2, this.y - BULLET
                        .height / 2);
                    this.bulletList.push(bullet);
                    //开始绘制子弹
                    bullet.paint(context);
                    //更新时间
                    this.lastShootTime = currentTime;
                }

            }
        }

 

 

3.1.属性说明

//子弹上次射击的时间
this.lastShootTime = new Date().getTime();
//子弹射击的间隔
this.shootInterval = 200;
//子弹夹数组
this.bulletList = [];

lastShootTime时间用于判断子弹更新的时机

shootInterval用于控制子弹刷新的间隔

bulletList后面的多次渲染子弹会用到

 

 

3.2.方法说明

shoot() {
                //获取当前的时间
                const currentTime = new Date().getTime();
                console.log(currentTime - this.lastShootTime);
                if (currentTime - this.lastShootTime > this.shootInterval) {
                    //初始化一个子弹对象
                    console.log("测试shoot");
                    let bullet = new Bullet(BULLET, this.x + this.width / 2 - BULLET.width / 2 + 2, this.y - BULLET
                        .height / 2);
                    this.bulletList.push(bullet);
                    //开始绘制子弹
                    bullet.paint(context);
                    //更新时间
                    this.lastShootTime = currentTime;
                }

            }

同样的用控制时间差的原理来保证刷新速率

还是那条公式:当前时间 - 创建实例时的时间 > 我规定的时间间隔

 

子弹的绘制,想想怎么把它渲染在飞机的正上方

BULLET, this.x + this.width / 2 - BULLET.width / 2 + 2, this.y - BULLET.height / 2

x,y是渲染飞机的坐标

横坐标:x加上一般的飞机宽度再减去一半的子弹宽度

纵坐标:y减去一般的子弹高度

(canvas的纵坐标是向下的哟)

 

(最后再调整一下,加一加二之类的)

 

ok,来看看效果

 

 gif录不到,但确实是有的

 

标签:img,BULLET,lastShootTime,子弹,width,Html,第一颗,config
From: https://www.cnblogs.com/FatTiger4399/p/16637953.html

相关文章

  • 在 HTML 和 CSS 中隐藏元素有哪些不同的方法?
    在HTML和CSS中隐藏元素有哪些不同的方法?这些是使用HTML或CSS在网页中隐藏内容的一些主要方法。这些是使用HTML或CSS在网页中隐藏内容的一些主要方法。安......
  • 【前端】AWS CloudFront + S3 配置访问时自动跳转到index.html
    需求:我把前端代码上传到S3了,CloudFront的DistributionIDE1U1XXXX,它的Alternatedomainname是test.link则我访问首页需要输入test.link/frontend/view/index.htm......
  • HTML标签(三)
    ​ /**作者:呆萌老师*☑csdn认证讲师*☑51cto高级讲师*☑腾讯课堂认证讲师*☑网易云课堂认证讲师*☑华为开发者学堂认证讲师*☑爱奇艺千人名师计划成员*在这里......
  • php解析html类库simple_html_dom(详细介绍)
    php解析html类库simple_html_dom(详细介绍)_php技巧_脚本之家 https://www.jb51.net/article/39526.htm下载地址:https://github.com/samacs/simple_html_dom解析器不仅......
  • Pytest框架 — 16、Pytest的测试报告(pytest-html插件和Allure框架)
    目录1、前言2、pytest-html生成测试报告(1)pytest-html插件安装(2)pytest-html的使用(3)报告独立显示3、Allure框架生成测试报告(1)说明(2)环境准备步骤1:安装Allure框架步骤2:下载allu......
  • HTML
    HTML:用于构建网页的基本结构CSS:对网页进行装饰JS:控制网页的行为,及响应用户操作的交互HTML的优点:简易性;可拓展性;平台无关性;通用性     ......
  • HTML5PLUS实现类似右侧弹出菜单
    一、实现效果使用【plus.webview】对象实现右侧弹出菜单栏:点击菜单图标弹出菜单列表,点击页面其它地方或点击【关闭菜单】收缩菜单。 二、源码index.html:<!DOCTYPE......
  • HTML onclick 事件属性
    HTMLonclick事件属性 https://www.w3school.com.cn/tags/event_onclick.asp实例当点击按钮时执行一段JavaScript:<buttononclick="copyText()">CopyText</button>......
  • Html飞机大战(五):主角登场(英雄类编辑)
    好家伙, 遇到了一些非常奇怪的bugindex.html:179UncaughtTypeError:Failedtoexecute'drawImage'on'CanvasRenderingContext2D':Theprovid......
  • .NET(C#) 使用GemBox.Document将HTML转成PDF
    .NET(C#)中将HTML转成PDF的方法比较多,可以使用GemBox.DocumentPuppeteerSharp、EO.Pdf和HtmlRenderer.PdfSharp等,本文主要使用GemBox.Document将HTML转成PDF的方法,以及......