コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
おちゃめ ◆jH1opV6FnGyx
2018/9/24 12:56
情報交換
OSもどき「簡易関数電卓QSP」アプリ制作講座
簡易関数電卓QSPというのは見ての通りQSP(WIDTH 16の1画面に収まるプログラム)という非常に小さいプログラムです。
この小ささでありながらプチコン3号で扱えるすべての関数や演算子に対応した関数電卓として機能し、カッコが混じった複雑な計算も難なくこなします。
メモリー機能や数式記憶機能があるため私自身も普通に電卓として非常に重宝して使用しています。
http://ochameclub.web.fc2.com/petitcom3/soft/qsp.htm#calc

この簡易関数電卓QSPは電卓としては非常に拡張性が高い(自分で作った関数を既存の関数と同じように扱える)ためこれを利用すればOSもどきとしても使うことができます。
ver.1.0からver.2.0へとバージョンアップした際には電卓としての機能向上だけではなく「OSもどき」としての機能向上も果たしました。
そのため下記(1)〜(4)に記述しているようなOSもどきとしての基本的なシステム部分もQSPに収まっているのです。

では、実際にこの簡易関数電卓QSP上で動くアプリはどうやって作るのかということを詳しく書いていきます。

コメント

アバター
おちゃめ 2018/9/24 12:56 ◆jH1opV6FnGyx
(1)戻り値が数値のアプリを作る


簡易関数電卓QSPでは基本的にCOMMON DEF〜ENDで構成された1つの関数が1つのアプリとなります。
そのためDEFを使った自作関数が作れる人であれば誰でも簡単に簡易関数電卓QSPで動作するアプリを作ることができます。

では、実際にアプリを作ってみましょう。
簡単にできるものとして「5秒当てゲーム」なんてどうでしょうか。
時計を見ずにいかに5秒を正確に当てるかというゲームです。
アプリ名はSEC5とでもしておきましょうか。(5SECのように数字で始まる関数名は付けることができないため)

COMMON DEF SEC5()
 VAR T=MILLISEC
 WHILE BUTTON()==#A
 WEND
 RETURN (MILLISEC-T)/1000
END

※このプログラムは単体では動作しないため簡易関数電卓QSPのプログラムの末尾に入力してください。

見ての通りAボタンを押している間WHIILE〜WENDのループを繰り返しているだけのプログラムです。
簡易関数電卓QSPではアプリ実行時にAボタンを押すためそのAボタンを離した時点でこのアプリは終了します。(要するに実行開始に押したAボタンを5秒間押し続けるだけのゲーム)

ところが、このアプリには画面表示がありません。
これでは何秒押されていたのか分からないという人もいるかもしれませんが心配は不要です。
実際にシステム画面(電卓画面)でSEC5()と入力して実行すれば SEC5()=4.949 などのようにきちんと表示されていることが分かります。
これは、簡易関数電卓QSPはアプリ終了時には自動的にシステム画面に戻り、システムの機能として自動的に表示が行われるためです。(ねっ、OSっぽいでしょ?)
システムに戻ったときに関数の戻り値は自動的に表示されるためユーザーは表示のことを考える必要はありません。

ちなみに前回実行したアプリ名はF1に入っているので毎回SEC5()を入力する必要はありません。
これもシステム(上記QSP)に含まれる基本機能です。
アバター
おちゃめ 2018/9/24 12:57 ◆jH1opV6FnGyx
(2)戻り値が文字列のアプリを作る

では、次は別のタイプのアプリを作ってみます。
簡単にできるものとして診断ゲームとかにしてみましょう。
端的に言えば「ランダムに文字列を返すゲーム」です。
アプリ名はSHINDANとしておきましょう。

COMMON DEF SHINDAN()
 VAR M$
 M$=MID$("BAKAAHO!てんさいヘンタイふつう",RND(5)*4,4)
 RETURN M$
END

これで、「BAKA」「AHO!」「てんさい」「ヘンタイ」「ふつう」のどれかをランダムで表示するゲームが完成です。

ところが、実際にシステム画面からSHINDAN()で実行するとエラーが出て動きません。
これは簡易関数電卓QSPのアプリはRETURNの後ろに数値を記述したもののみ対応しているためです。

では、文字列を返すアプリは作れないのかというとそんなことはありません。
システム変数R$を使えば良いのです。
実はR$に文字列が書き込まれていればシステムに戻った際に「文字列を返すアプリだ」と判断されてシステム画面には文字列が表示されるためです。

COMMON DEF SHINDAN()
 R$=MID$("BAKAAHO!てんさいヘンタイふつう",RND(5)*4,4)
 RETURN 0
END

このようにR$に返したい文字列を入れるだけでOKです。
R$はグローバル変数であるためDEF内でVARを使って宣言してはいけません。

実際に実行すれば SHINDAN()=ヘンタイ のようにちゃんとシステムの表示機能を使って表示されていることが分かります。
RETURNの後に何を記述していいのか分からなくなりますが、ここでは0を記述しましょう。
こうすることで「このアプリは数値を戻り値として返さないアプリ」というのがRETURNの後を見ただけで分かるようになります。
アバター
おちゃめ 2018/9/24 12:58 ◆jH1opV6FnGyx
(3)戻り値がないアプリを作る

では、次はお絵かきソフトを作ってみましょう。
といっても、タッチした座標に点を打つだけという最もシンプルなお絵かきソフトです。
アプリ名はOEKAKIにしてみます。

COMMON DEF OEKAKI()
 VAR TT,TX,TY
 XSCREEN 2
 DISPLAY 1
 GCLS
 WHILE 1
  VSYNC
  TOUCH OUT TT,TX,TY
  IF TT THEN GPSET TX,TY
 WEND
 RETUEN 0
END

OEKAKI()で起動させるとこのアプリには大きな問題があることに気づくと思います。
それはメインループが無限ループであるためずっとシステム画面には戻らないということです。
したがって、特定の操作を行うことで終了をさせるという処理が必要になります。
簡易関数電卓QSPではYボタンを終了ボタンとして使うことを推奨しています。(A、B、Xボタンはシステム側で意味を持たせているため終了ボタンとしては使わないことを推奨)

COMMON DEF OEKAKI()
 VAR TT,TX,TY
 XSCREEN 2
 DISPLAY 1
 GCLS
 WHILE BUTTON()!=#Y
  VSYNC
  TOUCH OUT TT,TX,TY
  IF TT THEN GPSET TX,TY
 WEND
 XSCREEN 0
 DISPLAY 0
 RETUEN 0
END

これで、Yボタンでシステムに戻るようになったものの関数自体の戻り値が0であるため戻るたびにOEKAKI()のあとに「=0」というシステムによる表示が行われるのは気になるかもしれません。

実はこれは表示しないようにすることが可能なのです。
それはシステム変数Lを使いL=0とするだけです。

COMMON DEF OEKAKI()
 VAR TT,TX,TY
 XSCREEN 2
 DISPLAY 1
 GCLS
 WHILE BUTTON()!=#Y
  VSYNC
  TOUCH OUT TT,TX,TY
  IF TT THEN GPSET TX,TY
 WEND
 XSCREEN 0
 DISPLAY 0
 L=0
 RETUEN 0
END

これで、システムに戻るたびに「=0」が表示されることは無くなりました。
ドットだけではなく線も引けるようにしたいとか、色を変えられるようにしたいとか、システムに戻るたびに画面が初期化されないようにしたいとか、様々な改善点が思いつくと思いますが、基本的な動作さえできていれば改善を行うのは容易にできるので各自で行ってみるとよいです。
後述のシステム変数を活用すると簡単に判定を行えるようになります。
アバター
おちゃめ 2018/9/24 13:00 ◆jH1opV6FnGyx
(4)システム変数について

さて、(2)、(3)においてR$やLといったシステム変数が登場しましたが、他にもまだあります。
ここでは、それらシステム変数について解説しておきたいと思います。

まず、システム変数はすべてグローバル変数であるということが重要になります。
アプリ内で同名の変数を使うことはできません。
VARで宣言すればローカル変数として使用が可能になりますが、その場合はこれらシステム変数は基本的には使えなくなります。
VAR関数でスロット指定をして強引に使うという方法はありますが、基本的には下記の変数は意味を持たせているので自分でアプリを作る場合はできるだけ下記の用途以外には使わないことを推奨します。

◎変数L

システム表示の位置(X座標)を示す変数。
L=0ならばシステム表示は行わない。
システム表示を左端(X座標0)に表示したい場合はL=25とすれば良い。
ただし、左端に表示すると入力したアプリ名と表示が被るため左端に表示するならばアプリ内で改行を行うかCLSを行う必要がある。

◎変数K

システム表示内容をファンクションキーに書き込む際にそのファンクションキーの番号を示す。(Bボタンを押しながらアプリを起動した場合にはK=3、Xボタンを押しながらだとK=4、BX両方押しながらだとK=5、それ以外だとK=2となる)
簡易関数電卓QSPでは計算結果を再利用するためにファンクションキーへの書き込みを行っているが、「戻り値はF5に書き込みたい」という場合はアプリ内でK=5とすれば良い。(当然ながら書き込めるのは文字列に限るため数値を入れたい場合はあらかじめ文字列に変換する必要がある)

◎変数P

アプリ起動時にXボタンを押しているかどうかのフラグ。(Xボタンを押した状態で起動したらPは1になる)
Xボタンを押しながら起動した場合に特殊なことを行いたいという場合にこれを使えば判定が楽になる。

◎変数X

変数Xとしてアプリ内とシステム画面でデータをやりとりすることが可能。
システム画面で書き込んでそれをアプリに反映させるという使い方ができる。
例えば簡易関数電卓QSPの基本機能としてはXを使った変数計算に用いている。

長々と書きましたが、上記のものはすべて冒頭のQSPのシステム部分についての説明です。(これらの機能がすべてQSPに収まっている)
アバター
おちゃめ 2018/9/24 13:02 ◆jH1opV6FnGyx
(5)拡張機能について

簡易関数電卓QSPには拡張プログラムが用意されています。
フルバージョン(1GQ_CALC)で備わっている拡張機能の一部を説明していきたいと思います。

◎ボタン操作関係

簡易関数電卓QSPではアプリ内で無限ループが発生しないようにYボタンでシステムに戻れるように推奨しているのですが、その際は WHILE BUTTON()!=#Y 〜 WEND と記述する必要があります。
しかし、拡張機能によってABXYLRの各ボタンが押されているかどうかは簡単に分かります。
例えばY()にはYボタンを押したかどうかのフラグが入っています。(押していれば1になる)
これを使えば WHILE BUTTON()!=#Y 〜 WEND は WHILE !Y() 〜 WEND と簡潔に記述が可能です。


十字ボタンを簡単に扱える命令もあります。それがBST命令です。
これは、ボタンとスライドパッドとタッチをすべてまとめて簡単に扱えるようにした命令です。
メインループ中でBSTという命令を実行すれば下記のシステム変数に値が入ります。

BX、BYはそれぞれ-1、0、1のいずれかの値が入ります。要するに十字ボタンを押した場合の移動量が入るので十字ボタンを使って移動するゲームを作るのが非常に楽になります。(1では遅い場合はBX*4とかにする)
BAにはボタンを押した場合に上が0、右上が1、右が2、(略)、左が6、左上が7というように8方向に0〜7の値が入ります。これによって十字ボタンを移動ではなく何かの機能として使いたいという場合には非常に楽になります。
SX、SYはSTICKの戻り値が入りますが、SAには角度がラジアンではなく度で入ります。(上方向が0度とした-180度から180度の値なのでSPROTでスライドパッドの向きに連動してキャラを回転できる)
TT、TX、TYにはTOUCHの戻り値が入るのですが、GSにはタッチ座標の色コードが入ります。
つまり、ボタンやタッチやスライドパッドで操作したいなと思ったらとりあえずBSTと記述しておけば良いのです。
アバター
おちゃめ 2018/9/24 13:04 ◆jH1opV6FnGyx
◎画面表示関係

QCLSを使えば画面の消去ができます。
これはコンソールのCLS、グラフィックのGCLS、スプライトのSPCLR、BGのBGCLRをまとめて行うだけの命令ですが、「ACLSでいいのでは?」と思うかもしれません。
しかし、ACLSをアプリ内で使うとシステム部分でエラーが発生するため使うことはできません。

下画面を使いたいという場合はXSCREEN、DISPLAYを下画面を使用できるように設定する必要がありますが、GMODEを使えばGMODE 1で一発で可能なので楽です。(上画面はGMODE 0)
システム画面に戻る際はGENDとするだけなので簡単です。

グラフィックを使い処理落ちすると画面がちらつきますが、DBUFF命令を使えば2枚のGRP面を交互に表示するダブルバッファリング機能によってちらつきを無くしてくれるため便利です。

システムに戻る際に戻り値が無ければ、L=0にして、下画面を使っていればGENDを実行してとかいろいろ面倒なことが多いですが、それが煩わしければ戻る直前でRSTを実行すれば他は何もいりません。
これは文字列を返す場合にはちゃんとシステム表示を使える状態にしてくれるため難しいことを考える必要は一切ありません。

簡易関数電卓QSPではシステムに戻った際には戻り値を適切な位置に表示できますが、アプリ内でそれと同じことを行うために用意されているのがCS命令です。これをアプリの最初で実行しておくとシステム変数CX、CYに適切な座標が入ります。

ANS命令は簡易関数電卓QSP ver.1.0用に作られたアプリとの互換性を保つための命令です。
ver.1.0では文字列を返すアプリはシステム側では表示ができず、アプリ側で表示する必要がありました。
現行のver.2.0ではANS命令と同等のものがシステムのQSPに組み込まれているためANS命令は使う必要はありません。


このように簡易関数電卓QSPフルバージョンで用意されている拡張機能を使えばアプリを作るのが非常に楽になります。
ぜひ、皆さんもアプリをどんどん作ってみてください。
システム部分だけでも関数電卓として非常に便利ですが、アプリが増えれば便利さは無限大になります。
OSもどきは、便利なアプリがたくさんあれば実用として十分に使えるようになるのです。
アバター
おちゃめ 2018/9/29 21:29 ◆jH1opV6FnGyx
長くなったのでまとめると簡易関数電卓QSP上で動くアプリを作成する方法は次のようになります。

(1)アプリはCOMMON DEFで記述
(2)無限ループは作らない(Yボタンで抜けるのを推奨)
(3)システム変数とダブるグローバル変数は使わない(ローカル変数ならばOK)

あともう1つ「アプリ内ではACLSは使用しない」というのが重要です。
現時点(ver.2.0)ではアプリ内でACLSを実行するとWIDTH 16で画面を戻してもエラーが出ます。
これに対応した新バージョン(ver.2.1)を近日中に公開予定です。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -