youtube:python-mixing-009
差分
このページの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:// | ||