DXライブラリで、描画した図形に穴をあける

DXライブラリを利用して児童向けの学習教材を作成しているのだが、MakeScreen()したグラフィックに描画した矩形などの図形に穴をあけて背景を透過させる必要が出てきた。
DrawCircle() などの関数に指定する色に透明色?が指定できれば良いのだが、DXライブラリで使用する色コードには透明度の情報はない。
最初、マスク関係関数の機能を利用すればできそうかなと考えたが、マスクデータがDXライブラリのグラフィックではなくバイナリの配列データで用意する必要があり面倒。 もうちょっと手軽にできる方法はないかと検索してみたら、DXライブラリ質問掲示板で 「MakeGraph() による背景の透明化」という記事を見つけた。

その記事によると、SetDrawBlendMode()で、乗算モードを指定してパラメーターに0を指定することで、描画時のアルファチャンネルの値を0にすることができるらしい。この時、乗算モードを指定するのをリファレンスに記載されている DX_BLENDMODE_MULA(11)ではなく、DX_BLENDMODE_MUL(4)を指定しなくてはいけない。ここら辺の仕組みリファレンスに記載がないので何がどうしてどうなってるのかさっぱりだが、とりあえず試してみると期待していた描画ができた。

// ■ 穴の開いた矩形を描画する。

// 矩形を描く
DX.DrawBox(0, 0, 640, 480, red , DX.TRUE);
// ブレンドモードで乗算モードを指定
DX.SetDrawBlendMode(DX.DX_BLENDMODE_MUL, 0);
// ここで描画した円はアルファチャンネルが0で描画されるため透明になる。
// 結果として透明になるので指定する色は何色でも良い。
DX.DrawCircle(100, 100, 50, WHITE, DX.TRUE); 
// ブレンドモードを元に戻す
DX.SetDrawBlendMode(DX.DX_BLENDMODE_NOBLEND, 255);

DXライブラリ置き場 HOME

PythonではじめるiOSプログラミング

いつもの如くジュンク堂を冷やかしてたら発売されていたので購入。
iOSで動作するPythonの開発環境である Pythonista3 の解説書。
著者の掌田津耶乃は確かMac関連の雑誌でライターをしていた人で、最近はやたらめったらビギナー向けの入門書を書きまくってる印象の人。普段はこの人の対象とする読者層からずれてるので買うことはないが、Pythonista3 の解説書ということで無条件購入。

内容は1章が概説、2章がNumPy, SymPy, matplotlib のざっくりとした解説、3章からがPythonista固有のUIライブラリや2Dゲーム開発用の SceneやNode、iOS固有の機能を利用するためのライブラリとそのサンプルプログラムの解説となっている。ちなみに、Python については巻末の付録で文法についての簡易リファレンスがついているだけで解説はない。したがってある程度のPythonの知識のある人が前提の本になっている。Pythonに関する入門書は腐るほどあるのでその判断は正しいと思うが、それなら、2章のNumPyなどの数学ライブラリの解説もいらんのではないかと思った。

3章以降のPythionista3固有のライブラリの解説は、さすがに入門書をたくさん書いているだけあって熟れた感じでさくさく読める。いくつか趣味に合わない表現などがあって気になる箇所はあったものの、思ってた以上に入門書としてキチンとした内容で、ちょっと掌田津耶乃さんなめてましたスイマセンという気持ちに。

Rust 入門 : FizzBuzzを書いてみる。

Rust に入門してみる。

最初のプログラムということで、難しいことを考えず素直ににFizzBuzzを書いてみる。
若いころは最初に書くプログラムといえば Hello world と相場は決まっていたが、最近はFizzBuzzなのだそうだ。そもそも、Rust だとプロジェクトを生成すると雛形のソースが Hello world になっておりわざわざ書く必要もない。

まず、適当なディレクトリで、

% cargo new fizz_buzz
  Created binary (application) `fizz_buzz` package

とやって、プロジェクトを作成して、生成されたmain.rsを書き換える。
1から100までの数列の生成方法と、パターンマッチのやりかたを適当にググって書いて見ると以下のような感じに。

// Fizz Buzz
fn main() {
    for n in 1..101 {
        match n {
            x if (x % 3 == 0 && x % 5 == 0) => println!("Fizz Buzz"),
            x if (x % 3 == 0) => println!("Fizz"),
            x if (x % 5== 0) => println!("Buzz"),
            _ => println!("{}", n)
        }
    }
}

cargo run でコンパイルと実行ができるようなのでやってみる。

% cargo run
   Compiling fizz_buzz v0.1.0 (/Users/osamu/Projects/rust/fizz_buzz)
    Finished dev [unoptimized + debuginfo] target(s) in 0.22s
     Running `target/debug/fizz_buzz`
1
2
Fizz
4
Buzz
Fizz
...

とりあえずエラーもなく動いた。