* OSECPU-ASKA入門 #0010
-(by [[K]], 2014.06.20)
** (0) はじめに
-以下の記事はosecpu111dのWindows版を前提にしています。他の版を使っている場合は適宜読み替えてください。
--ちなみに[[page0074]]を読めばrev2の最新版が見つかります。
** (1) ASKAは意外に難しくない?
-いきなりですが、以下のプログラムを見てください。ちなみにapp0101.ask相当の内容です。
#include "osecpu_ask.h"
api_fillRect(MODE_COL3, 7, 640, 480, 0, 0);
api_fillOval(MODE_COL3, 1, 300, 0, 320-150, 240-150);
-実質3行です。中の数字の意味はとりあえず全く分かりません。それどころか英語の部分だってよく分かりません。とりあえずそのことは気にしないことにします。とにかく重要なことは、3行しか書いていないということです。
-これをosecpuの入ったフォルダにテキストファイルとして保存して(ここではとりあえずapp0101.askとする)、Windowsのコマンドプロンプトで、
prompt>amake app0101
-と入力すると、app0101.oseというアプリケーションファイルができます(もともとあった場合には問答無用で上書きされます)。
-次に
prompt>osecpu app0101.ose
-とすればこれは直ちに実行されて、以下のような画面が見えると思います。
http://osecpu.osask.jp/download/app0038.png
-どうですか、つまり3行書くだけでこの程度の画像が表示できるというわけです。これは結構すごいと思うのですがどうでしょうか。CやC++でMFCとか使ってやったら、こんなに手軽にはできません。
~
-もう一つ例を示そうと思います。
#include "osecpu_ask.h"
Int32s col:R00, xsiz:R01, ysiz:R02, x0:R03, y0:R04, i:R05;
for (i = 0; i != 128; i++) {
col = i * 0x020201;
xsiz = ysiz = (144 - i) * 2;
x0 = (320 - 144) + i;
y0 = (240 - 144) + i;
api_fillOval(MODE_COL24, col, xsiz, ysiz, x0, y0);
}
-これは実質9行です。でもたったこれだけでも、こんな画面が出てきます。
http://osecpu.osask.jp/download/app0039.jpg
-いろいろと意味の分からない英語や数字が出ていることは確かですが、しかしとにかく、たくさん書かなくてもある程度のことができるということをまずは分かってほしいです。
~
-さらにもう一例を。
#include "osecpu_ask.h"
Int32s c:R00, x:R01, y:R02;
api_openWin(256, 256);
c = 0;
for (x = 0; x != 256; x++) {
for (y = 0; y != 256; y++) {
api_drawPoint(MODE_COL24, c, x, y);
c += 0x100; // 00xxyy00
}
}
-これは実質10行です。でもたったこれだけでも、こんな画面が出てきます。
http://osecpu.osask.jp/download/app0006a.png
~
-ASKAは高級言語ではなくアセンブラという低級言語に分類されますが、しかし一般的なアセンブラとは大きく異なり、プログラムをそれなりに短く書くことが可能です。この節ではまずそれを分かってもらいたいと思います。
--ちなみに世間の普通のアセンブラはC言語の3倍以上の行数になります。
-命令の細かい意味は、以降の節で説明します。
** (2) openWinとfillRect
-(1)では、api_で始まるいくつかの命令がありました。それについて紹介します。
~
-まずは api_openWin(xsiz, ysiz); です。これは画面にグラフィックス用のウィンドウを準備するための命令で、すべての描画命令に先立って1度だけ実行できます。したがって複数のウィンドウを持つことはできませんし、ウィンドウのサイズを後から変更することもできません。
-xsizにはx軸方向のピクセル数を、ysizにはy軸方向のピクセル数を入れます。これらの値はウィンドウの外側の大きさではなく、描画可能な領域の大きさを示しています。xsiz, ysizともゼロや負の値を指定してはいけません。
-openWinは省略して、いきなり描画命令を実行させることもできます。この場合自動で api_openWin(640, 480); が実行されます。ですからこの大きさでかまわないときはわざわざopenWinする必要はありません。でもあえてやりたければもちろんやってもいいです。
-描画域は必ず黒で初期化されます。描画命令で指定できる座標の範囲は、0~(xsiz-1), 0~(ysiz-1)になります。
~
-次は api_fillRect(mode, color, xsiz, ysiz, x0, y0); です。これは画面に塗りつぶした長方形を描きます。modeは通常MODE_COL24を指定します。xsizとysizは長方形の辺の長さです。x0, y0は長方形の左上の座標を指定します。colorは色です。長方形の一部もしくは全部が描画域をはみ出すとエラーです。
-colorについてですが、こんなふうに指定します。
0x000000 : 黒、いわゆる #000000
0xffffff : 白、いわゆる #ffffff
0xff0000 : 赤、いわゆる #ff0000
-書いているときりがないので、 http://www.finitojapan.com/cltable.html とかを見て自分のほしい色を探してください。
-これで基本的にはどんな色でも使えるわけですが、色数が少なくていいから、もっと簡単に色を指定したいときがたまにあります(みなさんはないかもしれませんが、[[K]]にはあった)。そんなときは、modeにMODE_COL3を指定してください(3ビットカラー)。そうすると、colorは0から7までしか指定できなくなって、こんなに単純になります。
0:0x000000 1:0xff0000 2:0x00ff00 3:0xffff00
4:0x0000ff 5:0xff00ff 6:0x00ffff 7:0xffffff
~
** つづく
-[[page0088]]につづく
*** もくじ
-[[page0087]]: #0010
--(1) ASKAは意外に難しくない?
--(2) openWinとfillRect
-[[page0088]]: #0011
--(1) drawPointとfillOvalとdrawLine(ついでにmodeについて)
--(2) とりあえずここまでで
--(3) 整数型変数
-[[page0089]]: #0012
--(1) for構文 #0
--(2) コメントについて
--(3) できそうでできないこと
--(4) 色の指定と16進数について
-[[page0093]]: #0013
--(1) sleep
--(2) アニメーション
--(3) if文
--(4) exit
--(5) inkey
--(6) アニメーション+キー入力=ゲーム
-[[page0095]]: #0014
--(1) 関数の作り方、呼び出し方
--(2) 再帰呼び出しの例
-[[page0098]]: #0015
--(1) putStringとputStringDec
--(2) drawStringとdrawStringDec
* こめんと欄
#comment