プレイ日記
PianoRider pianorider
ここ数日間、『プチコン3号まとめWiki』というサイトの「プチコン3号&BIG 非公式初心者講座」という特集を、頭から湯気が出るほど(笑)熟読しておりますw その成果が出ました☆ 先日の投稿で目標に定めた“足し算&引き算ゲームを、GAMEPADのボタンに対応させる”プログラムを作ることができました♪ 2つの数字を入力し、Aボタンを押すと足し算の答えが。Bボタンを押すと引き算の答えが表示されます。 コメントにてEDIT画面を載せてみようと思います♪
41そうだね
プレイ済み
返信[1]
親投稿
PianoRider pianorider
この写真・・・大画面のTVでも文字が読みにくいですねw それで、少し問題がありまして・・・続く。
4そうだね
プレイ済み
返信[2]
親投稿
PianoRider pianorider
Bボタンで引き算をしたときは問題ないのですが、Aボタンで足し算をしたときに、OKが複数回表示されてしまいます。 これを回避する方法はあるのかしら・・・。
4そうだね
プレイ済み
返信[3]
親投稿
ねこはち neko800_2
ざっとリストを見たところ、OKが2回出るのはBUTTON関数とVSYNCがセットになっていないために、プログラム終了直後にもう一度Aボタンを押したことになっているためですね。
2そうだね
プレイ済み
返信[4]
親投稿
PianoRider pianorider
ねこはちさん、ご教授をありがとうございます! 実は VSYNC 6 で、やってみたのですが結果は同じだったので削除してしまいました。 もっと長く設定すればAボタンの連打が防げる、ということですよね? 明日やってみます♪
2そうだね
プレイ済み
返信[5]
親投稿
ねこはち neko800_2
最初のVSYNCは無視されるのでCLSやACLSの直後に一つ置きます。 プチコンは、実際にVSYNCの長さで指定した待ちが入るのは2個目のVSYNCからになる仕様みたいです。 たぶんpianistさんの場合、これが原因っぽいので、VSYNCの長さは変える必要はないと思います。
2そうだね
プレイ済み
返信[6]
親投稿
ボタン開放を待ってからプログラムを終えるのも良いです WHILE BUTTON():VSYNC:WEND ここのVSYNCは負荷軽減くらいしか意味無いけどあったほうが良さそう
4そうだね
未プレイ
返信[7]
親投稿
PianoRider pianorider
ねこはちさんのアドバイス通りにVSYNCを入れてみました。 RUNしてみましたが、感覚的には入れても入れなくても変化がないように感じました。Aボタンを一瞬で離せばVSYNC有り無しに関わらずOKは一回で済むようです。 すみません、まだまだ解らないことだらけです(^^;)
1そうだね
プレイ済み
返信[8]
親投稿
PianoRider pianorider
あまさと しおんさん、ご教授をありがとうございます! アドバイス通りの命令を入れてみました。しっかりとプログラムが終わった感じがしまして、OKも一回ですみました。 まだ使ったことがない命令なのでよく意味が解りませんが、勉強を続けていく過程で覚えていきたいと思います(^^)
2そうだね
プレイ済み
返信[9]
親投稿
ねこはち neko800_2
26行目、27行目のVSYNCを消して、GOTO @LOOPの直前に一個VSYNCを入れましょう。 今の状態では、ボタンを押した後にしかVSYNCが実行されていないので、BUTTON関数が正しく動作していないのです('ω')
1そうだね
プレイ済み
返信[10]
親投稿
PianoRider pianorider
そうすると、26行目、27行目のENDを消さなくてはなりませんよね? それで、消してみたところプログラムが終われなくなりました(あたりまえなのでしょうね・・・)。終わらないのでOKの表示もなくなったのですが・・・これでいいのでしょうか?
2そうだね
プレイ済み
返信[11]
親投稿
ねこはち neko800_2
ENDを消す必要はないです。 ENDとVSYNCは対ではないので、ENDはどこにどんな形で存在しても問題ないからです。 @LOOP IF C==16 THEN (略) VSYNC:END ←このVSYNCはループの通り道にないので終了直前まで実行されていない VSYNC ←このVSYNCはループの通り道にあるので実行される GOTO @LOOP VSYNCは「前回のVSYNCから一定時間が経過していなければそのタイミングまで待つ」という命令なので、CLS直後のVSYNCが実行されてから数値を入力しているあいだにそのタイミングが過ぎてしまうと、IFの後に書いても「待ち」が入らないので、pianistさんが最初にVSYNC 6などを試した時に無効になっていたのです。
2そうだね
プレイ済み
返信[12]
親投稿
ねこはち neko800_2
こんな感じです
2そうだね
プレイ済み
返信[13]
親投稿
PianoRider pianorider
わざわざ同じプログラムを打ち込んでいただいて、ありがとうございます。 これだと、AボタンやBボタンを押したときに(ENDがあるので)プログラムが終了になってしまい、GOTO @LOOPの前のVSYNCは通らないのでは?・・・と思ってしまいました。 そしてこれをRUNさせると、やはりAボタンが連打されOKが複数出てしまいます。 色々無知で、申し訳ありません。
2そうだね
プレイ済み
返信[14]
親投稿
ねこはち neko800_2
では、26行27行のVSYNC 1をWAIT 8に変えましょう。 ボタンリピートの設定は人によって違うので、WAITならば8/60秒は確実に待つので、押しっぱなしにしなければ連打にはならないはずです。 連打が問題の場合、なぜ「意図しない箇所で連打」になるのかを考えた方が良いと思います。 pianistさんのプログラムの場合、「IFの条件分岐のタイミング」が挙動の不安定につながっています。 ループ中にVSYNCがなく、BUTTON(1)のキーリピートが3の場合、おおざっぱに0.01/60~2.99/60のどのタイミングで「IFの条件分岐」が実行されるかがボタンを押した瞬間に任されてしまうので、終了判定直下に次のキーリピートのタイミングがきた時に「ダイレクトモードでAを押した」となってしまい、結果、OKが二つ表示されてしまうのです。
2そうだね
プレイ済み
返信[15]
親投稿
ねこはち neko800_2
これを防ぐにはあまさとさんのように「ボタンを離さなければ次に進まない」とするか、「一連の処理を次のボタン判定に間に合わせる」かのどちらかになり、私の場合は後者の処理を説明していました。
2そうだね
プレイ済み
返信[16]
親投稿
PianoRider pianorider
ねこはちさん、色々教えてくださりありがとうございます。理解できるところもあれば、まだ私には理解できない部分もあります。これからも勉強を続ければきっと解ってくると思っています。 『ボタンを対応させたプログラムを作る』という目標が果たせたので、少し先へ進んでみようと思います。またアドバイスをいただけると嬉しく思います。 m(_ _)m
3そうだね
プレイ済み
返信[17]
親投稿
おちゃめ ochame_nako
VSYNCとWAITの使い分けはプチコン3号の前のプチコンmkIIから使っている人でも出来てない人が多いのですが、実際はすごくシンプルで「待たないと困る処理はWAIT」「待ちすぎると困る処理はVSYNC」を入れると簡単に使い分けができます。 今回のようなボタン入力処理の場合は一定時間待つことで改善が可能ですが、VSYNCでは「指定時間待つ」ということが保証されない(ねこはちさんもかかれているように前回のVSYNCからの経過時間となるため)ということで確実に待って欲しい処理にはWAITがベターということなのです。
3そうだね
プレイ済み
返信[18]
親投稿
おちゃめ ochame_nako
WAITは確実に待つため例えば30fpsで動作するゲームに処理時間を一定に保つためWAIT 2を入れるとWAITだけで2フレームとなるため30fpsでの動作保証はできなくなります。 その点、VSYNC 2は前回のVSYNCから2フレーム経過するまで待つため(処理落ちしている場合を除き)30fpsが保証されます。
2そうだね
プレイ済み
返信[19]
親投稿
おちゃめ ochame_nako
ちなみに60fpsで動作しているプログラムのメインループに入れる場合はWAIT 1とVSYNC 1ではほぼ同じ動作となります。 「ほぼ」というからには全く同じということはなく異なる部分もあるわけですが、ループ内で初回に実行されるVSYNCはスキップされる可能性があるのに対してWAITは初回時でもスキップされないためです。普通のゲームならば最初の1フレーム目の動作を見分けることは困難であるためどちらを使ってもかまいません。 とはいえ、「メインループ」であれば「待ちすぎたら困る処理」であるので「ほぼ同じ」ということを理解して意図的にWAITを入れる場合を除きVSYNCの方がベターです。
2そうだね
プレイ済み
返信[20]
親投稿
PianoRider pianorider
おちゃめさん、詳しい説明をありがとうございます! 内容全てを理解するには、まだまだ勉強不足な私です。この先きっと、このアドバイスを思い出してまた読み返す日がくると思います(^-^) ツイッターでお見かけしたのでフォローさせていただきました♪
0そうだね
プレイ済み
返信[21]
親投稿
この投稿を見て、そのサイトを知って僕も勉強してます!ありがとうございます!!
1そうだね
プレイ済み
返信[22]
親投稿
PianoRider pianorider
backnumberさん、コメントをありがとうございます! 共に頑張りましょう(^^)/
0そうだね
プレイ済み