太空卫士 - 部分游戏状态
本篇文章向大家介绍《太空卫士 - 部分游戏状态》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。
在上一篇文章中我们已经使用了hud,现在我们的游戏已经基本完成,但是还缺少一些东西。我们需要添加一个游戏结束屏幕以及重新启动游戏的方法。我们还想在你刚开始游戏时添加一个屏幕,而不是立即开始游戏。
游戏状态
我们将在游戏中添加一些游戏状态。我们将有一个 gamestate 枚举来保存游戏的不同状态。我们还将有一个变量来保存游戏的当前状态。
在 main.ts 文件的开头添加以下代码:
enum gamestates {
"playing",
"paused",
"game_over"
}
let gamestate = gamestates.paused;
此代码创建一个名为 gamestates 的枚举,用于保存游戏的不同状态。然后我们创建一个名为 gamestate 的变量来保存游戏的当前状态。我们将初始状态设置为 paused.
在对这些状态进行任何操作之前,我们需要一个重置函数。该函数将在我们开始游戏之前被调用。将以下代码添加到 main.ts 文件的底部:
function resetgame() {
lives = 3;
level = 1;
score = 0;
sethudvalue("gamelives", lives);
sethudvalue("gamelevel", level);
sethudvalue("gamescore", score);
player.x = app.screen.width / 2 - player.width / 2;
player.y = app.screen.height - 50;
bullets.foreach(bullet => app.stage.removechild(bullet));
enemies.foreach(enemy => app.stage.removechild(enemy));
bullets.length = 0;
enemies.length = 0;
setenemyspawninterval();
spawnenemy();
}
这会将所有值设置为其初始起始值,清除舞台和阵列中的子弹和敌人,重置玩家的位置,并设置敌人生成间隔。然后通过生成敌人来开始游戏。
现在已经设置好了,让我们添加一种开始游戏的方式。
开始游戏
我们将为此添加一个新的 keyhandler。在我们定义左右箭头键的 keyhandler 之后添加以下代码:
keyhandler(
"enter",
() => {
if(gamestate !== gamestates.playing) {
if(gamestate === gamestates.game_over) {
resetgame();
}
gamestate = gamestates.playing;
togglepausetext();
}
}
);
此代码将在玩家按下 enter 键时开始游戏。如果游戏不处于playing状态,则会将游戏状态设置为playing。如果游戏处于game_over状态,则会重置游戏,然后将游戏状态设置为playing。
但是玩家不会知道这一点,所以我们需要一些文本来告诉玩家要做什么。在我们定义 keyhandlers 的位置之后添加以下代码
// a simple text style, 24px white text
const textsstyle = {
fontsize: 24,
fill: 0xffffff
};
let startgametext = new pixi.text({
text: 'press enter to start the game',
style: textsstyle
});
startgametext.y = 250;
function togglepausetext() {
if(gamestate === gamestates.paused || gamestate === gamestates.game_over) {
// since the text can change, we need to reposition it.
startgametext.x = app.screen.width / 2 - startgametext.width / 2;
app.stage.addchild(startgametext);
} else {
app.stage.removechild(startgametext);
}
}
togglepausetext();
此代码创建一个新的文本对象,显示“按 enter 键开始游戏”并将其放置在屏幕中间。然后,它创建一个名为togglepausetext 的函数,该函数将根据当前游戏状态显示或隐藏文本。然后,当游戏暂停或结束时,它会调用此函数来显示文本。
现在,我们也想暂停比赛。
暂停游戏
在我们定义左右箭头键的 keyhandler 之后添加以下代码:
keyhandler(
"escape",
() => {
if(gamestate !== gamestates.paused) {
gamestate = gamestates.paused;
startgametext.text = 'press enter to resume the game';
togglepausetext();
}
}
);
在此代码中,当玩家按下 escape 键时,我们将把 gamestate 设置为 paused。我们还将重用 startgametext 对象并将文本设置为“按 enter 键恢复游戏”。
使用游戏状态
太好了,现在我们可以在“播放”和“暂停”状态之间切换,让我们实际使用这些状态,并让游戏做出相应的操作。
如果我们没有处于 playing 状态,我们不想在玩家按下向左或向右箭头键时设置playerspeed。将以下代码添加到 keyhandlers 中,我们将左、右箭头键的 playerspeedx 设置为 500 或 -500:
if (gamestate !== gamestates.playing) {
return;
}
同时将上述代码添加到空格键keyhandler的处理程序中,这样玩家在游戏暂停或结束时就无法射击。
接下来,更新spawnenemy函数中的if语句,如下所示:
if(!document.hasfocus() || gamestate !== gamestates.playing) {
return;
}
最后,如果我们暂停,整个游戏循环不需要触发,请在游戏循环的开头添加以下代码:
if(gamestate !== gamestates.playing) {
return;
}
游戏结束
现在我们有了开始和暂停游戏的方法,让我们在屏幕上添加一个游戏。
现在我们有一个 console.log("game over"),我们想要将游戏状态设置为 game_over 并显示游戏结束文本。将console.log替换为以下代码:
gamestate = gamestates.game_over;
startgametext.text = 'press enter to restart the game';
scoretext.text = `score: ${score}`;
scoretext.x = app.screen.width / 2 - scoretext.width / 2;
app.stage.addchild(gameovertext);
togglepausetext();
app.stage.addchild(scoretext);
此代码使用了另外两个我们尚未创建的文本对象,让我们这样做吧。
在我们创建 startgametext 对象之后,添加以下代码:
let gameOverText = new PIXI.Text({
text: 'GAME OVER',
style: textsStyle
});
gameOverText.x = app.screen.width / 2 - gameOverText.width / 2;
gameOverText.y = 200;
let scoreText = new PIXI.Text({
text: 'Score: 0',
style: textsStyle
});
scoreText.y = 300;
现在,我们应该能够玩游戏,暂停游戏,并在输了时重新启动游戏。
结论
就是这样!您现在可以玩游戏,暂停游戏,输掉游戏后重新启动。
我知道最后一部分可能有点让人不知所措,但我希望您能够跟上并理解所有内容,不要忘记您可以随时查看完整的源代码。如果您有任何问题或反馈,请随时通过 x 联系我或在下面发表评论
这是这个小系列的最后一部分,我希望你喜欢它并学到新的东西。在留给您的同时,我想指出的一件小事是,这是一款非常基础的游戏,有很多方法可以改进它。你可以添加更多的敌人、能力提升、不同的等级等等。我鼓励您尝试和尝试新事物,这就是您作为开发人员学习和成长的方式。
此外,这个游戏的结构方式并不是构建游戏的最佳方式,但出于本教程的目的,我想保持简单并放在一个文件中。在未来的教程中,我可能会向您展示如何以更具可扩展性的方式构建游戏。
感谢您从头到尾阅读本教程!

使用 vite 和 typescript 设置 pixijs
先生linxed ・ 4 月 20 日

通过“完成崇拜”取得更多成就
先生linxed ・ 2 月 18 日
不要忘记订阅我的时事通讯,成为第一个了解与这些类似的教程的人。
终于介绍完啦!小伙伴们,这篇关于《太空卫士 - 部分游戏状态》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!
-
- 文章 · 前端 | 2分钟前 |
- 小屏滚动优化:CSS响应式布局解决方法
- 113浏览 收藏
-
- 文章 · 前端 | 3分钟前 |
- CSS多列布局:auto-fit与minmax详解
- 181浏览 收藏
-
- 文章 · 前端 | 6分钟前 |
- JavaScriptWeb组件详解:CustomElements与ShadowDOM
- 339浏览 收藏
-
- 文章 · 前端 | 12分钟前 |
- DOM操作技巧与优化方法
- 154浏览 收藏
-
- 文章 · 前端 | 13分钟前 |
- CSS浮动布局入门与实战技巧
- 155浏览 收藏
-
- 文章 · 前端 | 14分钟前 |
- CSSbackground-size控制背景图缩放方法详解
- 365浏览 收藏
-
- 文章 · 前端 | 18分钟前 | grid-template-columns fr单位 CSSGrid布局 minmax()函数 响应式侧边栏
- 响应式侧边栏自适应宽度技巧
- 279浏览 收藏
-
- 文章 · 前端 | 18分钟前 |
- JavaScript代理陷阱检测详解
- 375浏览 收藏
-
- 文章 · 前端 | 23分钟前 |
- 持久化数据结构是什么?不可变结构解析
- 280浏览 收藏
-
- 文章 · 前端 | 24分钟前 |
- CSS::marker自定义列表样式全解析
- 287浏览 收藏
-
- 文章 · 前端 | 25分钟前 |
- 多终端响应式架构搭建教程
- 260浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3214次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3429次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3458次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4567次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3834次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 优化用户界面体验的秘密武器:CSS开发项目经验大揭秘
- 2023-11-03 501浏览
-
- 使用微信小程序实现图片轮播特效
- 2023-11-21 501浏览
-
- 解析sessionStorage的存储能力与限制
- 2024-01-11 501浏览
-
- 探索冒泡活动对于团队合作的推动力
- 2024-01-13 501浏览

社会问题管理系统
