aclib #5 - aclライブラリ入門(1)
(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); // 描画結果を画面に反映して、無限に待つ.
}
- 普通、グラフィックスを使ったプログラムはOS依存があり、だからOSが変わったら再学習しなければいけません。でもこのライブラリはアプリがOSに依存しないで済む方法で作ってあるので、OSやCPUが違ってもプログラムは同じになります(コンパイル手順は変わります)。
- だからここで作ったプログラムはそのまま他でも使えます。将来他のOSに乗り換えることになったとしても無駄になりません。
- このような性質を持つのは、なにもこのaclライブラリだけであるというわけではありませんが、その中でaclライブラリはかなり使いやすい部類であると私は思います。
- これは私の持論ですが、printfくらいしか出力関数がないと、できること・やりたいことはかなり限られるので、プログラミングスキルの向上はゆっくりになると思います。グラフィックスができると、どんどん複雑なことをやりたくなるので、効率よくプログラミングスキルを向上させることができると思います。
- 他にも例がないと、静止画しか描けないと誤解されそうなので、書いておきます。
kcube.c : 117行 | | invader.c : 186行 |
| | |
reversi2.c : 249行 |
|
(2) ダウンロード&インストール方法
- Windowsの場合: (SDL2.0対応版を使う方法と、Windows専用版を使う方法があります。)
- aclib07(SDL2.0対応版をMinGW-5.1.6で使う例)
- (Windows専用版は準備中)
- MacOSの場合:
- Linuxの場合:
- Androidの場合:
- (Android 7.0以降が必要です。スマートフォンでもタブレットでもOKです。)
- 準備中(とりあえず今はaclib06でしのいでください)
- ラズベリーパイの場合:
- 「はりぼてOS」の場合:
- その他(SDL2.0とCの標準ライブラリを使った一般的なやり方):
- 追加用のアプリパック:
- aclライブラリを使っているアプリ集です。
- (準備中)
(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);
}
- 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);
}
こめんと欄