とりあえず、dxlib自体をffiで定義して、それらさらにRust用にラップって感じにしてみてる。 まぁ、いうてもエラーハンドリング(笑)だけど。
まぁ単に、DxLibの関数って基本数値でエラーだとか判断できるから、戻り値それをResultとDxErrorというのでまとめただけ。 だからまぁ例えば-1になるやつとかは、基本的にErrorになる。 まぁまだまだコード自体に不可解なのがあったりするけどまだ改善してない。 あと、KeyとかFpsトレイトみたいに、Fpsやキーボード関係の元々作ってたやつは残しておこうと思ってる。 最初は、
#[test] fn test() -> Result<(), DxErrorType> { unsafe { let mut key = DxKeyBoard::new(); let mut fps = DxFps::new(); let color = dx_GetColor(255, 255, 255); let mut rwindow = DxWindow::new(); let window = rwindow.create_window( DxWindow::videomode(TEST_MAX_WINDOW_WIDTH, TEST_MAX_WINDOW_HEIGHT, 32), TEST_WINDOW_TITLE, DxWindowStyle::default(), )?; while window.is_open() { key.update()?; dx_ClearDrawScreen(); dx_DrawString( 0, 30, &format!( "key:press:{} key:release:{}", key.get_press_cnt(KEY_INPUT_1), key.get_release_cnt(KEY_INPUT_1) ), color, ); fps.draw(dx_GetColor(255, 0, 255)); fps.wait()?; dx_ScreenFlip(); } } Ok(()) }
みたいにSFMLっぽく、ラップしてたけど、これならもう、SFML使ったほうがいい気がした。だから、Rustの処理としてかけて、DxLibをC++で使うようにかけるを考えた。
#[test] fn test() -> Result<(), Box<dyn std::error::Error>> { change_window_mode(TRUE)?; set_use_charcode_format(DX_CHARCODEFORMAT_UTF8)?; set_main_window_text(TEST_WINDOW_TITLE)?; set_graph_mode(1280,800,32,120)?; dxlib_init()?; let img = load_graph("/Users/daruma/Downloads/kisida.jpg")?; play_music("/Users/daruma/Downloads/touhou-music.mp3",DX_PLAYTYPE_BACK)?; loop { if let Err(err) = process_message() { println!("ウィンドウが閉じられたよーーー: {}", err); break; } draw_extend_graph(0, 0, 100, 100, img, TRUE)?; draw_string( 0, 0, "てすとーーーー", get_color(255, 255, 255).ok_or("カラーコードが無効です")?, )?; draw_box( 20, 20, 20 + 300, 20 + 300, get_color(255, 255, 255).ok_or("カラーコードが無効です")?, TRUE, )?; } dxlib_end()?; Ok(()) }