昨天的傳值成功的 patch 展示完、發完文之後,目前為止只累積了一點點的進展。
座標傳到 web_server
,也還得作為代理人跟遊戲伺服器溝通接下來的著手為何,這樣太麻煩了。所以這個 patch 先試試看 javascript 端的計算能不能用。
原本是傳遞兩個有號整數,改成傳遞一個單一位元組(u8
),很 OK。
接下來補上的這個 patch,主要功能就是直接在前端將座標值換算成選點值。先前不確定介紹過沒有,代理人一次只對遊戲伺服器傳遞一個位元組的資料,其中若是 0~36 的數值就是棋盤上的著點,若是 100~125 就是羅盤上的著點,其他還有些特殊的值略過不提。幸好當初沒有自作聰明,讓遊戲引擎裡面內建標準回合內階段的狀態去解析不同時候的 0~25 分別代表棋盤或是羅盤。
總之,因為在前端的部份為兩個棋盤註冊了不同的事件處理程式,所以理所當然可以在 handleClick6x6
做棋盤座標的換算,而在 handleClick5x5
做羅盤座標的換算,如,
function handleClick6x6(cell) {
console.log(`6x6 Grid clicked at (${cell.dataset.row}, ${cell.dataset.col})`);
const c = Number(6*(cell.dataset.row)) + Number(cell.dataset.col);
const payload = JSON.stringify({ coord: c });
fetch('/click', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: payload,
})
.then(response => response.text())
.then(data => {
console.log('Server response:', data);
})
.catch((error) => {
console.error('Error:', error);
});
}
// Handle click on the 5x5 grid
function handleClick5x5(row, col) {
console.log(`5x5 Grid clicked at (${row}, ${col})`);
const c = 5*(row + 2) + (col + 2) + 100;
const payload = JSON.stringify({ coord: c });
fetch('/click', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: payload,
})
.then(response => response.text())
.then(data => {
console.log('Server response:', data);
})
.catch((error) => {
console.error('Error:', error);
});
}
兩個事件處理程式的標頭不同,也是延續自當時讀譜程式一邊在 javascript 裡面做實驗的結果,但沒有什麼核心的差別。
在遊戲迴圈裡面也可以直接使用這個回傳的值來遊玩,外面那一整套製造虛擬著手的 c
值就可以刪去了。
if let Ok(c) = click_rx.recv() {
println!("Received {} from web interface.", c);
+ stream.write(&[c])?;
}
- stream.write(&[c])?;
另外,一開始以為先代換 app.js
的部份就足夠,但為了讓它顯示,還是 index.html
也帶了過來;而由於網頁部份的邏輯已然不同,所以連 web_server
部份也修正了路徑與服務的位址
App::new()
.app_data(click_tx_data.clone())
.service(receive_click)
- .service(fs::Files::new("/", "./static").index_file("index.html"))
+ .route("/", web::get().to(index))
+ .service(fs::Files::new("/static", "static").show_files_listing())
})
.bind(("127.0.0.1", 8080))
.expect("Can not bind to port 8080")
但是如果用這個狀態去開,則會發現還是空蕩蕩的棋盤,因為顯示部份還沒有做,回饋也不夠,無法知道如何下。
希望這是明天可以處理掉的內容。