我使用TCOD-RS。用於繪製到RootConsole
每個方法都需要一個可變引用。中央迴路是while
循環,等待窗口關閉,並清除屏幕,畫,然後刷新。 「檢查窗口關閉」方法也需要一個可變引用。 clear
和flush
也是。我有一個需要一個可變參考自定義繪圖功能,因此可以得出:鏽借貸/所有權
fn draw(root: &mut RootConsole) { /* Do state-y stuff */ }
while !root.window_closed() /* Mutable borrow 1 */ {
root.clear(); // Mutable borrow 2
draw(root); // Mutable borrow 3
root.flush(); // Mutable borrow 4
}
編譯器有一個精神崩潰尖叫外星人偷RootConsole
秒。我已經設法通過進行修改來減少它的一個錯誤。我不能更改tcod-rs庫,或者至少,我寧願不要,我寧願繼續使用它。例如,用root.put_char(...)
代替draw(root)
函數,可以工作。
這裏是我得到試圖cargo run
錯誤。 tcod::console::Root
類型有文檔here。
error[E0596]: cannot borrow immutable argument `root` as mutable
--> src/draw/mod.rs:27:33
|
9 | pub fn draw_map(root: &mut RootConsole, world: WorldState) {
| ---- consider changing this to `mut root`
...
27 | .draw_char(&mut root,
| ^^^^ cannot borrow mutably
我的實際draw_map代碼非常簡單:
pub trait DrawChar {
fn draw_char(self, root: &mut RootConsole, pos: (i32, i32));
}
pub fn draw_map(root: &mut RootConsole, world: WorldState) {
let screen_start_y = world.screen.1;
let screen_end_y = screen_start_y + root.height();
let screen_start_x = world.screen.0;
let screen_end_x = screen_start_x + root.width();
let x = screen_start_x;
let y = screen_start_y;
for scan_line in &world.map[screen_start_y as usize..
screen_end_y as usize]
{
y += 1;
for unit in &scan_line[screen_start_x as usize..
screen_end_x as usize]
{
x += 1;
unit.tiles[world.level as usize]
.draw_char(&mut root,
(x as i32 - screen_start_x,
y as i32 - screen_start_y));
}
}
}
每一瓦片實現DrawChar
,其中,因爲它使用的功能從TCOD-RS 上根,需要一個可變引用。我的主循環與上面的while循環沒有什麼不同,除了它使用一些本地函數處理關鍵命令。
調用'畫(根);'不應該導致錯誤,因爲借將在語句的結束而終止。你可以發佈一個[MCVE](https://stackoverflow.com/help/mcve)來顯示你收到的錯誤嗎? –
我會嘗試拿出一個。 –
至少發佈實際錯誤。但理想情況下發布產生該錯誤的代碼。 –