ページ 11

この関数を一般化したいのですが・・・

Posted: 2013年6月08日(土) 20:26
by アタゴ

コード:

[code]

void _car::MoveCar(void)
{
	if(Key[KEY_INPUT_UP]>=1)
	{
		if(Key[KEY_INPUT_LEFT]>=1)
		{
			handle=(handle+3)%360;
			angle=(angle+357)%360;
		}
		if(Key[KEY_INPUT_RIGHT]>=1)
		{
			handle=(handle+357)%360;
			angle=(angle+3)%360;
		}
		y=y-spead*ssin[handle];
		x=x+spead*ccos[handle];
	}
	if(Key[KEY_INPUT_DOWN]>=1)
	{

		if(Key[KEY_INPUT_LEFT]>=1)
		{
			handle=(handle+357)%360;
			angle=(angle+3)%360;
		}
		if(Key[KEY_INPUT_RIGHT]>=1)
		{
			handle=(handle+3)%360;
			angle=(angle+357)%360;
		}
		y=y-backspead*ssin[handle];
		x=x+backspead*ccos[handle];
	}
		Aangle=PI/180*angle;
}
これをどのようにしたら引数にkeyのボタンを上下左右、設定してcar.MoveCar();みたいなのを複数作って何人もいっしょに遊べるようにすることができるのですか?(KEY_INPUT_UPを引数として指定したいということです。)
教えてください。お願いします。

Re: この関数を一般化したいのですが・・・

Posted: 2013年6月08日(土) 21:06
by softya(ソフト屋)
KEY_INPUT_UPなどは整数値です。
なので、int型メンバ変数に保持できます。
_carクラスのint型メンバ変数としてupから4方向持っていれば良いんじゃないでしょうか?
upから4方向のメンバ変数はコンストラクタで初期化します。

あと_carクラスの名前はc++のアンダーバーから始まる名前は予約語であると言う規約に違反しているので変えたほうが良いと思います。

Re: この関数を一般化したいのですが・・・

Posted: 2013年6月08日(土) 22:09
by アタゴ
DXライブラリを使用しています。
もし整数値なら対応表が乗っているサイトを教えてくださると嬉しいです。

Re: この関数を一般化したいのですが・・・

Posted: 2013年6月08日(土) 22:12
by h2so5
DxLib.hを見れば整数値は分かりますが、対応する整数値を知っている必要はありませんよ。
整数値をそのまま書くと定数にしている意味がありませんから。

Re: この関数を一般化したいのですが・・・

Posted: 2013年6月08日(土) 22:13
by softya(ソフト屋)
対応表が必要でしょうか?
と言うより対応表を見なければいけない作り方をする必要は全くありません。
なので対応表を必要とする事自体が間違ったことをしている可能性が高いです。

Re: この関数を一般化したいのですが・・・

Posted: 2013年6月08日(土) 22:56
by naohiro19
クラス名に先頭文字列にアンダースコアはC++の標準規格では定められていません

Re: この関数を一般化したいのですが・・・

Posted: 2013年6月08日(土) 23:54
by ISLe
添字ではなくて、4方向のキーの状態をまとめて(例えばビットにパックして)引数で渡すようにしたら良いのではないでしょうか。
そうすれば複数人でいっしょに遊べるだけじゃなく、人以外でも動かせるようにできますけど。

そのものズバリではないですが『コントローラークラス』で過去ログ検索してみると良いかもしれません。

Re: この関数を一般化したいのですが・・・

Posted: 2013年6月09日(日) 00:07
by softya(ソフト屋)
naohiro19 さんが書きました:クラス名に先頭文字列にアンダースコアはC++の標準規格では定められていません
「グローバル スコープを持ち、_ で始まる名前」はクラス名もアウトだと思っていたけど勘違いだったら申し訳ない。

Re: この関数を一般化したいのですが・・・

Posted: 2013年6月09日(日) 01:12
by 超絶右留斗羅天才プログラマー
数値は、ソースコード上のKEY_INPUT_UPの上で右クリックして「定義へ移動」を選択すると、

コード:

#define KEY_INPUT_RIGHT								D_DIK_RIGHT			// 右キー
が出てきます。更にD_DIK_RIGHTの上で右クリックして「定義へ移動」を選択すると、

コード:

#define D_DIK_RIGHT								(0xCD)
と出てきます。この0xCDを電卓などで16進数→10進数へ変換すると、205となります。
整数表を調べても出てこない場合は、このように算出することが可能となっています。
16進数のまま使っても構わない場合は、0xCDの値をそのまま使うとよいです。

続いて、以下にサンプルを掲載しておきます。

コード:

void _car::MoveCar(int key_up,int key_down, int key_left, int key_right)
{
    if(Key[key_up]>=1)
    {
        if(Key[key_left]>=1)
        {
            handle=(handle+3)%360;
            angle=(angle+357)%360;
        }
        if(Key[key_right]>=1)
        {
            handle=(handle+357)%360;
            angle=(angle+3)%360;
        }
        y=y-spead*ssin[handle];
        x=x+spead*ccos[handle];
    }
    if(Key[key_down]>=1)
    {
 
        if(Key[key_left]>=1)
        {
            handle=(handle+357)%360;
            angle=(angle+3)%360;
        }
        if(Key[key_right]>=1)
        {
            handle=(handle+3)%360;
            angle=(angle+357)%360;
        }
        y=y-backspead*ssin[handle];
        x=x+backspead*ccos[handle];
    }
    Aangle=PI/180*angle;
}

Re: この関数を一般化したいのですが・・・

Posted: 2013年6月09日(日) 10:57
by アタゴ
なるほど分かりました。
ありがとうございます。m(_ _)m