* OSECPU-ASKA入門 #0013 -(by [[K]], 2013.06.23) ** (0) はじめに -以下の記事はosecpu112dのWindows版を前提にしています。他の版を使っている場合は適宜読み替えてください。 --ちなみに[[page0074]]を読めばrev2の最新版が見つかります。 ~ -もくじ --[[page0087]]: #0010 --[[page0088]]: #0011 --[[page0089]]: #0012 --[[page0093]]: #0013 ** (1) sleep -api_sleep(mode, msec); : --指定された時間だけ、プログラムを停止させます。msecはミリ秒という意味です。つまり1000で1秒です。 --なおmsecに-1を指定することもできて、これは無限大時間のsleepを表します。ユーザがウィンドウを閉じるかCtrl-Cすると終了します。 --modeはとりあえず0を指定すると覚えておいてください。他の用法はおいおい説明します。 #include "osecpu_ask.h" Int32s xsiz:R00, ysiz:R01, x0:R02, y0:R03, col:R04, i:R05; // ゆっくりじわじわと描画されます. for (i = 0; i != 128; i++) { xsiz = ysiz = (144 - i) * 2; x0 = (320 - 144) + i; y0 = (240 - 144) + i; col = i * 0x020201; api_fillOval(0, xsiz, ysiz, x0, y0, col); api_sleep(0, 100); } ** (2) アニメーション -描画命令とsleepがあればアニメーションができます。 -ただし今(osecpu112d)のOSECPU-VMのお手軽描画処理ルーチンは手抜きで速度が出ないので、FPSはせいぜい10で、解像度も200x200~300x300程度でお願いします。 #include "osecpu_ask.h" Int32s x:R00, y:R01, vx:R02, vy:R03, tx:R04, ty:R05; api_openWin(320, 240); x = 32; y = 0; vx = 8; vy = 8; for (;;) { tx = x + vx; ty = y + vy; if (tx < 0 ) { vx = 8; } if (tx > 320 - 16) { vx = -8; } if (ty < 0 ) { vy = 8; } if (ty > 240 - 16) { vy = -8; } x += vx; y += vy; api_fillOval(MODE_COL3, 7, 16, 16, x, y); // ボールを描く. api_sleep(0, 100); api_fillRect(MODE_COL3, 0, 16, 16, x, y); // ボールを消す. } ** (3) if文 -ちょっと説明が前後してしまいましたが、OSECPU-ASKAではif文が使えます。基本的にはC言語と同じですが、条件が成立したときの文やelse節の文は、原則として { } でくくる必要があります。1文しかなくても省略しないでください。 if (条件式) { 成立したときに実行される } または if (条件式) { 成立したときに実行される } else { 不成立のときに実行される } -if文では、 break; と continue; と goto文だけに限って、 { } でくくらずに書けます(最適化もききます)。しかしelse節がある場合はこの方法は使えません。しかも { } でくくらない場合は、改行せずに書く必要があります。いろいろ制約が多いです。 --制約が多くなってしまったのは、もちろんASKAが手抜き実装のままになっているからです。例によって、おもいやりとやさしさをお願いします。 if (条件式) break; // これはよい. if (条件式) break; // これはよくない. -しかし、たとえば if (条件式) { break; } と書いてはいけないのかと言うとそんなことはないので、よくわからなければこの書き方を忘れてしまってもいいと思います(その代わり現状では最適化がききませんが)。 -条件式に関してですが、ASKAでは&&や||がまだ使えません。代わりに&や|を使ってください。 ** (4) exit -api_exit(i); : --アプリケーションをただちに終了させます。iには終了コードを指定できます。0は正常終了を意味します。 --開かれているウィンドウがあればそれは直ちに閉じられます。 ** (5) inkey -api_inkey(_i, mode); : --キー入力をするためのAPIです。このAPIは今まで紹介してきたAPIと大きな違いが一つあって、結果をプログラムが受け取る必要があります。 --現在(osecpu112d)では、OSECPU-ASKAには「関数値」という概念がないので、以下のような記述ができません。 k = api_inkey(mode); --代わりどう書くのかと言うと、こうします。 api_inkey(k, mode); --つまり引数の中に書いてしまうわけですね。かなりダサいです。C言語のように&をつけるとかそういうことすらなく、そのまま書くので、かなり分かりにくいです。・・・すみません! --このように値を渡すのではなく受け取るために指定する場合は、_iのようにアンダースコア付きで紹介します。しかし実際に使うときは変数名の前に_を付ける必要はありません。当然ですがここは変数しか指定できません。定数を書かないようにしてください。 --キーコードは基本的には文字コードですが、いくつかのキーは特別なコードが返されます。 -1 キーは入力されていない 27 Escキー 4128 PageUp 4129 PageDown 4130 End 4131 Home 4132 ← 4133 ↑ 4134 → 4135 ↓ 4136 Insert 4137 Delete --modeは、とりあえず常に0にしておきます。他の値の説明はまたの機会に。 ** (6) アニメーション+キー入力=ゲーム -キー入力に応じて、アニメーション内容が変化するようにできれば、それはゲームが作れるということです! -と思ったら点数表示ができないとだめですね。そのための説明が足りていません。 -それにキャラクタも描きたいですよね・・・そのための説明も不十分ですね。 -じゃあ今後はそこを中心に・・・。 ** つづく -(工事中) -[[page0095]]につづく * こめんと欄 #comment