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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アタゴ

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

#1

投稿記事 by アタゴ » 11年前

コード:

[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を引数として指定したいということです。)
教えてください。お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 11年前

KEY_INPUT_UPなどは整数値です。
なので、int型メンバ変数に保持できます。
_carクラスのint型メンバ変数としてupから4方向持っていれば良いんじゃないでしょうか?
upから4方向のメンバ変数はコンストラクタで初期化します。

あと_carクラスの名前はc++のアンダーバーから始まる名前は予約語であると言う規約に違反しているので変えたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アタゴ
記事: 31
登録日時: 11年前

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

#3

投稿記事 by アタゴ » 11年前

DXライブラリを使用しています。
もし整数値なら対応表が乗っているサイトを教えてくださると嬉しいです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#4

投稿記事 by h2so5 » 11年前

DxLib.hを見れば整数値は分かりますが、対応する整数値を知っている必要はありませんよ。
整数値をそのまま書くと定数にしている意味がありませんから。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 11年前

対応表が必要でしょうか?
と言うより対応表を見なければいけない作り方をする必要は全くありません。
なので対応表を必要とする事自体が間違ったことをしている可能性が高いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

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

#6

投稿記事 by naohiro19 » 11年前

クラス名に先頭文字列にアンダースコアはC++の標準規格では定められていません

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#7

投稿記事 by ISLe » 11年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#8

投稿記事 by softya(ソフト屋) » 11年前

naohiro19 さんが書きました:クラス名に先頭文字列にアンダースコアはC++の標準規格では定められていません
「グローバル スコープを持ち、_ で始まる名前」はクラス名もアウトだと思っていたけど勘違いだったら申し訳ない。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 11年前

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

#9

投稿記事 by 超絶右留斗羅天才プログラマー » 11年前

数値は、ソースコード上の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;
}
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

アタゴ
記事: 31
登録日時: 11年前

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

#10

投稿記事 by アタゴ » 11年前

なるほど分かりました。
ありがとうございます。m(_ _)m

閉鎖

“C言語何でも質問掲示板” へ戻る