当前位置: 首页 > article >正文

Rust语言项目实战(二) - 准备键盘和终端屏幕

上一章节中,我们实现了游戏开始音频的播放,本章我们开始编写游戏界面。我们的游戏是在命令行终端中运行的,因此编写的界面也是终端中展示的界面,上一章中,我们已经把相关的依赖包crossterm添加到了依赖列表中。本章首先为游戏准备所需的键盘和屏幕配置。

创建一个空白的游戏终端屏幕

// main.rs
use std::{error::Error, io};
use crossterm::{terminal::{self, EnterAlternateScreen, LeaveAlternateScreen}, ExecutableCommand, cursor::{Hide, Show}};

use rusty_audio::Audio;
fn main() -> Result<(), Box<dyn Error>>{
	// Audio
	snip[..]
	
	// Terminal
	let mut stdout = io::stdout();  // 首先需要创建一个句柄用于访问终端
	terminal::enable_raw_mode()?;   // 调用这个方法,可以让系统能在每次键盘操作时都能实时获取到键盘的输入,而不是先放入缓冲区
	stdout.execute(EnterAlternateScreen)?;  // 进入备用屏幕,例如使用 vim或emacs 命令时,会跳出来一个专用的屏幕,而不是原来的终端命令行,当你退出vim或emacs时,又会回到原来的屏幕上。
	stdout.execute(Hide)?; // 隐藏光标

	// Cleanup
    audio.wait();   // 等待播放结束
    stdout.execute(Show)?;  // 游戏结束前,我们需要把刚才对屏幕的操作都还原,首先是显示光标
	stdout.execute(LeaveAlternateScreen)?; // 然后退出备用屏幕,回到主屏幕
	terminal::disable_raw_mode()?; // 然后恢复键盘模式
    Ok(())
}

上面的代码中,execute()函数可以在stdout变量上调用,让标准输出(也就是终端)立即执行一些操作,例如上面用到的:

  • 进入/退出备用屏幕
  • 隐藏/显示光标

需要注意的是,我们在游戏过程中对键盘和屏幕都做了一些特殊的操作,为了在游戏退出后能正常使用设备,我们要在游戏退出前还原这些设置。具体的设置已经在上面的代码注释中标注了出来。

上面的代码中,有些语句后面添加了?符号,它的作用是当这行语句执行返回错误时,立即崩溃并退出程序。

运行空白的终端界面

完成代码修改后, 执行cargo run开始运行游戏,看看会发生什么? 如果一切正常的话,你会听到游戏开始的声音“bang bang bang bang”, 并且在声音播放的过程中,你的终端会进入备用屏幕,且没有光标,换句话说,就是一个完全空白的终端,像这样:
请添加图片描述
等到音频播放结束后,游戏准备退出,还原了终端屏幕和键盘的设置,又回到了正常的命令行界面:
请添加图片描述

小结

本章的内容比较简单,为游戏准备了所需的键盘设置和一个空白的终端屏幕,从下一章开始,我们开始编写游戏的主循环。


http://www.kler.cn/a/153474.html

相关文章:

  • uni-app 微信小程序之自定义中间圆形tabbar
  • 电梯导航的小练习
  • 【漏洞复现】大华智慧园区综合管理平台deleteFtp接口远程命令执行
  • 解决git action发布报错:Input required and not supplied: upload_url
  • 手机上的记事本怎么打开?安卓手机通用的记事本APP
  • SVG图片选择库组件封装及使用
  • 企业真题(数组\面向对象-基础)
  • 智慧安防三大信息技术:云计算、大数据及人工智能在视频监控EasyCVR中的应用
  • 华为OD机试真题-最大坐标值-2023年OD统一考试(C卷)
  • 一起学docker系列之十五深入了解 Docker Network:构建容器间通信的桥梁
  • Servlet概念视频笔记
  • 播放器开发(七):音视频同步实现
  • Linux:vim的简单使用
  • JavaScript 内存泄漏的检测与防范:让你的程序更稳定
  • PTA 7-188 水仙花数
  • 计算机网络——数据链路层-封装成帧(帧定界、透明传输-字节填充,比特填充、MTU)
  • centos上安装并持久化配置LVS
  • 深度学习今年来经典模型优缺点总结,包括卷积、循环卷积、Transformer、LSTM、GANs等
  • 关于前端的学习思考-父子盒子溢出问题
  • 山西电力市场日前价格预测【2023-12-02】