ページ 1 / 1
画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月03日(木) 21:46
by コーヒー牛乳
初めてこの掲示板を利用させていただきます
ゲームプログラミングに興味をもって一年ほど前からC++の入門書(やさしいC++第3版)に手をつけていて
挫折を繰り返しつつも何とかプログラムを動かすことが出来るようになったのでdxライブラリを導入してみました。
そこで最近作ったのが画面に表示した点をクリックした座標まで移動させるプログラムなのですが
実際に動かしてみると、クリックした座標の手前で点が止まってしまうことがあります。
どこを直せばクリックで得た座標まできちんと移動するでしょうか?
他にもプログラムに無駄な所や間違っているところがあれば指摘を頂けると幸いです
※
申し訳ありません、コードを貼り付けようと思ったら
「投稿が禁止されている単語が見つかりました。」という表示が出てしまいました。
禁止されている単語がどこに含まれているのか見付けることが出来なかったので
ファイルを添付させていただきます。
・・・・・・cppっていうので良いんでしょうか?
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月03日(木) 22:27
by h2so5
角度によってはX座標やY座標(の整数値)が先にクリック位置に到達してしまい、移動が止まってしまいます。
if((int)BoxX != MouseX && (int)BoxY != MouseY)
のようにまとめてしまわないで、X座標Y座標の一致を個別にチェックした方がよいです。
つまり、
X座標がクリック位置に到達していない → X座標にSx加算
Y座標がクリック位置に到達していない → Y座標にSy加算
両方とも到達 → 停止
追記:
Ax = MouseX-BoxX ;
Ay = MouseY-BoxY ;
↓
Ax = (double)MouseX-BoxX ;
Ay = (double)MouseY-BoxY ;
にした方が良いです。左辺が整数だと結果も整数になってしまいます。
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月03日(木) 22:35
by softya(ソフト屋)
今の条件だと座標が一致した時に点を描画していないからではないでしょうか?
それと、あちこちにWaitKey() ;があるので気になりますので、出来れば状態遷移と言う考え方を取り入れられるとコードがすっきりすると思います。
参考。
http://dixq.net/g/37.html
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月04日(金) 01:52
by コーヒー牛乳
h2so5 さんが書きました:
角度によってはX座標やY座標(の整数値)が先にクリック位置に到達してしまい、移動が止まってしまいます。
if((int)BoxX != MouseX && (int)BoxY != MouseY)
のようにまとめてしまわないで、X座標Y座標の一致を個別にチェックした方がよいです。
つまり、
X座標がクリック位置に到達していない → X座標にSx加算
Y座標がクリック位置に到達していない → Y座標にSy加算
両方とも到達 → 停止
有難うございます
指摘されたとおりに直したらきちんと移動するようになりました
softya(ソフト屋) さんが書きました:
今の条件だと座標が一致した時に点を描画していないからではないでしょうか?
それと、あちこちにWaitKey() ;があるので気になりますので、出来れば状態遷移と言う考え方を取り入れられるとコードがすっきりすると思います。
参考。
http://dixq.net/g/37.html
参考ページを見てもいまいち状態遷移について理解できなかったのですが
関数を使って処理を分けて、メイン関数をすっきりさせればいいんでしょうか?
やってみたものの、結局WaitKey() ;はほとんど減らせませんでした
また修正したものを添付しておきます
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月04日(金) 12:05
by softya(ソフト屋)
Menue関数を例に上げますが、他も同様にしてください。
・Menue()の説明とサークルの表示は別の関数に分けてください。
・ClearDrawScreen() ;とScreenFlip() ;はメインループに移動してください。
・WaitKey();の代わりにCheckHitKeyAll()を使ってください。
例えば、
function_status = 1;
WaitKey();
だと
if( CheckHitKeyAll() ) {
function_status = 1;
}
となります。
こうすることで常に処理が毎フレームメインループにもどることになり、適切にコードを直せばESCキーによる終了も何時でも出来るように修正できるはずです。
※ いまだと最初の説明が出ているときにESCキーで終了できませんよね?
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月04日(金) 22:03
by コーヒー牛乳
softya(ソフト屋) さんが書きました:Menue関数を例に上げますが、他も同様にしてください。
・Menue()の説明とサークルの表示は別の関数に分けてください。
・ClearDrawScreen() ;とScreenFlip() ;はメインループに移動してください。
・WaitKey();の代わりにCheckHitKeyAll()を使ってください。
例えば、
function_status = 1;
WaitKey();
だと
if( CheckHitKeyAll() ) {
function_status = 1;
}
となります。
こうすることで常に処理が毎フレームメインループにもどることになり、適切にコードを直せばESCキーによる終了も何時でも出来るように修正できるはずです。
※ いまだと最初の説明が出ているときにESCキーで終了できませんよね?
また直したものを添付させていただきます。
関数を見直したので、Menue関数とMouseClick_Move関数はすっきりさせることが出来たのですが
End_NotEnd関数でWaitKey();を使わないと
プログラムを終了するかどうかの処理が一気に行われてしまいます。
色々試してみたのですが上手くいかなかったので助言を頂けると嬉しいです
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月04日(金) 22:44
by h2so5
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月05日(土) 01:26
by コーヒー牛乳
有難うございます
一度みたページだったのですが、そのときは良くわからずスルーしてました・・・
このページに載っている関数を使えば、キーを押したときの値と離したときの値が利用できるようになるんですね
書き直したのでファイルを添付させていただきます
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月05日(土) 12:03
by softya(ソフト屋)
大分スッキリしたんじゃないでしょうか?
あと気を付けたほうが良い点は、
・function_statusの値を即値ではenum定義したほうが分かりやすくなると思います。
例えば、
コード:
enum {
STATUS_MENUE,
};
とすれば、
int function_status = STATUS_MENUE;
と書いて
case STATUS_MENUE:
Menue();
break;
と書けるのでどう動くのかすごく分かりやすくなると思います。
・あとwhile(1)
よりも後ろにある
if( ProcessMessage() == -1 )
をwhileに入れたほうが良いと思います。
while( ProcessMessage() != -1 )
これでよりすっきりします。
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月05日(土) 17:43
by コーヒー牛乳
何度も有難うございます
列挙型というのは使ったことがなかったので上手くできてるかどうかはわかりませんが
直したのでまた貼っておきます
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月05日(土) 18:26
by h2so5
enumの使い方は大丈夫ですが、直し切れていない所がいくつか有りますね。
コード:
//自機がクリック位置に到達したら
if((int)BoxX == MouseX && (int)BoxY == MouseY)
{
//自機の移動が終わったら次の座標が送られてくるのを待つ為にClick = 0 をします
Move_STATUS = 0;
FUNCTION_STATUS = 1;
}
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月06日(日) 01:02
by コーヒー牛乳
h2so5 さんが書きました:enumの使い方は大丈夫ですが、直し切れていない所がいくつか有りますね。
コード:
//自機がクリック位置に到達したら
if((int)BoxX == MouseX && (int)BoxY == MouseY)
{
//自機の移動が終わったら次の座標が送られてくるのを待つ為にClick = 0 をします
Move_STATUS = 0;
FUNCTION_STATUS = 1;
}
ご指摘有難うございます
コードを直していると、見落としていてもエラーが出なくてそのまま気づかないことがあるんですね・・・
他のところも色々直してみました。何度も申し訳ありませんが、お付き合いくださると幸いです
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月06日(日) 11:42
by softya(ソフト屋)
大分良くなってきたと思いますよ。
で、もう幾つか直した方が良くなると思います。
・Move_TRUE, Move_FALSEは別のenumにしてください。
・変数Clickは使われていません。
・グローバルである必要の無い変数、Axなどはローカル変数にしてください。
・FUNCTION_STATUSを見なおしてみてください。即値がまだ残っています。
・End_NotEnd()とMenue()の方がほとんど同じなので共通化できませんか?
・Circle()とMouse_Move()は無理して分けなくても良いのでは?
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月06日(日) 18:05
by コーヒー牛乳
softya(ソフト屋) さんが書きました:大分良くなってきたと思いますよ。
で、もう幾つか直した方が良くなると思います。
・Move_TRUE, Move_FALSEは別のenumにしてください。
・変数Clickは使われていません。
・グローバルである必要の無い変数、Axなどはローカル変数にしてください。
・FUNCTION_STATUSを見なおしてみてください。即値がまだ残っています。
・End_NotEnd()とMenue()の方がほとんど同じなので共通化できませんか?
・Circle()とMouse_Move()は無理して分けなくても良いのでは?
ご指摘有難うございます
色々見落としていたところを修正し、Circle()とMouse_Move()をまとめて、
画面内でクリックして画面外までドラッグすると自機が画面外まで行ってしまうことに気づいたので
マウスをクリックした座標が画面外に行かないように書き換えてみました。
(関係ないですが投稿禁止単語はマウスのX座標の変数名でした・・・・・・)
Menue()の見直しと、それにあたってEscapeKey()も少し書き換えてみたのですが
回りくどくなっていないか心配です。
修正していて思ったのですが
GetHitKeyStateAll_2(Key)をいくつかの関数で呼び出しているのを
一つにまとめることはできるのでしょうか?
単純にswitch構文の前に持ってくると、今度はEnd_NotEnd()を呼び出せなくなってしまいます
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月07日(月) 00:18
by softya(ソフト屋)
GetHitKeyStateAll_2(Key)は1つにできます。ClearDrawScreen() ;直後に一回で良いのでは無いでしょうか?
End_NotEnd()とEscapeKey()も引数で工夫すれば、1つの関数に出来ます。
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月09日(水) 21:14
by コーヒー牛乳
softya(ソフト屋) さんが書きました:GetHitKeyStateAll_2(Key)は1つにできます。ClearDrawScreen() ;直後に一回で良いのでは無いでしょうか?
End_NotEnd()とEscapeKey()も引数で工夫すれば、1つの関数に出来ます。
End_NotEnd()とEscapeKey()をとりあえずまとめてみました
Escキーを押す → End_Menue()を呼び出す → Escキーが離されるのを待つ →再度Escキーが押されたら終了
という流れにしたいのですが、GetHitKeyStateAll_2(Key)をClearDrawScreen()の後に一回だけにすると
Escキーが離されるのを待つというのが上手く行かなくなり、結局Escape_STATUSという変数をはさんでいますが
これだと直す前とあまり変わっていないでしょうか・・・・・・?
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月09日(水) 23:48
by softya(ソフト屋)
まとめようとし過ぎて、かえってややこしくなっている気がしました。
なので、シンプルにしてみました。ご自分のコードと比べてみてください。
Re: 画面に表示した点をクリックした座標まで移動させる
Posted: 2011年2月11日(金) 00:47
by コーヒー牛乳
softya(ソフト屋) さんが書きました:まとめようとし過ぎて、かえってややこしくなっている気がしました。
なので、シンプルにしてみました。ご自分のコードと比べてみてください。
有難うございます、とても参考になりました
EscapeKey(FUNCTION_STATUS)と一つにまとめようとしていたのが問題だったのですね
直していただいたコードを参考に
End_Menue()からMove()へ戻るプログラムと
自機の速度を変化させるプログラムを追加してみました
あとは画像の表示など諸々の要素を追加して
何らかの形で発表できればと思っています
何度も回答を頂き、有難うございました