aclib #5 - aclライブラリ入門(1)

  • (by K, 2020.09.15)

(1) はじめに

  • 学校や独学でC言語を勉強してみて、「1~100までの和をfor文で計算してprintfで表示するくらいならできるようになったけれど、そこから先、何をして遊べばいいのかわからない」なんて思っていませんか?
  • ここに紹介しているaclライブラリというのを使えば、簡単に画面に絵を描けるようになります。
  • 論より証拠で例を見せます。コメントが書いてありますが、もちろん入力の必要はありません。
    #include <acl.c>
    void aMain()
    {
        AWindow *w = aOpenWin(320, 240, "Japan", 1);   // 「Japan」という名前のウィンドウを作る.
        aFillRect(w, 300, 220, 10, 10, 0xffffff);      // 横300ピクセル、縦220ピクセル、色#ffffffの長方形を描画.
        aFillOval(w, 120, 120, 100, 60, 0xff0000);     // 直径120ピクセル、色#ff0000の円を描画.
        aWait(-1);                                     // 描画結果を画面に反映して、無限に待つ.
    }
    • http://k.osask.jp/files/pic20200915a.png
  • 普通、グラフィックスを使ったプログラムはOS依存があり、だからOSが変わったら再学習しなければいけません。でもこのライブラリはアプリがOSに依存しないで済む方法で作ってあるので、OSやCPUが違ってもプログラムは同じになります(コンパイル手順は変わります)。
  • だからここで作ったプログラムはそのまま他でも使えます。将来他のOSに乗り換えることになったとしても無駄になりません。
  • このような性質を持つのは、なにもこのaclライブラリだけであるというわけではありませんが、その中でaclライブラリはかなり使いやすい部類であると私は思います。
  • これは私の持論ですが、printfくらいしか出力関数がないと、できること・やりたいことはかなり限られるので、プログラミングスキルの向上はゆっくりになると思います。グラフィックスができると、どんどん複雑なことをやりたくなるので、効率よくプログラミングスキルを向上させることができると思います。

  • 他にも例がないと、静止画しか描けないと誤解されそうなので、書いておきます。
    kcube.c : 117行 (ライブラリのsampleより)→ aclib09    invader.c : 186行 (ライブラリのsampleより)→ aclib09
    http://k.osask.jp/files/pic20200831a.jpghttp://k.osask.jp/files/pic20200901a.jpg


reversi2.c : 249行 (追加用のアプリパックより)→ aclib09
http://k.osask.jp/files/pic20200915d.png

  • 以下は静止画ですが、きれいだと思うのでここでも紹介しておきます。
    mandel.c : 40行 (ライブラリのsampleより)→ aclib09    kray.c : 136行 (追加用のアプリパックより)→ aclib09
    http://k.osask.jp/files/pic20200917b.pnghttp://k.osask.jp/files/pic20200923a.png

(2) ダウンロード&インストール方法

  • Windowsの場合: (SDL2.0対応版を使う方法と、Windows専用版を使う方法があります。)
    • aclib21(Windows専用版をMinGW-5.1.6で使う例)
    • aclib07(SDL2.0対応版をMinGW-5.1.6で使う例)
  • MacOSの場合:
    • 準備中(とりあえず今はaclib06でしのいでください)
  • Linuxの場合:
  • Androidの場合: (Android 7.0以降が必要です。スマートフォンでもタブレットでもOKです。)
    • aclib08 (SDL2.0対応版をTermux+clangで使う例)
  • ラズベリーパイの場合:
    • 準備中(とりあえず今はaclib06でしのいでください)
  • 「はりぼてOS」の場合:
    • 準備中
  • その他(SDL2.0とCの標準ライブラリを使った一般的なやり方):

  • 追加用のアプリパック:
    • aclライブラリを使っているアプリ集です。
    • aclib09 (←協力者募集中!)

  • ついでに補足情報:
  • [Q]aclライブラリを使ったアプリはソースを公開しなければいけないのですか?
  • [A]いいえ、コンパイル&リンク済みの実行ファイルだけを公開するのでもOKです。
  • でもソースも公開されれば、いろんな人が自分の実行環境に合わせてコンパイル&リンクすることができます。
  • [Q]aclライブラリを使ってソフトウェアを作ったらオープンソースにしなければいけないですか?
  • [A]いいえ。そのような制約はありません。このライブラリは、組み込まれたものに関して何も要求しません。ドキュメントや著作権表示に、aclライブラリのことを含める義務もありません。

  • 余談ですが、私はWindowsとAndroidの両方でaclライブラリをよく使っています。
  • アプリのプログラムは全く共通で、しかもアプリの中で機種判別するような#ifなどは一切使っていないのに、全く同じ実行結果になることが、私には本当に感動的です。
  • また私はAmazonで買った新品3,850円のAndroidタブレットを持っているのですが、それでもまるでPCのようにアプリ開発ができて、しかも耐え難い遅さとかではないので、それにも感動してしまいます。
  • (時代遅れのおじさんなので、いろんなことが当たり前じゃなくて、いちいち感動してしまうのです。)

(3) しましまを描いてみる

#include <acl.c>
void aMain()
{
    AWindow *w = aOpenWin(320, 240, "stripes", 1);
    int y, c;
    for (y = 0; y < 240; y += 40) {
        c = 0;
        if (y % 80 == 0) c = 0xffffff; // もしyが80で割り切れたら白、そうでなければ黒.
        aFillRect(w, 320, 40, 0, y, c);
    }
    aWait(-1);
}
  • http://k.osask.jp/files/pic20200915b.png
  • さて、ここで出てきた関数を説明します。
  • aOpenWin(xsiz, ysiz, title, autoClose)
    • 指定された大きさでウィンドウを開きます。ウィンドウのタイトルはtitleになります。
    • autoCloseには普通は1を指定します。0にすると、ウィンドウの閉じるボタンをクリックしても閉じないウィンドウになります。これについてはもっと先で説明します。
  • aFillRect(xsiz, ysiz, x0, y0, col)
    • 塗りつぶした長方形を描きます。長方形の大きさはxsizとysizで指定します。
    • x0とy0は、長方形の左上の座標がどこになるのかを指定します。
    • colは色を指定します。
  • aWait(msec)
    • それまでの描画内容を確実に実画面に反映させた後、指定された時間(ミリ秒)だけ待ちます。その期間中はできるだけ他のアプリにCPU時間を割り当てるか、もしくは消費電力を抑えます。
    • 時間に-1を指定した場合、それは「無限」を指定したとみなされて、プログラムがその先に進むことはありません。
    • これを書かずにプログラムを終了してしまうと、プログラムから開いたウィンドウがすべて勝手に閉じられてしまうので、表示内容を維持して終了したいときに、aWait(-1)はよく使われます。
    • aWait(-1)の実行中でも、ウィンドウを閉じるなどすれば、プログラムは自動で正常終了します。
  • そのほかのお約束的なことも紹介しておきます。
  • aclライブラリを使ったアプリでは、main()の代わりにaMain()を使います。
  • またこのaMain()は引数をとらず、返値もありません。そのまま関数を終了すれば、それは正常終了です。
  • エラー終了したいときは、aExitInt(status);を使います(statusを0にすれば、aExitIntでも正常終了ができます)。
  • また標準関数群はすべて<acl.c>の中で宣言されるので、わざわざ<stdio.h>などをincludeする必要はありません。

(4) 市松模様を描いてみる

#include <acl.c>
void aMain()
{
    AWindow *w = aOpenWin(320, 240, "checkered", 1);
    int x, y, c;
    for (y = 0; y < 240; y += 40) {
        for (x = 0; x < 320; x += 40) {
            c = 0;
            if ((x + y) % 80 == 0) c = 0xffffff; // もしx+yが80で割り切れたら白、そうでなければ黒.
            aFillRect(w, 40, 40, x, y, c);
        }
    }
    aWait(-1);
}
  • http://k.osask.jp/files/pic20200915c.png

つづく・・・

こめんと欄

  • 掲示板をご利用ください。→aclib_bbs

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-09-25 (金) 23:37:59 (61d)