我目前正在教自己Rust带有一个roguelike教程,而我正试图通过按键来对角移动一个字符,这意味着player_x -=1
,player_y -= 1
向左移动。
无论我尝试安排代码的哪种方式,我都会不断收到编译器的错误消息。我在文档或GitHub上的任何地方都找不到任何这样的例子。
Key { code: Escape, .. } => return true, // exit game
// movement keys
Key { code: Up, .. } => *player_y -= 1,
Key { code: Down, .. } => *player_y += 1,
Key { code: Left, .. } => *player_x -= 1,
Key { code: Right, .. } => *player_x += 1,
Key { printable: 'k', .. } => *player_y -= 1,
Key { printable: 'k', .. } => *player_x -= 1,
_ => {}
您可以看到我在这里尝试做什么,但这会抛出一条错误消息,说该模式无法访问,我将如何修复此代码?
这是the full code,它相当小,不确定编译所需要的是什么:
extern crate tcod;
extern crate input;
use tcod::console::*;
use tcod::colors;
// actual size of the window
const SCREEN_WIDTH: i32 = 80;
const SCREEN_HEIGHT: i32 = 50;
const LIMIT_FPS: i32 = 20; // 20 frames-per-second maximum
fn handle_keys(root: &mut Root, player_x: &mut i32, player_y: &mut i32) -> bool {
use tcod::input::Key;
use tcod::input::KeyCode::*;
let key = root.wait_for_keypress(true);
match key {
Key { code: Enter, alt: true, .. } => {
// Alt+Enter: toggle fullscreen
let fullscreen = root.is_fullscreen();
root.set_fullscreen(!fullscreen);
}
Key { code: Escape, .. } => return true, // exit game
// movement keys
Key { code: Up, .. } => *player_y -= 1,
Key { code: Down, .. } => *player_y += 1,
Key { code: Left, .. } => *player_x -= 1,
Key { code: Right, .. } => *player_x += 1,
Key { printable: 'k', ..} => *player_y -= 1,
Key { printable: 'k', ..} => *player_x -= 1,
_ => {},
}
false
}
fn main() {
let mut root = Root::initializer()
.font("terminal8x8_gs_tc.png", FontLayout::Tcod)
.font_type(FontType::Greyscale)
.size(SCREEN_WIDTH, SCREEN_HEIGHT)
.title("Rust/libtcod tutorial")
.init();
tcod::system::set_fps(LIMIT_FPS);
let mut player_x = SCREEN_WIDTH / 2;
let mut player_y = SCREEN_HEIGHT / 2;
while !root.window_closed() {
root.set_default_foreground(colors::WHITE);
root.put_char(player_x, player_y, '@', BackgroundFlag::None);
root.flush();
root.put_char(player_x, player_y, ' ', BackgroundFlag::None);
// handle keys and exit game if needed
let exit = handle_keys(&mut root, &mut player_x, &mut player_y);
if exit {
break
}
}
}
答案 0 :(得分:2)
如何在Rust中同时分配2个变量?
你做不到。您可以一次绑定两个变量:
let (a, b) = (1, 2);
如果您不想创建新绑定,则需要有两个赋值语句:
let mut a = 1;
let mut b = 2;
a = 3;
b = 4;
在您的情况下,对于匹配语句,您需要引入一个块:
let key = 42;
let mut a = 1;
let mut b = 2;
match key {
0 => {
a += 1;
b -= 1;
}
_ => {
a -= 10;
b *= 100;
}
}
您还可以将match
表达式计算为元组,然后为该元组创建新的绑定并在之后应用它们:
let key = 42;
let mut x = 1;
let mut y = 2;
let (d_x, d_y) = match key {
0 => (1, -1),
_ => (10, 10),
};
x += d_x;
y += d_y;
我强烈建议阅读The Rust Programming Language,而不是试图通过直觉或反复试验来学习Rust。它有一个entire chapter on the match statement。
另见:
答案 1 :(得分:1)
第二个printable: 'k'
无法访问,因为第一个将匹配。你想要的是在比赛的同一臂做两个任务,如下:
Key { printable: 'k', .. } => {
*player_y -= 1;
*player_x -= 1;
}