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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0826
かに味チョコgetkey2解決


かに味チョコ

リンク

2007/8/26(Sun) 01:51:25|NO.10679

皆さん始めまして。
最近HSPの存在を知り、プログラミングを始めた者です。

いきなりですが質問があります。
getkeyで矢印キーを取得して以下のプログラムを組んだのですが、思うように行きません。

 	#define DMyX 7 //X移動 速度
#define DMyY 7 //Y移動 速度 buffer 1 picload "a.bmp" buffer 2 picload "b.bmp" screen 0,700,430,0,200,20 gmode 2 anc = 0 //メインループ *main redraw 0 gcopy 2,0,0,700,430 gosub *my redraw 1 await 20 goto *main *my pos x,y gcopy 1,0+(anc*90),0,90,115 getkey a,37:getkey b,39:getkey c,38:getkey d,40 if (a&37)=1:x = x - DMyX: anc = 0 if (b&39)=1:x = x + DMyX: anc = 1 if (c&38)=1:y = y - DMyY if (d&40)=1:y = y + DMyY return

"→"と"←"は、キーボードに反応して動いてくれるのですが、
"↑"と"↓"は動いてくれません。
まったく予想していなかった所で足止めを食らい、とても困っています。
プログラムや用語など、まだ勉強中の段階ですので見苦しいところもあると思いますが
どうかご指摘お願いいたします。



この記事に返信する


.Hrk

リンク

2007/8/26(Sun) 02:40:09|NO.10682

多分getkey命令とstick命令の動作を勘違いされているのだと思います。


stick命令は、ヘルプに書かれているようなキーに対応した数が、それぞれ押されている
場合に指定した変数に代入されますが、

getkey命令は、二番目の引数で指定したキーが押されている場合に変数の内容が1、押さ
れていない場合に0になります。


上のソースの場合、
<font color="#008000">
if (a&37)=1:x = x - DMyX: anc = 0 if (b&39)=1:x = x + DMyX: anc = 1 if (c&38)=1:y = y - DMyY if (d&40)=1:y = y + DMyY </font>
の部分に注目すると、a,b,c,dそれぞれの変数が各キーコードの値と"ビット演算"され、
その結果が1と同値かどうか判定しています。

これを、以下のように修正することで、意図した動作をすると思います。

if (a == 1) : x = x - DMyX : anc = 0 if (b == 1) : x = x + DMyX : anc = 1 if (c == 1) : y = y - DMyY if (d == 1) : y = y + DMyY
あと、ついでですが、上記のコードはさらに次のように書くことが出来ます。

if (a == 1) : x -= DMyX : anc = 0 if (b == 1) : x += DMyX : anc = 1 if (c == 1) : y -= DMyY if (d == 1) : y += DMyY
"x = x + DMyX" と "x += DMyX" は同じ動作をあらわしています。
慣れてくると、タイプする文字数が少ない分、+=や-=を使った方が若干速くコード
を書くことができます。最初のうちは混乱するかもしれませんが、ある程度HSPに
慣れたら使うとよいと思います。

あともう一つですが、サンプルソースを載せるときは、サンプル内で使っている画像
に関する情報(例えば、"a.bmp"は90x115の大きさのキャラクターの画像だ)等をあわせ
て書いておくと、読む側の人がプログラムを再現しやすいと思います。


以上、長々と書いてしまいましたが、何か分からない点があれば質問をどうぞ。



かに味チョコ

リンク

2007/8/26(Sun) 07:26:20|NO.10684

"ビット演算"と言う言葉を調べて、間違いを理解することが出来ました。
0か1が代入される変数とキーコードを比較するのは確かにおかしいですね・・・(^-^;)
stick命令と似ていたので、同じ方法で出来ると思っていました。
似ているようで、まったく違うのですね。

簡潔にプログラムを書く豆知識、読み手に親切なサンプルソースの書き方など
とても勉強になりました。

丁寧な回答ありがとうございました。



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