私は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
Sを盗む外国人について叫んで神経衰弱を持っている:それは描くことができますので、私は変更可能な参照を必要とするカスタム描画機能を持っています。私はそれが示唆した変更を加えるだけで、1つのエラーに減らすことができました。私はtcod-rsライブラリを変更することはできません。少なくとも、私はむしろそうしたくありません。私はそれを使い続けたいと考えています。たとえばdraw(root)
機能をroot.put_char(...)
に置き換えると動作します。
これは私が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));
}
}
}
各タイルは、それがTCOD-RSから関数を使用しているためルート上のは、変更可能な参照を必要とし、DrawChar
を実装します。私のメインループは、いくつかのネイティブ関数を使用してキーコマンドを処理する点を除いて、上記のwhileループとほとんど変わりません。
'draw(root);'呼び出しは、文の最後に借用が終了するため、エラーを引き起こしてはいけません。あなたが行っているエラーを示す[MCVE](https://stackoverflow.com/help/mcve)を投稿できますか? –
私は1つを考えようとします。 –
少なくとも、実際のエラーは送信してください。しかし、理想的には、そのエラーを生成するコードを投稿してください。 –