* OSECPU-ASKA入門 #0003 -(by [[K]], 2013.06.07) ** (0) はじめに -以下の記事はver.0.46のWindows版を前提にしています。他の版を使っている場合は適宜読み替えてください。 --たとえば osecpu046a.zip とかのことです ~ -もくじ --[[page0036]]: #0000 --[[page0037]]: #0001 --[[page0038]]: #0002 --[[page0039]]: #0003 ** (1) sleep -junkApi_sleep(mode, msec); : --指定された時間だけ、プログラムを停止させます。msecはミリ秒という意味です。つまり1000で1秒です。 --なおmsecに-1を指定することもできて、これは無限大時間のsleepを表します。 --modeはとりあえず0を指定すると覚えておいてください。他の用法はおいおい説明します。 --なお、プログラム中で一度でもsleepを使うと、「お、このプログラムはちゃんと自分で時間管理をしているんだな」とosecpuに判断され、末尾の junkApi_sleep(0, -1); の自動実行機能が無効化されます。この無効化が何を意味するかですが、いきなり終了してウィンドウを閉じられてしまうのです。これじゃあせっかく描いた絵もよく見えません。ということで、sleepを使うプログラムでは、もし絵を描いた後に勝手に終了してほしくないのなら、手動で junkApi_sleep(0, -1); を末尾につけておいてください。 #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; junkApi_fillOval(0, xsiz, ysiz, x0, y0, col); junkApi_sleep(0, 100); } junkApi_sleep(0, -1); // これがないと描き終わった瞬間にウィンドウを閉じられてしまう. ** (2) アニメーション -描画命令とsleepがあればアニメーションができます。 -ただし今(ver.0.46)のOSECPUの描画処理ルーチンはかなり手抜きで速度が出ないので、FPSはせいぜい10で、解像度も200x200~300x300程度でお願いします。 --OSECPUの演算能力はJITコンパイラのおかげで十分に優秀なのですが・・・ #include "osecpu_ask.h" int32s x:R00, y:R01, vx:R02, vy:R03, tx:R04, ty:R05; junkApi_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; junkApi_fillOval(4, 16, 16, x, y, 7); // ボールを描く. junkApi_sleep(0, 100); junkApi_fillRect(4, 16, 16, x, y, 0); // ボールを消す. } ** (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 -jnukApi_exit(i); : --アプリケーションを終了させます。iには終了コードを指定できます。0は正常終了を意味します。 --プログラムが最後の行を実行し終わると、自動で jnukApi_exit(0); が実行されるようになっています。ということで、出番の少ないAPIでもあります。 ** (5) inkey -junkApi_inkey(_i, mode); : --キー入力をするためのAPIです。このAPIは今まで紹介してきたAPIと大きな違いが一つあって、結果をプログラムが受け取る必要があります。 --現在(ver.0.47)では、OSECPU-ASKAには「関数値」という概念がないので、以下のような記述ができません。 k = junkApi_inkey(mode); --代わりどう書くのかと言うと、こうします。 junkApi_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は、とりあえず常に1にしておきます。他の値の説明はまたの機会に。(2013.07.30 誤記修正 thanks: ?さん) --modeは、とりあえず常に1にしておきます。他の値の説明はまたの機会に。(2013.07.30 誤記修正 thanks: herbaさん) ** (6) アニメーション+キー入力=ゲーム -キー入力に応じて、アニメーション内容が変化するようにできれば、それはゲームが作れるということです! -と思ったら点数表示ができないとだめですね。そのための説明が足りていません。 -それにキャラクタも描きたいですよね・・・そのための説明も不十分ですね。 -じゃあ今後はそこを中心に・・・。 ** つづく -[[page0044]]につづく * こめんと欄 #comment