HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0125
ペスif条件文の表現について2解決


ペス

リンク

2021/1/25(Mon) 10:07:37|NO.92148

久しぶりにゲームプログラミングをしています。
その過程で少々躓いた箇所がありまして、結果的には無事コードの修正を終えたのですが、
最初に書いたコードがなぜ思った通りに機能しないのかが理解できないのです。
これが理解できないと、今後似たような状況が何度も起こり得る為、きちんと理解しておきたいと思いました。

自分的にも今さら感がある質問なだけに、理由が分からないのが悔しいんですが。
わかるように説明できる方、優しく教えて頂けると嬉しいです。
よろしくお願いします。


37行目の『//コマンド選択』とコメントがある行の、次の行になります。
思い通りに機能しなかった行は38行目で、コメントアウトしています。



*GameLoop redraw 1: redraw 0: await 1000/60 //クリア color 50,50,50: boxf //デバッグ表示 color 255,0,0: pos 250,250: mes "scene = "+scene color 255,0,0: pos 250,270: mes "command_index = "+command_index switch scene case 0 //デバッグ表示 color 255,0,0: pos 250,200: mes "シーン1 //ウィンドウ color 255,255,255: boxf 200,300,500,400 color 0,0,0: boxf 202,302,498,398 color 255,255,255: pos 270, 320: mes "シーン1" color 255,255,255: pos 270, 350: mes "シーン2" //カーソル cursor 250,330+command_index*28 //カーソル操作 stick key if key&2: command_index-- if key&8: command_index++ //限界補正 if command_index<0: command_index=0 if command_index>1: command_index=1 //コマンド選択 ; if (key&32) & (command_index==1) : scene=1 ; ← この行がなんで正常に機能しないのか、わからないです! if key&32 { if command_index == 1: scene=1 } swbreak case 1 color 255,0,0: pos 250,200: mes "シーン2 swbreak swend goto *GameLoop #deffunc cursor int _x, int _y grad_ary=$ffff07,$ffff07,$8c5202,$8c5202 cur_x=_x+10,_x+10,_x-10,_x-10 cur_y=_y,_y,_y+8,_y-8 gsquare gsquare_grad,cur_x,cur_y,grad_ary return



この記事に返信する


Velgail

リンク

2021/1/25(Mon) 10:44:44|NO.92149

> (key&32) & (command_index==1)
計算しましょう。(下記の値については、mes命令を利用して一つずつ見ていくと理解が深まりますよ)
32のkeyが入力されているかの判定に使ったとして、例えばkey=35とします(注:Trueになるなら何でも良い)
このとき、(key&32)の値は「32」となります。
次に(command_index==1)の値は、Trueのとき「1」、Falseのとき「0」となります。

両方が同時にTrueの場合、この条件式は (32 & 1)となりFalseとなります。

回避方法は、((key&32)==32)と書くことです。こうするとTrueのとき「1」、Falseのとき「0」となり、command_index==1と同じ値のルールに乗ります。

別解として
if (key&32):if(command_index==1){
//処理
}
も可です。



ペス

リンク

2021/1/25(Mon) 10:59:34|NO.92150

回答ありがとうございます!

どうやらkey&32の意味をはき違えて理解していたのが原因のようですね。
前からずっと、key==32だったらわかりやすいのに、と思ってました。
でも、stick命令は複数の値を同時に抽出できるようになってる仕組み上仕方ないんだと思ってました。

key&32はたしかビットで格納されているんですよね。

key&32 が True というのは key==32 と 同じだと思ってました。
正しい意味が理解できました。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.