トピック
STiNGER STiNGER8901

十字キー操作で右と左の操作が違う。

この画像のような、IFを使わない書き方だと、右と左で移動速度が変わってしまうのですが、式を二つに分けたりするしかないでしょうか。
0そうだね
プレイ済み
返信[1]
親投稿
よっぱらい yopparai1965
(b and 8)等の式をもう一段深く((b and 8) != 0)としてみては?
2そうだね
プレイ済み
返信[2]
親投稿
STiNGER STiNGER8901
よっぱらい様 これでうまくいきました。ありがとうございます。
0そうだね
プレイ済み
返信[3]
親投稿
ΖΕΧ ZEX256
X=X+(1AND B>>3)-(1AND B>>2)
2そうだね
プレイ済み
返信[4]
親投稿
それですが、B AND 4と書くと 返す値が1ではなく「4」を返すようになります。 つまり移動量が4になり、反対側は8となる訳です。 なので!=0で無理に1を返すようにしてる、と。 私も同じ事で悩んだ事がありますので。
2そうだね
プレイ済み
返信[5]
親投稿
STiNGER STiNGER8901
なるほど、ボタン操作の時は考えを変えないといけないわけですね。 うえこうさんのやり方がスッキリしていていい感じ。
0そうだね
プレイ済み
返信[6]
親投稿
GRS grs8001
X=X+((B AND 8)/8-(B AND 4)/4) 右を押した場合 (B AND 8) -> 8 [8が加算される] 左を押した場合 (B AND 4) -> 4 [4が減算される] なので、8 加算を 1 加算にするために 8 で割る 判定式の下に ? (B AND 8);" ";(B AND 4) を、書けば良く解りますよw 個人的には論理式系の演算はバグの温床になりかねないので… (システムやCPUによって結果が異なることがあるので余りお勧めしないです) Z-80脳な人なので難しい事は不得意です(^^;
2そうだね
プレイ済み
返信[7]
親投稿
ΖΕΧ ZEX256
除算は効率悪いのでビットシフトを使う アセンブラ使わない人には解らないだろうけど
3そうだね
プレイ済み
返信[8]
親投稿
SquidSky ugomemo_gorohati
K=BUTTON() MY=MY-(K AND 1)*2+(K AND 2) MX=MX+(K AND 8)/4-(K AND 4) MY=MY-(MY>212)*2+(MY<-12)*2 MX=MX-(MX>376)*2+(MX<0)*2
0そうだね
プレイ済み
返信[9]
親投稿
SquidSky ugomemo_gorohati
この方法では、*2の部分を*1や*5にすれば移動スピードを変えられます。
0そうだね
プレイ済み
返信[10]
親投稿
誰か論理反転どぞ X=X+!(4AND B)-!(8AND B) 4と8が入れ替わるのがミソね
3そうだね
プレイ済み
返信[11]
親投稿
二進数の11→110なら、 3<<1ですね。 <<がどっちにシフトしてるかの矢印みたいなイメージです。
3そうだね
プレイ済み
返信[12]
親投稿
字数削りの観点から言うと演算子の後ろの数が1桁なら/、多ければビットシフト。
1そうだね
プレイ済み
返信[13]
親投稿
ちなみに個人的にはわかりやすさとのバランスを考えて、 X=X+(((B AND 8)>0) - ((B AND A)>0)) * 4 ぐらいにしておくかなぁ? ちなみにわかるとは思いますが4は移動量(スピード)です。
2そうだね
プレイ済み
返信[14]
親投稿
Aは4の間違いです…
2そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
左右移動の計算式は思いつくだけでも20通り以上ありますがどれを使っても問題はありません。 自分のプログラムに適したものや自分で理解しているものを使えば良いだけです。 例えば右方向移動が2倍速くなるというのが分かっているならばX=(B AND 8)/2-(B AND 4)とすれば良いということです。なぜ、2倍速くなるのかはB AND 8は0(右を押してない場合)か8(押した場合)の値を返し、B AND 4は0(左を押してない場合)か4(押した場合)の値を返すためです。
2そうだね
プレイ済み
返信[16]
親投稿
STiNGER STiNGER8901
ビットシフトに真偽反転、役に立つ技を覚えることができました。 皆さんありがとうございました。 では、これにて。
1そうだね
プレイ済み