为什么写这篇日志
或许是rust较为小众,或许是配套的库常常进行不向下兼容的更新,导致很多github上的例程很难直接运行。更难过的是,中文网页中rust相关的学习资料相较于另外一些常见的语言,简直是少太多了。以贪吃蛇这种级别的程序为例,我看到之前有两篇相关的构建教程都相继太监了,而其他的视频,无非只是当年从github上下载下来运行的结果而已,并不知道各个模块都在干什么。因此,一方面是为了自我的学习,另一方面也是为之后可能会有需求的同志们提供一些力所能及的帮助,我将利用rust与piston游戏引擎实现的贪吃蛇整理在这篇文档中,具体将会涉及基于rust语言开发的piston引擎的基本架构,贪吃蛇各种功能的rust实现以及在图像中显示文字等等操作。
说明:实现过程中参考了github上相关snake game的代码,其中主要参考的那个ID叫什么我竟然找不到了,真的是非常抱歉,从他那里学习了很多,默默对他表示感谢。
先看效果
编译各种依赖库时网络太慢怎么办?
本文使用的rust版本为:
stable-x86_64-pc-windows-msvc (default)
rustc 1.41.1 (f3e1a954d 2020-02-24)
感谢中科大镜像,不管是当年的linux还是现在的rust。总之呢,就是中科大把crates.io这个库给备份了一遍,而且每两小时更新一次,厉害了。具体的修改方法见下面连接内容。
https://lug.ustc.edu.cn/wiki/mirrors/help/rust-crates
依赖库以及toml文件
在toml文件中输入依赖库。其中前四个是piston给出的example直接得到的,主要是构造窗口以及窗口渲染绘图。最后一个是随机数依赖库,在rust-lang book的a guessing game这一章节有提到。
[dependencies]
piston = "0.49.0"
piston2d-graphics = "0.36.0"
pistoncore-glutin_window = "0.63.0"
piston2d-opengl_graphics = "0.72.0"
rand = "0.7"
二进制文件头引用
搞完toml文件,我们就可以开始编写main.c文件了,这里特别说明一下,整个程序只需要一个main.c文件就可以了,并且将其放在src文件夹之下即可。引入需要的模块,具体如下:
use glutin_window::GlutinWindow as Window; // 构建窗口
use opengl_graphics::{
Filter, GlGraphics, GlyphCache, OpenGL, TextureSettings}; // 图形文字渲染
use piston::event_loop::{
EventLoop, EventSettings, Events}; // 引擎迭代器
use piston::input::*; // 外部触发输入,例如键盘鼠标等
use piston::window::WindowSettings; // 构建窗口
use rand::Rng; // 随机数
main函数主体
main.c里面主要包含三部分内容,分别是1.main函数主体,2.app结构及其方法,3.剩余枚举类型。废话少说,首先上第一部分main函数的代码,对应的解释直接写在注释里好了。
fn main() {
// piston标准结构,与渲染有关
let opengl = OpenGL::V3_2;
// Create an Glutin window.
let mut window: Window = WindowSettings::new("snakes", [640, 480])
.graphics_api(opengl)
.exit_on_esc(true)
.build()
.unwrap_or_else(|e| panic!("Failed to build PistonWindow: {}", e));
// 这里App是主要的结构体,构建一个理论尺寸为(80, 60)的结构体,具体的实现见下节
let mut app = App::new(80, 60);
// piston标准结构,与渲染有关
let mut gl = GlGraphics::new(opengl);
// 这个地方是与老版本不一样的地方,为了能够渲染文字,需要实现读取字体缓存
// 特别地,老版本不需要TextureSettings的配套
let texture_settings = TextureSettings::new()<