プレイ日記
カムイ 26427iku
誰か助けて下さい!!上下移動がよくわからないために、なんとなくでやったら斜め移動になってしまいました…プログラムを載せるので、どうすればいいか教えてください!
5そうだね
プレイ済み
返信[1]
親投稿
A=BUTTON() B=BUTTON() なんでこうなったのだろうか?
2そうだね
プレイ済み
返信[2]
親投稿
ぴくと kanau1203
AとBは値は一緒ですよね x方向の加算とy方向の加算同時に行えば斜めに移動するのは想像がつきます
1そうだね
プレイ済み
返信[3]
親投稿
ΖΕΧ ZEX256
ボタンはOFF/ONの状態があり、複数のボタンを1つの値に詰め込んだ情報をBUTTON()関数で取得するのです。 ボタンの情報を使いこなすには、2進数の知識が必要になります。 2進数について説明しましょう。 まず、人が普段使う数値を10進数と呼びます、これは1つの桁が 0~9 の10通りの表現があるからです。 2進数は、1つの桁を 0、1 の2つのみの数値で表します。
1そうだね
プレイ済み
返信[4]
親投稿
ΖΕΧ ZEX256
2進数で 0+1=1 となり、10進数と同じ表現ですが、2進数で 1+1=10 となり桁上りします。 2進数の 10 は、10進数の 2 と同じ意味になります。 プチコン3号では2進数を使用できます。 書き方は2進数の前に &B を付けるのです。 ? &B10 2 OK この例では2進数の10を数値(10進数)としてPRINTしたものです。
2そうだね
プレイ済み
返信[5]
親投稿
ΖΕΧ ZEX256
2進数1桁のことをビットと呼びます。 余談:3DSのCPUは32ビットですので、2進数32桁を一度に計算できるのです。 他に16進数という表現もあります、2進数と親和性が高く、よく使われます。 BASICでは16進数を使用できます。 書き方は16進数の前に &H を付けるのです。 ? &H10 16 OK この例では16進数の10を数値(10進数)としてPRINTしたものです。
2そうだね
プレイ済み
返信[6]
親投稿
カムイ 26427iku
ありがとうございます!
0そうだね
プレイ済み
返信[7]
親投稿
ΖΕΧ ZEX256
B=BUTTON() これはボタン操作の結果を変数 B に取り出すコードです。 十字ボタンを操作した時の変数 B の値がどうなってるのか見てみましょう。 何もボタンを押さない時 B は 0 です、これはビットで考えると (&B0000) です。(2進数下位4ビットのみ表現) [→]ボタンを押した時 8 (&B1000) [←]ボタンを押した時 4 (&B0100) [↓]ボタンを押した時 2 (&B0010) [↑]ボタンを押した時 1 (&B0001) 1 が立っているビットが十字ボタンの各ボタンのビットです。 斜めに押すと、複数のビットが同時に立つ(1になる)のです。
2そうだね
プレイ済み
返信[8]
親投稿
ΖΕΧ ZEX256
おい、それだけで解ったつもりになるな
1そうだね
プレイ済み
返信[9]
親投稿
ΖΕΧ ZEX256
これだけでも、1つのボタンのOFF/ONは判定可能だ。 イコール判定すればできる。 WHILE 1 WAIT B=BUTTON() IF B==&B0001 THEN ?"↑" IF B==&B0010 THEN ?"↓" IF B==&B0100 THEN ?"←" IF B==&B1000 THEN ?"→" WEND だが斜め方向に押した場合や、他のボタンを同時押しした場合、途端にTHEN文が実行されなくなる。 複数のボタンが押された場合でも、該当ボタンのOFF/ONを判定したければ、ビット演算が必要になる。
0そうだね
プレイ済み
返信[10]
親投稿
ΖΕΧ ZEX256
ビット演算にはAND、OR、XOR、NOTなどがあります。 今回複数の(ボタン)ビットのうち、特定のビットのみを取り出したい。 その場合、AND (論理積)を使用します。 B AND &B0001 これは 変数B と &B0001 のAND演算を行う計算式です。 ANDというのは、2つの値の同じ桁のビットが、両方とも 1 の場合、計算結果 1 となり、 どちらか片方が 0 の場合、計算結果は 0 となる演算です。 筆算だと 0011 0101 ------ 0001
0そうだね
プレイ済み
返信[11]
親投稿
ΖΕΧ ZEX256
WHILE 1 WAIT B=BUTTON() IF (B AND &B0001)!=0 THEN ?"↑" IF (B AND &B0010)!=0 THEN ?"↓" IF (B AND &B0100)!=0 THEN ?"←" IF (B AND &B1000)!=0 THEN ?"→" WEND この例では、(B AND &B0001)などのAND演算した計算結果が 0 でなかった場合、THEN文が実行されます。 つまり、特定ボタンのビットのみを取り出し、そのボタンが押されたかを判定しています。 これで斜め押しや、他のボタンとの同時押しした場合でもTHEN文を実行できるようになりました。
0そうだね
プレイ済み
返信[12]
親投稿
ΖΕΧ ZEX256
これを簡略化してみます。 WHILE 1 WAIT B=BUTTON() IF B AND &B0001 THEN ?"↑" IF B AND &B0010 THEN ?"↓" IF B AND &B0100 THEN ?"←" IF B AND &B1000 THEN ?"→" WEND IF文などの判定式では、実は「0以外か」という判定をするものなので、( )!=0 という条件式は省略できます。
0そうだね
プレイ済み
返信[13]
親投稿
ΖΕΧ ZEX256
更に簡略化してみます。 WHILE 1 WAIT B=BUTTON() IF B AND 1 THEN ?"↑" IF B AND 2 THEN ?"↓" IF B AND 4 THEN ?"←" IF B AND 8 THEN ?"→" WEND 2進数は10進数で書くことも当然できるので、10進数で書いたほうが短いです。
0そうだね
プレイ済み
返信[14]
親投稿
ΖΕΧ ZEX256
あなたが書いていたANDを使った判定式はこういう意味だったのです。
0そうだね
プレイ済み
返信[15]
親投稿
ΖΕΧ ZEX256
ボタンのビット値を書いても、どのボタンか判り難いですよね。 そこで、プチコン3号の新しめのバージョンでは、ボタンのビットを表す定数値が用意されました。 WHILE 1 WAIT B=BUTTON() IF B AND #UP THEN ?"↑" IF B AND #DOWN THEN ?"↓" IF B AND #LEFT THEN ?"←" IF B AND #RIGHT THEN ?"→" WEND この書き方をした方が、後でプログラムを読むとき、解りやすいです。 以上です。
1そうだね
プレイ済み