ddaruma’s blog

なるべくやりたいことをやりきる

RustとDxLibについて

とりあえず、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(())
    }