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

アバター
しんいち ◆lHy.hAWXbthn
2019/2/16 11:48
質問
Directモードかどうかの判定
Directモードで?DISPLAY()とするとエラーを吐きやがるので、Directモードかどうかを判定したいと思ったのですが、何か方法ありますかね?

本当にやりたいことは、DISPLAY 1の時だけTOUCH取得するようにしたい。Directモードじゃなければ普通にDISPLAY()で判定できるんだけどねぇ。

コメント

アバター
こういち 2019/2/16 12:26 ◆ou0jbJnEJ0Kb
こめのこ
アバター
まるだい 2019/2/16 14:10 ◆AdwyE6qhnxpV
Directモードじゃないモードって?
アバター
しんいち 2019/2/16 15:12 ◆lHy.hAWXbthn
>Directモードじゃないモードって?
モードとなるとEditモードになるけど、要はスロット0〜3(かスマイルツール)での実行が、Directモードじゃないモードですね。

例えば IS_DIRECT()なんてDEFが作れて、Directモードで?IS_DIRECT()としたら1、スロット3で?IS_DIRECT()としたら0。なんて出来たらいいなぁと。
アバター
あきと 2019/2/16 17:58 ◆qGd5dQw2g3a2
DIRECTモードは上画面にしか表示されないのでそもそもDISPLAY()で表示している面を取得する事には意味がないような気がします。

タッチ検出をDIRECTモードでしたいのでしょうか。FOR命令やWHILE,GOTO,GOSUBも使えないのでメインループを回すことができないので無理だと思いますよ。
アバター
しんいち 2019/2/16 20:32 ◆lHy.hAWXbthn
もう少し事情を詳しく説明しますと、ソフトウェアキーボードを作っていまして、それはDISPLAY 0でも1でも実行できるようにしています。DISPLAY 0で実行してもマウスをスティックで動かして入力できるようにしています。この時、TOUCH取得が有効なままだと、ソフトウェアキーボードが表示されていない下画面の関係ないところをタッチしても、上画面のソフトウェアキーボードが反応してしまいます。

そこでIF DISPLAY()THEN TOUCH OUT TT,TX,TYとしたいところなのですが、DirectモードではDISPLAY()でもエラーになってしまうので、さて、どうしたものかと。こんなことだけでDirectモードでは使用禁止としてしまうのも情けない気がするし。

ということで、Directモードでタッチ検出をさせない。が、やりたいことです。
ちなみにDirectモード直打ちでもFORやWHILEは使えますよ(一度に打ち込めるのは256文字まで)。また、COMMON化したDEFならDirectモードからも呼べるので色々できます。
アバター
こういち 2019/2/16 20:35 ◆ou0jbJnEJ0Kb
COMMON DEF〜END内はそのDEFがあるスロットと見なされる模様?
アバター
こういち 2019/2/16 20:39 ◆ou0jbJnEJ0Kb
おちゃめさんのSLOT()で検証しましたが、やっぱりですね。
ならばCALLを使えば…?
いや。VAR()やCHKCALL()…も駄目か。
アバター
あきと 2019/2/16 21:18 ◆qGd5dQw2g3a2
そうなんですね。ループ書けたとは。
確認もせずに書き込んでしまいました。
アバター
しんいち 2019/2/16 22:19 ◆lHy.hAWXbthn
DirectモードではEnter押すと実行しようとしちゃうので、NEXTとかWENDを入力する前の中途半端な状態でEnter押してエラーになるからループが書けないと思われたかも知れませんが、そんな時はEnterの代わりに:(セミコロン)で改行せずに続けて入力すれば、ループも1行で書けるのでDirectモードでも実行できます。
またはペーストすれば複数行でもEnterが押されたことにはならないので、Editモードで書いた複数行のループの記述をコピーして、Directモードにペーストして実行することもできます(但し256文字までなのであまり長い記述はペーストできない)。
アバター
SatoshiMcCloud 2019/2/17 1:43 ◆Z1qfV11i63Jr
10回読み直して、ようやくやりたいことが分かってきたかも…?

たぶん、動かしたいプログラムをcommon defで命令として作っておき、directモードで命令を呼び出して、やりたいことを実現しようとしてるんだと思います。

であれば、作成する命令に引数を一つ追加し、directモードから呼び出すときはそれをtrueにすることで、実行時にdirectモードかそうでないかを判別するのはどうでしょうか?自動で判別ではないので、あまりキレイな方法とは言えないかもしれませんが…
アバター
SatoshiMcCloud 2019/2/17 1:47 ◆Z1qfV11i63Jr
もっとも、directモードで命令を呼び出して実行したとして、Display命令(画面を選ぶほう)も実行できずエラーになるので…

結局のところ、display命令は一切使わず、下の画面にはグラフィック描画命令だけでなんとかするしかないと思います。
アバター
Ryou Tanpo 2019/2/17 11:04 ◆AI5iRr9FjmkJ
DIRECTMODE() 作りました!
コンソールを消去してしまいますがそれでもよければ。
DIRECT モードから実行された場合、または DIRECT モードから実行された命令の中で呼ばれた場合は TRUE 、RUN や START ボタンで実行された場合に呼ばれたときは FALSE を返します。

UTILITY【ZDB3N8KE】
の中の DIRECT が本体で DIRECT_TEST がテストです。
アバター
Ryou Tanpo 2019/2/17 11:06 ◆AI5iRr9FjmkJ
BACKTRACE を実行すると DIRECT モードでは最下行が 0:0 (SLOT0、0行目) になるのを利用しています。プログラムからでは、最下行も0行目にはなりません。
アバター
しんいち 2019/2/17 12:35 ◆lHy.hAWXbthn
>SatoshiMcCloudさん
状態を判別できないものは、引数で指定するのが素直な方法ですよね。プチコンではそういうのがちょこちょこあるのが不便なんだよなぁ。XSCREENで割り当てたスプライトの数とかも。SPUSEDで判別しようとするとOut of rangeのエラー吐きやがるし。

>Ryou Tanpoさん
おお!すばらしい!ダウンロードさせて頂きました(^o^)
私も丁度、BACKTRACEでの方法を検討していたところでした。実行スロットを判別する際に、CHKVAR方式(おちゃめさん方式)では呼び出し先(そのDEFが定義された)スロットが返され、BACKTRACE方式では呼び出し元(そのDEFが実行された)スロットが返されるので、その違いで判別できないかと考えていましたが、スロット0だとDirectモードと同じになっちゃうからどうしようかと思っていました。
BACKTRACEの何行目のところに注目するのは思い付きませんでしたね。CLS問題は、必要であればコンソールの復元処理でも入れとけば大丈夫でしょう。

ありがとうございました!
アバター
Ryou Tanpo 2019/2/17 13:09 ◆AI5iRr9FjmkJ
こちらこそありがとうございます!
利用していただけると嬉しいです!
まあ僕も DEF 引数が省略されたか判断する関数とか需要少ないものばっかり作ってますが (笑)
アバター
おちゃめ 2019/2/17 22:55 ◆jH1opV6FnGyx
BACKTRACE命令はお手軽に動作スロットやダイレクトモードかどうかの取得ができますが、ダイレクトモードかどうかを取得する場合の注意点としては停止ボタンやSTOP命令、もしくはエラーで一時停止したプログラムに対しては正常判定ができないということです。

そもそもBACKTRACEとはどんな命令かというと直前に実行していたスロットと実行していた行を表示する命令です。
しかし、プログラムを正常に終了した場合にはスロット0の0行を示す仕様になっています。実はプチコン3号のダイレクトモードは基本的にスロット0を拡張したものであるためです。そのためスロット0に置いている自作命令や自作関数はダイレクトモードからでも使用ができるわけです。
スロット1などのスロット0以外に置いている自作命令や自作関数はダイレクトモードでは使用できないかというとそういうことはありません。STOP命令を置くなどの方法でスロット1での動作を一時停止した状態だとスロット1にある自作命令や自作関数をダイレクトモードで使用が可能になります。
現在ダイレクトモードでどのスロットの自作命令や自作関数が使用可能かはBACKTRACE命令で分かります。

この辺のことを考慮しなければBACKTRACE命令でダイレクトモードで動作しているかどうかの判別は問題ありません。
アバター
しんいち 2019/2/18 14:09 ◆lHy.hAWXbthn
BACKTRACEの機能を考えると、プログラムが一時停止した直後はダイレクトモードか判別できないですね。具体的な状況を考えてみると、ダイレクトモードを判別するDEFが定義されているスロットのプログラムが一時停止した直後に、ダイレクトモードで直接そのDEFを実行(?IS_DIRECT()とか)すると、判別できないか。他のスロットにライブラリ的にそのDEFをCOMMONで置いている場合は、そもそもそのライブラリのスロットをRUNし直さなきゃダイレクトモードからDEFを実行できるようにならないので、大丈夫というか問題は起きないかな(ライブラリを一時停止、なんてしないか)。

とにかく、一時停止直後は注意ですね(ややこしくなってきたの急にざっくり^^;)。

あと、スロット1とかでも一時停止した状態ならダイレクトモードから参照できるようになってたんですね。たまに、スロット1なのにダイレクトモードから変数が参照できる、って状況には出会してたんだけど、その時はバグったかな?くらいに思ってました(^^ゞ
アバター
おちゃめ 2019/2/18 21:42 ◆jH1opV6FnGyx
スロット0以外にある自作関数をダイレクトモードで実行する方法に関しては「プチコン3号 自作関数完全マニュアル」に記述しています。
http://petitverse.hosiken.jp/community/petitcom/topic/?read=897
マニュアルには記述されていないプチコン3号の仕様を多数記述しているのでプチコン3号を使いこなしたい人には超オススメの本です。
アバター
しんいち 2019/2/18 22:54 ◆lHy.hAWXbthn
うぉ〜、見たい。
さっき気付いたんだけど、DEFをSTOP等で一時停止すれば、ローカル変数でもダイレクトモードから参照できたんですね。DEFのデバッグは今までPRINT文埋め込んだりしてたけど、STOPの方が楽チンだなぁ。今までの苦労がトホホorz

コメントを書く

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

- WEB PATIO -