ページ 11

特定の座標への移動について

Posted: 2010年11月11日(木) 12:51
by ばそばそ
はじめまして、ばそばそと申します。
現在、卒業制作でゲームを作っています。
そこであるキャラに特定の座標まで動く処理をしたいのですが、うまくできません。

理想の動き方は
(例)
①右矢印キーを1回押す(押しっぱなしではないです)
②X座標の300までアニメーションしながら一定速度で進む
③X座標300に到着し、右矢印キーを一回押す(または左矢印キーを一回押す)
④X座標の500までアニメーションしながら一定速度で進む(左矢印の場合はX座標100まで戻る)
という感じです。

自分でプログラムを書いてみたら、十字キーを押してる間にしか移動しなかったり(この時はアニメーションしてませんでした)、パッと瞬間移動するプログラムしかできませんでした;
説明がわかりにくいかもしれませんが、是非わかる方がいたら教えてください。

if( SGCheckKeyboard( KD_DAT, DIK_RIGHT ) && m_ptPos.x <= 300 ){
AnimSetup(2);  //アニメーション(2)を行う
m_ptPos.x += 2; //X座標を+2の速度で動く
}
ちなみにこんなプログラムにfor文を加えてみたりしたのですが、なかなか上手くいきませんでした。

Re:特定の座標への移動について

Posted: 2010年11月11日(木) 14:33
by 所信
自信はないが、瞬間移動するのはwaitしていないからでは?
c言語でいうsleep

Re:特定の座標への移動について

Posted: 2010年11月11日(木) 16:55
by ゆーずぃ
携帯からなので詳しい参照は載せられませんが、ゲームプログラミングの館にある、「キャラを動かそう」のようなページが、がっつり答えになっています。そこを参考にしてみてください。

Re:特定の座標への移動について

Posted: 2010年11月11日(木) 18:29
by ばそばそ
所信さん返答ありがとうございます。
Sleepは盲点でした^^;
自分の文章の組み立て方が悪いのかもしれませんが、

if( SGCheckKeyboard( KD_DAT, DIK_RIGHT )){
AnimSetup(2);  //アニメーション(2)を行う
      for(int a=0; m_ptPos.x <= 300; a++){
m_ptPos.x += 2; //X座標を+2の速度で動く
        Sleep(100);
}
}
のように思いついたまま書いてみたのですが上手くいきませんでした><
その後、友人にも相談してみたら思う通りに動かせました!ありがとうございました!


ゆーずぃさん返答ありがとうございます。
>ゲームプログラミングの館にある、「キャラを動かそう」のようなページ
こちらのページも参考にさせていただきます!
ありがとうございました!

Re:特定の座標への移動について

Posted: 2010年11月11日(木) 22:34
by Dixq (管理人)
所信さんのご回答に反する回答になって申し訳ないですが、
ゲームプログラムにおいて、どこかでSleepする設計は、お勧めしません。

例えば5秒間キャラを止めたい時は、Sleep(5000)と書くことになるのでしょうか?
そうするとその間にキャンセルボタンを押したかどうかの監視やメッセージ処理は誰がやるのでしょう?

60FPSのゲームである場合、メインループには必ず1/60秒戻ってくるような設計がお勧めです。
キーボードの入力状態の監視、メッセージ処理、画面反映、これらは必ず1/60秒に一度は行う必要があります。

詳しくはゲームプログラミングの館を参照して頂ければお分かり頂けると思いますが、
現在は裏画面処理をしていないので、すごい速さで処理をしてしまっているのでしょう。
CPUはintの足し算程度の計算なら1億回位すぐに計算してしまいます。
環境が解らないので大したことは言えませんが、垂直同期を待って裏画面を表画面に反映する処理が必要そうです。

SGCheckKeyboardという関数は検索しても出てきませんが、独自の関数ですか?
制作環境を示して頂けると適切な回答が集まるかもしれません。

Re:特定の座標への移動について

Posted: 2010年11月12日(金) 00:19
by ばそばそ
Dixqさん

>SGCheckKeyboardという関数は検索しても出てきませんが、独自の関数ですか?
>制作環境を示して頂けると適切な回答が集まるかもしれません。

書くのを忘れていました。申し訳ありません。
SGCheckKeyboard関数は独自の関数です。
学校で配布されてるライブラリを使ってましたので、自分の中では当たり前になっていて気付きませんでした。

制作環境はVisual Studio 2005 で言語はC++です。
今更になって申し訳ないです;