投稿
bigslope bigslope
引き続き、暗黙の了解との戦い。BUTTON(1)関数は、『ボタンが押された瞬間だけ』という説明があるのに、実際にやってみると、1回押しただけなのに、10回位連続で押されたと判定される。こんなんじゃ、最初からBUTTON(0)を使って、自前で押された/離されたの管理をした方がマシじゃん…と思っていたが、VSYNC命令を入れたら、ちゃんと動くようになった。
5そうだね
プレイ済み
返信[1]
親投稿
なるほどー。VSYNCは暗黙の了解ですね。 とりあえず1はキーリピート付きなので、本当の意味で押した時にしたいのであれば2にしておいた方がいいですね。
0そうだね
プレイ済み
返信[2]
親投稿
bigslope bigslope
当たり前のようにVSYNC命令を入れている人は気付いていないと思いますが、VSYNCをコメントアウトすると、こうなっちゃいます。多分、垂直同期と連動してボタンの取得をしているのね。 ちなみに、昔のBASICは、画面の描画速度が遅く、垂直同期待ちという概念自体、ほとんど無いような状態でした(マシン語だと処理が高速になるので、垂直同期待ちを考える必要が出てくる)。
0そうだね
プレイ済み
返信[3]
親投稿
bigslope bigslope
ついでにもうひとつ、BREPEAT命令は、未使用(10)のボタンに対して設定しようとするとエラーになる。ダミーで良いから設定出来ても良かったかなあ。
0そうだね
プレイ済み
返信[4]
親投稿
けい kei0baisoku
豆知識程度ですが……… 「ボタンが押された瞬間だけ」という仕様にするならば、何らかの方法で「瞬間」が具体的にいつからいつまでかを定義する必要があります。「時間」は切れ目のないアナログ的な概念なので。 ゲームの環境ではフレームが時間管理の単位なので「1fの間だけ」を「瞬間」の定義にするのが一番自然な考え方です。 それで、1fは垂直同期から垂直同期までなので、結果的におっしゃる通りの振るまいになります。 と書いて気が付いたのですが、VSYNC 2 で30fpsにしてる人はどうなるんだろ?困るんじゃないかな。
0そうだね
プレイ済み
返信[5]
親投稿
mkiiの頃からこの事は知っていましたが、何故VSYNCが必要なのかが疑問ですね。
0そうだね
プレイ済み
返信[6]
親投稿
bigslope bigslope
垂直同期云々というのは、画面表示側の理屈というだけであって、あくまでボタンの方は、垂直同期に関係なく、読みに行けば常にその時の状態を返してくれる方が自然だと自分は思うんですけどね(少なくともX68000はそういうハードでした)。 …もしかして、3DSのハードウェア的にそういう仕様なのかなあ? 例えば、『ボタンの状態が読めるのは垂直帰線期間のみであり、垂直表示期間は読めないので、その間はボタンの状態変化が分からない為、仕方なく同じ値を何度も返している』…みたいな事情があったりするとか。 DSiで動くMkIIもそうだったとすると、何か、そういうようなハード上の制約に縛られているような気もしてきます。
0そうだね
プレイ済み
返信[7]
親投稿
けい kei0baisoku
1フレームの開始がVSYNCなのは、ゲームの常識だからというだけかもしれませんね。他に適切な基準も無さそうですし。 逆に私、ゲームの環境しか知らないのでそういうのはサンプリング方式で実現されてると思ってたのですが、X68000では関数を呼ぶ度にリアルタイムにハードウェアにアクセスしていたのでしょうか?(°O°) すごく重そうなイメージなので、どうやっていたのか気になります。 ボタンとかハードウェアの状態取得がサンプリング方式だと言う前提で考えると、特に違和感は無くなるのではと思います。
0そうだね
プレイ済み
返信[8]
親投稿
けい kei0baisoku
と言うより、同じフレームなのに関数を呼ぶ度に値がコロコロ変わっていたら、すこぶる使いづらいと思います……… ↓のプログラムで1回目と2回目のIF文でBUTTON()が返す値が違う、と言われると「なんでやねん(°Д°)」とツッコミたくなるのも直感的に分かると思います。 @LOOP 'キャラの左右移動 IF BUTTON() AND 4 THEN 左へ IF BUTTON() AND 8 THEN 右へ : @GOTO @LOOP
0そうだね
プレイ済み