ddaruma’s blog

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

なんか

よくわからないが、近況。 プログラムは最近少ししか触っていないため、何故か少し不安になりつつある。将来的に正直ちゃんと言われた通りの業務などをこなせるほどのコードをかける自信がない。てか、本当にプログラマーになるんかも分からない。 まだまだ就職などを気にする年代でもないが。。どちらかというと、勉強して受験をしなきゃいけない歳。 ただ、ほぼやってない。 最近はプログラムやらイラストやら、適当に色んなことに手を出しすぎて何がしたいのかわからなくなりつつある。 勉強しなきゃいけないのに、適当にイラストを触っていたりプログラムいじってる現実。うーん。 プログラムはこれから使えるやつだからまだしも、イラストに注力する必要はあまりないはずなんだが。 まぁいっか。  てか、プログラムとかも楽しいけど、目的だったりがない。イラストは何か書きたいものがあるから目的があるけど。。 まぁやめないほうがいいかあ

RustとDxlibについて2

少し進行を書いとく。 少しまとめた。前と違うのは、dxlibのただ愚直に定義を書いたやーつとかをdxlib_wrapper::dx_commonとかではなく、 commonから呼べるようにした。 また、dxlibの関数をラップした定義は、dxlib.rsに書いた。同じくdxlib-ffiでもdxlib.rsにffiを通じた定義している。 あとキーボード処理やFps処理はutilsから参照できるようにした。 まあまあすっきり書けた気がする。 あとは、dxlib-rsでは、網羅しきれてない関数群のラップ関数の定義ができれば、dxlib-ffiからじゃあなく、dxlib-rsで処理できるだろう。まぁ、ラップしてるのはあくまでエラーハンドリングだけだけど、前の設計とかよりはシンプルで良いだろう。

ただ、関係ないが、dxlib-ffiで、適当にテストしてたとき、Live2D関連の関数だけうまく定義できてないらしく、なぜか呼び出すと未定義エラーになる。 なぜだろう。C++で呼んだときは普通に呼べるのに。

pub mod common;
pub mod dxlib;
pub mod my_file;
pub mod utils;

pub use common::dxlib::*;
pub use common::dxlib_const_variables::*;
pub use common::dxlib_types::*;

#[cfg(test)]
mod tests {
    use crate::dxlib::*;
    use crate::utils::{Fps, KeyBoard};
    use crate::*;
    use std::f64::consts::PI;
    const TEST_MIN_WINDOW_WIDTH: i32 = 640;
    const TEST_MIN_WINDOW_HEIGHT: i32 = 480;
    const TEST_MAX_WINDOW_WIDTH: i32 = 1280;
    const TEST_MAX_WINDOW_HEIGHT: i32 = 800;
    const TEST_WINDOW_TITLE: &str = "test-window";

    #[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(TEST_MAX_WINDOW_WIDTH, TEST_MAX_WINDOW_HEIGHT, 32, 120)?;
        dxlib_init()?;
        set_always_run_flag(TRUE)?;
        set_draw_screen(DX_SCREEN_BACK)?;
        let mut fps = Fps::new();
        let mut key = KeyBoard::new();
        //let mut img = load_graph("/Users/daruma/Downloads/kisida.jpg")?;
        play_music("/Users/daruma/Downloads/touhou-music.mp3", DX_PLAYTYPE_BACK)?;
        let (mut x, mut y, mut size_x, mut size_y) = (
            (TEST_MAX_WINDOW_WIDTH - 500) / 2,
            (TEST_MAX_WINDOW_HEIGHT - 500) / 2,
            500,
            500,
        );
        let (mut red,mut green,mut blue) = (10,10,10);
        let (mut angle, mut radius, mut time,mut color) = (0.0, 5.0, 10,get_color(red,green,blue).ok_or("カラーコードが無効です")?);
        loop {
            if let Err(err) = process_message() {
                println!("ウィンドウが閉じられたよーーー: {}", err);
                break;
            }
            key.update()?;

            // 四角形の中心座標を計算
            let center_x = x + size_x / 2;
            let center_y = y + size_y / 2;

            let angle_rad = angle * PI / 180.0; // 度からラジアンに変換
            let mut points = vec![
                (x, y),
                (x + size_x, y),
                (x + size_x, y + size_y),
                (x, y + size_y),
            ];
            for point in points.iter_mut() {
                // 中心を原点とした座標に変換
                let mut x_shifted = point.0 - center_x;
                let mut y_shifted = point.1 - center_y;

                // 座標を回転
                let x_new = x_shifted as f64 * angle_rad.cos() - y_shifted as f64 * angle_rad.sin();
                let y_new = x_shifted as f64 * angle_rad.sin() + y_shifted as f64 * angle_rad.cos();

                // 中心を加えて座標を戻す
                point.0 = (x_new as i32 + center_x) as i32;
                point.1 = (y_new as i32 + center_y) as i32;
            }

            clear_draw_screen()?;

            // 回転後の座標で四角形を描画
            draw_box(
                points[0].0,
                points[0].1,
                points[1].0,
                points[1].1,
                color,
                FALSE,
            )?;
            draw_box(
                points[1].0,
                points[1].1,
                points[2].0,
                points[2].1,
                color,
                FALSE
            )?;
            draw_box(
                points[2].0,
                points[2].1,
                points[3].0,
                points[3].1,
                color,
                FALSE,
            )?;
            draw_box(
                points[3].0,
                points[3].1,
                points[0].0,
                points[0].1,
                color,
                FALSE,
            )?;
            angle += 1.0;
            color = get_color(red,green,blue).ok_or("カラーコードが無効です")?;
            if red < 255 && green < 255 && blue < 255{
                red+=1;
                green+=1;
                blue+=1;
            }else{
                red = 0;
                green = 0;
                blue = 0;
            }
            fps.wait()?;
            fps.draw(get_color(255, 255, 255).ok_or("カラーコードが無効です")?);
            screen_flip()?;
        }
        dxlib_end()?;
        Ok(())
    }
} 

RustでWindowsのアイコンの埋め込み

windresをcargo addか、Cargo.tomlに追加して

#[cfg(windows)]  
extern crate windres;  

use windres::Build;  

fn main() {  
    Build::new().compile("src/icon.rc").unwrap();  
}

でなんかできた。他の人もなんか同じような記事見かけたけど、一応試してみての結果を書いとく。

ちなみに、icon.rcの内容は

1 ICON "test.ico"

みたいにしたらできた。ちなみに、icon.rcと同じディレクトリにアイコンもないとだめっぽい。あと良くわからなかったけど、

ICON "test.ico"

みたいに、最初の1をなくしてもエラーになった。多分引数ってかなんかのやーつなんだろう。

あと、この方法Windows限定っぽい。Linuxだと単にデスクトップマネージャだっけ、ディスプレイマネージャーだっけ、まぁそこら辺で普通に設定できるっぽい。プログラムからアイコンを直接実行可能ファイルに埋め込むのはWindowsだけなんかな?

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(())
    }

近況

最近の近況。

具体的に言えば、このブログ書いてたの忘れてた。

最近はそうだなぁ。

イラストとプログラミングが楽しい半面、療養中の病気での薬の副作用やらがきついというのがある。まぁ特に執筆したい内容がないし、これからはてきとーにプログラミング関連のメモ的な立ち位置であげることにしよう。

 

さっそく、プログラムでの個人的なメモを書いとく。

 

まず、

環境変更しても使うであろう言語たち。

ここらへんは使うだろうが。

特に、Windowsの場合いろんな言語で、C++コンパイラが必要だったりする可能性があるし、C++は必須、RustとPythonも要必須くらい。ただ、RubyやCrystalはまだ使用して少しであるのと、あくまで私が好きな文法や設計がRubyなだけであって、コンパイル系の静的型付け言語が好みの私にとって、本当はCrystalだけで十分であるが。まぁそんなわけで、Crystalが安定的にWindowsでも使えるようになれば、

Pythonのかわり、もしくはRubyをアンストしてもOKになるから、気長に待とう。

基本的にGUIRubyPython、Rustあたりがいいかな。まぁCUIでも使えるけど。

C++はわざわざツール群を作るのには向いていない気がする。他の言語使って作るのがいいや。まぁ想定では、ゲームとかのメインをC++とかで作ってツール群をRustやRubyPythonとかーで作るって感じか。まぁどうでもいいことだけど、RustとC++を結局一番触っているという。。

まぁそもそも、ゲーム作りたい欲あんまないけど。

まぁいっか。

あと、イラストに関してはとにかく参考の漫画家を真似ることだけ考えよう。その漫画家のイラストの技術を根こそぎ奪うくらいの気持ちでやる。というか、プロを真似ずに自身の感覚に頼って練習は効率が悪すぎる。本当

プログラミングもコピペから始めたし。まぁ頑張ろう。

あと最近はやっとRustで、パーサーを作ってて、構文解析で変数定義?に近い動作ができるようになった。。長い。

これが進めば、カードゲーム用スクリプト制作も近いな。。

まぁC++で、再実装とか、色々やってみたい

あと、イラストはまだまだ真似れそうだから隅々まで技術をコピペだ。

果たして私は何がしたいのかわからないや。