Archiverse Internet Archive
投稿のみ 投稿と返信
前のページ(最近)
1119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139154
次のページ(過去)
返信[5]
親投稿
おちゃめ ochame_nako
このように書くとこのAWAITのループ処理はWHILE~WENDではなくREPEAT~UNTILを使用するのが正解と感じる人もいるかもしれないけどそんなことはないです。 DEF AWAIT T  WHILE 1   DEC T   WAIT   IF BUTTON(2)AND 16 || !T THEN BREAK  WEND END WHILE 1~WENDという無限ループの間を作りWENDの前の行(DEC TやWAITより後の行)に終了条件を記述してBREAKすればREPEAT~UNTILと同じ動作をします。
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
あと細かい部分を言えばWHILE~WENDだとWAITやVSYNCを挟まずにAWAIT命令が複数連続する場合には正しくAボタン待ちができない場合があります。 REPEAT~UNTILだとループ内が最低1回実行されるのが保証されるためWAIT 1の実行によってそのような誤動作の心配はありません。(WHILE~WENDの場合は別途WAITかVSYNCが必要) したがって、WHILE~WENDかREPEAT~UNTILかはループ終了条件を最初から満たしているときループ内を実行して欲しいか欲しくないかで選ぶのが良いと思います。 ループ内を実行しない方が良い場合はWHILE~WENDを使用しましょう。
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
REPEAT~UNTILではなくWHILE~WENDではダメなのかと思う人もいるでしょう。 AWAIT命令をWHILE~WENDを使って記述したら次のようになります。 終了条件は「BUTTON(2)AND 16が0以外」もしくは「Tの値が0」で同じです。 DEF AWAIT T  WHILE !(BUTTON(2)AND 16)&& T   DEC T   WAIT  WEND END REPEAT~UNTILとWHILE~WENDは似たような命令ですが、初期段階で終了条件を満たしているか否かでループ内を1回実行するかスキップされるかという違いがあります。 その1回でこの場合は0フレームのウェイトと無限のウェイトという大きな差が発生しています。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
ここで問題は時間設定をしない場合はAボタンを押すまでひたすら待つようにするため無限ループにしたいということです。 AWAIT 0とするとループに入る前のTの初期値は0で1回目のループ内でTの値は-1になり、ループを繰り返せばどんどん小さな値になるため0になることは決してありません。 したがって、AWAIT 0で無限ループができるわけです。
0そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
初心者向けに動作の解説をしておきます。 REPEAT~UNTILのループの中にWAIT(WAIT 1)を挟むことでその引数の回数ほどループしているというだけです。 ループの終了条件は「BUTTON(2)AND 16が0以外の値」もしくは「Tの値が0」となっています。(!Tとすることで「Tの値が0の時」という条件になる) 「BUTTON(2)AND 16が0以外の値」というのは、Aボタンを押した場合に限られます。 Tの値が0の時というのはTの値をデクリメント(1ずつ減算)したときに初期のTの回数だけループを実行することになります。
0そうだね
プレイ済み
投稿
おちゃめ ochame_nako
初心者の質問によく出てくる「Aボタンを押したら次の画面に進む」というのが、簡単にできるAWAIT命令を作りました。 AWAIT 60とするだけでAボタンが押されるか60フレーム(1秒)経つまで待ちます。 時間制限はしない場合はAWAIT 0とすればAボタンが押されるまでひたすら待ちます。
10そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
上記6つの自作関数の公開キーは【 4KX3AXY3 】です。 近日中に私が作った自作関数を1つのプロジェクトにまとめて公開するので上記公開キーはそれまで有効です。 これだけ長々と書いたけどフラグが31個までならば整数値を使えば普通にビット演算ができるためこれより遙かに簡単にフラグ管理プログラムが作れます。 また、実数型を2進数で表記してもフラグ管理以外での使い道はないかもしれません。 「プチコン3号の内部ではこんな感じで数値が表記されているんだなぁ」と感慨深くなってもらえれば十分です。(※あくまでこれは一般的な倍精度浮動小数点の形式でありプチコン3号これと同じ形式で実数が扱われているという保証をするものではありません) BIN$やDECIはそれなりに活用できる用途があるかもしれません。
1そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
FLAGREAD関数は指定のフラグ番号がONかOFFかを返します。 例:F=FLAGREAD(A,10) 変数Aのフラグ番号10がONならばFの値は1になる。 ※代入する変数と読み出す変数は必ず「異なる」変数にしてください。 64桁なのに63個のフラグしか管理できないのはinfやnanの場合は正常な値を返さないので除外しているためです。 
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
FLAG関数は0~62のフラグ番号を自由にONやOFFにしたりできます。 ONにするには1もしくはTRUE、OFFにするには0もしくはFALSEとします。 -1を指定すればONとOFFを入れ替えます。 例:A=0 変数Aの0~62のすべてのフラグをOFFにする。 例:A=FLAG(A,10,TRUE) 変数Aのフラグ番号10をONにする 例:B=FLAG(B,62,0) 変数Bのフラグ番号62をOFFにする。 例:C=FLAG(C,20,-1) 変数Cのフラグ番号20のONとOFFを入れ替える。 ※代入する変数と読み出す変数は必ず「同じ」変数にしてください。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
1つの実数型変数で63個のフラグ管理が可能になるFLAG、FLAGREAGのリストはこちらです。
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
DECIは2~16進数を10進数に変換できます。第2引数が変換元の進数になります。 なお特例として第2引数が0の時は符号無し2進数、1の時は符号付き2進数(補数)を示します。 小数で指定した時には補数となります。例えば補数で表した16進数(要するに負数)を10進数に変換したい場合負数は第2引数を16.1のように指定してください。 例:A=DECI(B$,1) 変数B$を補数表記の2進数として10進数に変換 例:A=DECI("FFFFFFFFFE",16.1) 補数表記の16進数として変換(Aの値はー2になる) 例:A=DECI("12345",3) 3進数ではあり得ないためエラーを返す DECI64は64桁で表記された実数型の2進数を実数に変換します。inf、nan対応 例:A=DECI64(B$) Aの値を正確に表示するにはPSTR$を使うと便利です。
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
10進数に変換するDECI、DECI64のリストはこちらです。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
BIN$は実数(整数値)を53桁までの2進数に変換できます。負数は補数で表記されます。 例:B$=BIN$(A,40) 変数Aの値を40桁の2進数に変換 BIN64$はinf、nan以外のすべての実数値を符号部1桁、指数部11桁、仮数部52桁、計64桁の2進数に変換します。 例:B$=BIN64$(0.1) (B$の値は0011111110111001100110011001100110011001100110011001100110011010になる)
0そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
2進数に変換するBIN$、BIN64$のリストはこちらです。
0そうだね
プレイ済み
投稿
おちゃめ ochame_nako
実数を2進数に変換する関数、N進数を10進数に変換する関数を作りました。 これを使って1つの実数型変数で63個のフラグ管理ができます。詳しくはコメントにて。
9そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
このバーとそれ以外の処理を合わせて1フレーム以内に処理が完了するならばGCLSでちらつくこともありません。 数フレームの重い処理ならばダブルバッファリングを使用すればちらつきません。
1そうだね
プレイ済み
返信[14]
親投稿
おちゃめ ochame_nako
配列変数の演算速度はNew3DSで試してみてもmkIIと比べて約6倍速少々でしたので旧3DSではmkIIの2倍程度になるでしょう。 ちなみにmkIIはA[0]=A[0}+1が約16300ナノ秒でした。(ループ回数が少ないので誤差がかなりあると思う)
0そうだね
プレイ済み
返信[13]
親投稿
おちゃめ ochame_nako
ワイヤーフレーム表示の場合は描画負荷が小さいので処理時間のほとんどが配列変数を使った演算です。 InDoorさんがプチコン3号を使っているのが旧3DSとはいえ私がプチコンmkIIで作ったものと比べても大して速くないのはプチコン3号では配列変数がボトルネックになっていると容易に予想が付きます。(プチコン3号は旧3DSでもmkII比の5~10倍の処理速度であるため) mkIIも配列変数は遅かったですが1.8倍程度の差で7倍も差があるプチコン3号ほどではありませんでした。
0そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
配列変数が遅いというのは旧来のBASICでもそうでしたがプチコン3号ほど極端な違いはありませんでした。 旧来のBASICでは三角関数が遅く配列変数に事前に演算結果を入れてそれを参照するテーブル化はポピュラーな高速化テクニックでしたが、プチコン3号は配列変数の読み出しよりも三角関数はそのまま計算した方が高速なんですよね(笑)
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
ゆうたんさんへ プチコン3号は実行時に仮想マシンコードに変換しているとのことです。 構文解析もその時行っているため実行されない行のSyntax errarも検出されてしまいます。 ちなみにA%[B%}=A%[B%}+1は2412ナノ秒でした。配列の読み出しそのものが遅いため整数化しても微々たる高速化しかできません。
0そうだね
プレイ済み