差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| youtube:python-mixing-009 [2024/02/28 18:26] – 削除 - 外部編集 (不明な日付) 127.0.0.1 | youtube:python-mixing-009 [2024/02/28 18:26] (現在) – ↷ toybox:python-mixing-009 から youtube:python-mixing-009 へページを移動しました。 freemikan | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== PyO3でLÖVEもどきを作る (2) ====== | ||
| + | |||
| + | 作成日: 2023-08-14 (月) | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ===== プロジェクト pyove ===== | ||
| + | |||
| + | ==== Cargo.toml ==== | ||
| + | |||
| + | <file toml> | ||
| + | [package] | ||
| + | name = " | ||
| + | version = " | ||
| + | edition = " | ||
| + | |||
| + | [dependencies.pyo3] | ||
| + | version = " | ||
| + | features = [" | ||
| + | </ | ||
| + | |||
| + | ==== src/main.rs ==== | ||
| + | |||
| + | <file rust> | ||
| + | use pyo3:: | ||
| + | use std::{env, path::Path, process:: | ||
| + | |||
| + | pub mod graphics; | ||
| + | |||
| + | # | ||
| + | fn load() { | ||
| + | println!(" | ||
| + | } | ||
| + | |||
| + | # | ||
| + | fn draw() { | ||
| + | println!(" | ||
| + | } | ||
| + | |||
| + | # | ||
| + | fn update(dt: f32) { | ||
| + | println!(" | ||
| + | } | ||
| + | |||
| + | #[pymodule] | ||
| + | fn pyove(py: Python<' | ||
| + | m.add_function(wrap_pyfunction!(load, | ||
| + | m.add_function(wrap_pyfunction!(draw, | ||
| + | m.add_function(wrap_pyfunction!(update, | ||
| + | graphics:: | ||
| + | Ok(()) | ||
| + | } | ||
| + | |||
| + | fn main() -> PyResult< | ||
| + | // | ||
| + | // コマンドライン引数のパース | ||
| + | // | ||
| + | let args: Vec< | ||
| + | if args.len() != 2 { | ||
| + | // コマンドライン引数がただ1つだけ与えられていなければ終了する | ||
| + | eprintln!(" | ||
| + | exit(1); | ||
| + | } | ||
| + | |||
| + | let gamedir = Path:: | ||
| + | let main_file = gamedir.join(" | ||
| + | if !main_file.exists() { | ||
| + | // main.pyが存在しなければ終了する | ||
| + | eprintln!(" | ||
| + | exit(2); | ||
| + | } | ||
| + | |||
| + | // main.pyの内容を読み込む | ||
| + | let main_code = std:: | ||
| + | |||
| + | // | ||
| + | // activate Python interpreter | ||
| + | // | ||
| + | |||
| + | // pyoveをモジュールとして登録 | ||
| + | pyo3:: | ||
| + | |||
| + | Python:: | ||
| + | // ゲームディレクトリをインポートパスに追加する | ||
| + | let sys_path_code = format!( | ||
| + | " | ||
| + | gamedir.to_str().unwrap() | ||
| + | ); | ||
| + | py.run(& | ||
| + | |||
| + | // pyoveモジュールにアクセスしたいので、ここでインポートする | ||
| + | let pyove = PyModule:: | ||
| + | |||
| + | // main.pyを実行 | ||
| + | py.run(& | ||
| + | |||
| + | // main.pyでこの3つの関数は置き換え可能 | ||
| + | let load_fn = pyove.getattr(" | ||
| + | let update_fn = pyove.getattr(" | ||
| + | let draw_fn = pyove.getattr(" | ||
| + | |||
| + | // 試しにloadとupdateとdrawを実行してみる | ||
| + | load_fn.call0()?; | ||
| + | update_fn.call1((123, | ||
| + | draw_fn.call0()?; | ||
| + | |||
| + | Ok(()) | ||
| + | }) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== src/ | ||
| + | |||
| + | <file rust> | ||
| + | // | ||
| + | // このプロジェクトではset_colorとrectangle関数のみを提供する | ||
| + | // | ||
| + | use pyo3:: | ||
| + | |||
| + | # | ||
| + | #[pyo3(name = " | ||
| + | fn set_color(r: | ||
| + | // 仮の処理 | ||
| + | println!(" | ||
| + | } | ||
| + | |||
| + | # | ||
| + | fn rectangle(mode: | ||
| + | // 仮の処理 | ||
| + | println!(" | ||
| + | } | ||
| + | |||
| + | pub fn register_graphics_module(py: | ||
| + | // see: https:// | ||
| + | // サブモジュールとしてgraphicsを登録する | ||
| + | // graphicsに、setColorとrectangleを登録する | ||
| + | let m = PyModule:: | ||
| + | m.add_function(wrap_pyfunction!(set_color, | ||
| + | m.add_function(wrap_pyfunction!(rectangle, | ||
| + | parent_module.add_submodule(m)?; | ||
| + | Ok(()) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== example/ | ||
| + | |||
| + | <file python> | ||
| + | import pyove | ||
| + | #import foo # test import availability | ||
| + | |||
| + | # Python requires global scoped variable definitions | ||
| + | x, y, w, h = 0, 0, 0, 0 | ||
| + | |||
| + | def load(): | ||
| + | global x, y, w, h | ||
| + | x, y, w, h = 20, 20, 60, 20 | ||
| + | |||
| + | def update(dt): | ||
| + | global w, h | ||
| + | w += 1 | ||
| + | h += 1 | ||
| + | |||
| + | def draw(): | ||
| + | pyove.graphics.setColor(0, | ||
| + | pyove.graphics.rectangle(" | ||
| + | |||
| + | # overwrite default module functions | ||
| + | pyove.load = load | ||
| + | pyove.draw = draw | ||
| + | pyove.update = update | ||
| + | </ | ||
| + | |||
| + | === 参考 === | ||
| + | |||
| + | オリジナルの動作は、こちらを参考にしてください。 | ||
| + | |||
| + | * https:// | ||
