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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0626
ときたまごものすごく単純なはずなのに動きません9解決


ときたまご

リンク

2009/6/26(Fri) 23:26:54|NO.26038

私は初心者なので練習としてHSP3.1でシューティングを作ってみているのですが
キー操作の部分が上手く動きません

stick ky,15 if (ky&1)&(px> 0) : px-=pspd //左 if (ky&2)&(py> 0) : py-=pspd //上 if (ky&4)&(px<640) : px+=pspd //右 if (ky&8)&(py<480) : py+=pspd //下
(px,py,pspdはx座標,y座標,速度を表しています)
上記の条件文が何故か上手く動いてくれません
二つ目の条件文がどういうわけか誤作動して
全てをはじいてしまっているようです
二つ目の条件文を無関係な別の物に変えてみても結果は変わらず
二つ目の条件分を消してみると正常に動作します
不思議な事に一行目の条件文だけは正常に動きます

こんな単純な文章が何故動かないのかさっぱり分かりません
これは一体どういう現象なのでしょうか
それとも私が何かとてつもない間違いを犯しているのでしょうか
OSはウィンドウズXPSP3です



この記事に返信する


ぼおん

リンク

2009/6/26(Fri) 23:48:06|NO.26039

(ky&1)&・・・

((ky&1)!0)&・・・
以下同

実は私も同じ失敗をした事があります(笑)



774

リンク

2009/6/27(Sat) 00:03:56|NO.26040

僕の考え方は間違っている可能性が高いので、指摘・追記お願いします。

IF命令は『判定が1つのみである場合』省略書きをすると『0以外なら何でも』Trueと見なします
a=5
if a:mes"てすと1番" if a=5:mes"てすと2番" a=-4 if a:mes"てすと3番" if a=5:mes"てすと4番"
処理が2つ以上になると省略書きは『答えが1の時のみ』Trueと見なします
a=5:b=3
if (a)&(b=3):mes"てすと5番" if (a=2)&(b=3):mes"てすと6番"

また、pxをpyを自由に動かした後
px=LIMIT(〜)で制限をかけてもいいかもしれません。お好みで。



774

リンク

2009/6/27(Sat) 00:05:53|NO.26041

眠かったんですごめんなさいッ

if (a=2)&(b=3):mes"てすと6番"→if (a=5)&(b=3):mes"てすと6番"
判定が1つのみである→判断が1つのみである
処理が2つ以上→判断が2つ以上



SYAM

リンク

2009/6/27(Sat) 00:24:15|NO.26043

&は、2つの条件が両方成り立っている、ということを表すものではないことに注意してください。
&は ビット演算をする演算子 です。

ですから、
ky=2 のとき、 (ky&2) の結果は 2 です。
px>0 のとき、 (px>0) の結果は 1 です。

2 & 1 の計算結果は 0 ですから、if の条件の式の値は 0 、つまり偽になってしまっているのです。



ANTARES

リンク

2009/6/27(Sat) 00:55:31|NO.26045

>処理が2つ以上になると省略書きは『答えが1の時のみ』Trueと見なします
 これは誤り。
比較や論理演算を含め、すべての演算には結果としての値があります。
ifは演算結果が0でないとき真、0のとき偽と判定します。

例えば
>if a
a=5
0でないので真です。

>if (a)&(b=3)
a=5, (b=3)=1
((a)&(b=3))=(5&1)=1
0でないので真です。

>if (a=2)&(b=3)
(a=2)=0, (b=3)=1
((a=2)&(b=3))=(0&1)=0
0なので偽です。

>if (ky&1)&(px> 0)
・ky&1=1かつpx>0のとき
(ky&1)=1, (px> 0)=1
((ky&1)&(px>0))=(1&1)=1
0でないので真

・ky&1=0かつpx>0のとき
(ky&1)=0, (px> 0)=1
((ky&1)&(px>0))=(0&1)=0
0なので偽

(px<=0の場合は略)

>if (ky&2)&(py> 0)
・ky&2=2かつpy>0のとき
(ky&2)=2, (py>0)=1
((ky&2)&(py>0))=(2&1)=0
0なので偽

・ky&2=0かつpy>0のとき
(ky&2)=0, (py>0)=1
((ky&2)&(py>0))=(0&1)=0
0なので偽



ANTARES

リンク

2009/6/27(Sat) 01:09:39|NO.26046

(5&1)=1
というのと
(2&1)=0
がわかりにくいと思うので解説します。

5=%101 & 1=%001 -------- %001=1 2=%10 & 1=%01 ------- %00=0



GENKI

リンク

2009/6/27(Sat) 01:37:21|NO.26047

よくあるケースですね。

たくさん回答ありますが、ANTARESさんの解説がもっとも適切だと思います。
具体的な対策としては、ぼおんさんの方法がよいと思います。

ビット演算についてもっと知りたい場合は、こちらをご利用ください。
http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%A5%D3%A5%C3%A5%C8%C1%E0%BA%EE



ときたまご

リンク

2009/6/27(Sat) 07:31:47|NO.26049

> ぼおんさん
> 774さん
> SYAMさん
> ANTARESさん
> GENKIさん
stickのサンプルスクリプトは不完全な表記だったのですね
お陰で"&"の働きを正しく理解することが出来ました
みなさんありがとうございましたm(_ _)m



ヒロ

リンク

2009/8/10(Mon) 19:06:30|NO.26981

これってifをネストさせても意図どおり動きますよね。
stick ky,15
if ky&1:ifpx> 0 : px-=pspd //左
if ky&2:ifpy> 0 : py-=pspd //上
if ky&4:ifpx<640 : px+=pspd //右
if ky&8:ifpy<480 : py+=pspd //下

そういうわけで774さん言うようにIF命令は『判定が1つのみである場合』省略書きをすると
『0以外なら何でも』Trueと見なします のとおりですね。
私も勉強になりました。



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