”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 太空卫士 - 击退敌人

太空卫士 - 击退敌人

发布于2024-08-05
浏览:953

在最后一部分中,我们创建了玩家的飞船并使其移动。在这一部分中,我们将创建敌人并让他们移动。然后我们会把他们击落!

创造敌人

我们将做与创建项目符号时类似的事情。我们将创建一个模板敌人,每次我们想要创建新敌人时都会克隆它。我们还需要通过数组来跟踪敌人,因为同时可能有多个敌人。

但首先,我们将创建创建敌人的方法。在createBullet方法后添加以下代码:

let enemyTemplate: PIXI.Graphics | undefined = undefined;
function createEnemy() {
    if(!enemyTemplate) {
        enemyTemplate = new Graphics();
        enemyTemplate
            .poly([
                0, 0,
                50, 0,
                25, 25,
            ])
            .fill(0xFF6666);
    }

    const enemy = enemyTemplate.clone();
    enemy.x = 25   (Math.random() * 480) - 50;
    enemy.y = -50;

    return enemy;
}

如您所见,它与 createBullet 方法非常相似。我们创建一个模板敌人,每次想要创建新敌人时都会克隆该模板敌人。然后我们将敌人定位在屏幕顶部的随机 x 位置。敌人的形状与玩家的船相同,但它是红色的并且是上下颠倒的。

我们通过设置 x 和 y 属性来指定敌人的生成位置。 x 属性设置为 25 到 480 - 50 之间的随机值,以便敌人始终位于游戏屏幕内。 y 属性设置为 -50,这样敌人就在屏幕之外,并且会移入其中。

接下来,我们需要每隔几秒调用这个方法来创建一个新的敌人。

生成敌人

我们将为此使用 setInterval 方法。在我们定义项目符号数组的位置之后添加以下代码:

const enemies: PIXI.Graphics[] = [];

const enemySpawnInterval = 2500;
function spawnEnemy() {
    if(!document.hasFocus()) {
        return;
    }
    const enemy = createEnemy();
    enemies.push(enemy);
    app.stage.addChild(enemy);
}

setInterval(spawnEnemy, enemySpawnInterval);
spawnEnemy();

我们创建一个名为敌人的新数组来跟踪所有敌人。然后我们创建一个名为enemySpawnInterval的新变量,它指定我们想要生成新敌人的频率。然后我们创建一个名为spawnEnemy的新方法,它创建一个新的敌人并将其添加到敌人数组和舞台中。然后,我们使用 setInterval 方法每隔敌人SpawnInterval 毫秒调用此方法。

酷,现在我们每 2.5 秒就会在屏幕顶部生成一次敌人。但它们还没有移动,我们也看不到它们,因为它们已经超出了屏幕。让我们解决这个问题。

移动敌人

我们需要在游戏循环中更新敌人的位置。将以下代码添加到您的游戏循环中,就在我们更新子弹位置的下方:

for(let i = 0; i  app.screen.height   50) {
        app.stage.removeChild(enemy);
        enemies.splice(i, 1);
    }
}

这部分代码将循环遍历所有敌人,通过将它们向下移动 2.5 像素来更新它们的位置,并检查它们是否出界。如果是,我们将它们从舞台和敌人阵列中移除。

好的!如果你现在运行游戏,你会看到敌人在屏幕顶部生成并向下移动。

现在是时候击落他们了!

射击敌人

将以下代码添加到您的游戏循环中,就在我们更新敌人位置的位置下方:

for(let i = 0; i  enemy.x &&
            bullet.x  enemy.y &&
            bullet.y 


这部分代码将循环遍历所有子弹和所有敌人,并检查子弹是否击中敌人。如果是这样,我们将子弹和敌人从舞台及其各自的阵列中移除。

当子弹击中敌人时,您可以通过打破内部循环来优化此代码,但就目前而言,这很好。您还可以将子弹位置更新循环与子弹命中检查循环结合起来,但为了本教程的清晰起见,我喜欢将它们分开。

就是这样!现在,您可以在游戏中左右移动、发射子弹并击落敌人。在下一部分中,我们将在游戏中添加一些 HUD 元素,并跟踪玩家的得分、等级和生命。



不要忘记订阅我的时事通讯,成为第一个了解与这些类似的教程的人。

版本声明 本文转载于:https://dev.to/mrlinxed/space-defender-part-3-the-enemies-11o3?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-07-01
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-07-01
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-07-01
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-07-01
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-07-01
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-07-01
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-07-01
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-07-01
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-07-01
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-07-01
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-07-01
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-07-01
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-07-01
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-07-01
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。 映射{} 因此。我们不使用jQuery的“ .aimimate(...
    编程 发布于2025-07-01

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3