違う条件で似たような処理を実装

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

違う条件で似たような処理を実装

#1

投稿記事 by ノーマ » 8年前

対戦ゲームを作っていて、この様な処理を作りました

コード:

if(プレイヤー1のパッドのAボタンが押されているなら){
プレイヤー1が移動
プレイヤー2にダメージ
}
if(プレイヤー2のパッドのAボタンが押されているなら){
プレイヤー2が移動
プレイヤー1にダメージ
}
動かすだけならこれで問題ないのですが、これから先複数のコマンドを作るのでこの書き方だとソースコードの量が膨大になってしまいます。
もっとスマートにコードを書くにはどう考えれば良いのでしょうか?

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

Re: 違う条件で似たような処理を実装

#2

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

プレーヤーの情報を構造体配列化、移動やダメージ処理の関数化がまず必要でしょうか。
コマンド処理もプレーヤー1と2で共通の関数化できると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ノーマ

Re: 違う条件で似たような処理を実装

#3

投稿記事 by ノーマ » 8年前

softya(ソフト屋) さんが書きました:プレーヤーの情報を構造体配列化、移動やダメージ処理の関数化がまず必要でしょうか。
コマンド処理もプレーヤー1と2で共通の関数化できると思います。
プレイヤーの情報を構造体配列化し、移動やダメージ処理の関数化をやってみました。
このような書き方で大丈夫でしょうか?

コード:

//プレイヤーの情報を構造体配列化
typedef struct{
double x, y;
int HP;
}player_t;

player_t player[2]; //player[0] = プレイヤー1, player[1] = プレイヤー2

//移動とダメージ処理の関数化

//移動
void move(int i){
player[i].x++;
}
//ダメージ
void damage(int i){
player[i].HP--;
}
コマンド処理はいまいち良い実装方法が思いつきませんでした。

コード:


if(プレイヤー1のパッドのAボタンが押されているなら){
move(0); //player[0]の移動
damage(1); //player[1]にダメージ
}
if(プレイヤー2のパッドのAボタンが押されているなら){
move(1); //player[1]の移動
damage(0); //player[0]にダメージ
}


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

Re: 違う条件で似たような処理を実装

#4

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

たぶん処理内容がシンプル化されているので、断言はできませんが方向性は良いかと思います。
ポインタ化したほうが分かりやすくなる気もしますが、ポインタ不得意なら引数添字のままでも構いません。

コマンド処理は、パッドの入力内容と、攻撃側の番号、防御側の番号を引数にすれば関数化できませんか?
同じコマンド操作という前提になりますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ノーマ

Re: 違う条件で似たような処理を実装

#5

投稿記事 by ノーマ » 8年前

softya(ソフト屋) さんが書きました:たぶん処理内容がシンプル化されているので、断言はできませんが方向性は良いかと思います。
ポインタ化したほうが分かりやすくなる気もしますが、ポインタ不得意なら引数添字のままでも構いません。

コマンド処理は、パッドの入力内容と、攻撃側の番号、防御側の番号を引数にすれば関数化できませんか?
同じコマンド操作という前提になりますが。
ありがとうございます。
ポインタは苦手なのでこのままでやります。

パッドの入力内容を引数にする方法が思いつきませんでした…

コード:

//動作
void action(int attack_side, int defense_side){
	move(attack_side);
	damage(defense_side);
}

コード:

if (プレイヤー1のパッドのAボタンが押されているなら){
	Action(0, 1); //攻撃側プレイヤー1, 防御側プレイヤー2
}
if (プレイヤー2のパッドのAボタンが押されているなら){
	Action(1, 0); //攻撃側プレイヤー2, 防御側プレイヤー1
}
ちなみにどのパッドのどのボタンが押されたかを管理するには、龍神録8章のキーコンフィグを二人プレイに対応できるように改造したものを使って管理しています。

コード:

--key.cpp--
#include "../include/GV.h"

unsigned int stateKey[256];

int GetHitKeyStateAll_2(){
	char GetHitKeyStateAll_Key[256];
	GetHitKeyStateAll(GetHitKeyStateAll_Key);
	for (int i = 0; i<256; i++){
		if (GetHitKeyStateAll_Key[i] == 1) stateKey[i]++;
		else                            stateKey[i] = 0;
	}
	return 0;
}

int CheckStateKey(unsigned char Handle){
	return stateKey[Handle];
}

//パッドの入力状態を格納する変数
pad_t pad[PAD_NUM_MAX];

//引数1と引数2のうち大きい方を引数1に代入する
void input_pad_or_key(int *p, int k){
	*p = *p>k ? *p : k;
}

//パッドとキーボードの両方の入力をチェックする関数
void GetHitPadStateAll(){
	int i, PadInput, mul = 1;
	PadInput = GetJoypadInputState(DX_INPUT_PAD1);//パッドの入力状態を取得
	for (i = 0; i<16; i++){
		if (PadInput & mul)  pad[0].key[i]++;
		else                pad[0].key[i] = 0;
		mul *= 2;
	}
	input_pad_or_key(&pad[0].key[ConfigPad[0].left], CheckStateKey(KEY_INPUT_LEFT));
	input_pad_or_key(&pad[0].key[ConfigPad[0].up], CheckStateKey(KEY_INPUT_UP));
	input_pad_or_key(&pad[0].key[ConfigPad[0].right], CheckStateKey(KEY_INPUT_RIGHT));
	input_pad_or_key(&pad[0].key[ConfigPad[0].down], CheckStateKey(KEY_INPUT_DOWN));
	input_pad_or_key(&pad[0].key[ConfigPad[0].A], CheckStateKey(KEY_INPUT_Z));
	input_pad_or_key(&pad[0].key[ConfigPad[0].B], CheckStateKey(KEY_INPUT_X));
	input_pad_or_key(&pad[0].key[ConfigPad[0].C], CheckStateKey(KEY_INPUT_A));
	input_pad_or_key(&pad[0].key[ConfigPad[0].D], CheckStateKey(KEY_INPUT_S));
	input_pad_or_key(&pad[0].key[ConfigPad[0].L], CheckStateKey(KEY_INPUT_Q));
	input_pad_or_key(&pad[0].key[ConfigPad[0].R], CheckStateKey(KEY_INPUT_W));
	input_pad_or_key(&pad[0].key[ConfigPad[0].start], CheckStateKey(KEY_INPUT_RETURN));
	input_pad_or_key(&pad[0].key[ConfigPad[0].select], CheckStateKey(KEY_INPUT_ESCAPE));
}

void GetHitPadStateAll2(){
	int i, PadInput, mul = 1;
	PadInput = GetJoypadInputState(DX_INPUT_PAD2);//パッドの入力状態を取得
	for (i = 0; i<16; i++){
		if (PadInput & mul)  pad[1].key[i]++;
		else                pad[1].key[i] = 0;
		mul *= 2;
	}
	input_pad_or_key(&pad[1].key[ConfigPad[1].left], CheckStateKey(KEY_INPUT_J));
	input_pad_or_key(&pad[1].key[ConfigPad[1].up], CheckStateKey(KEY_INPUT_I));
	input_pad_or_key(&pad[1].key[ConfigPad[1].right], CheckStateKey(KEY_INPUT_L));
	input_pad_or_key(&pad[1].key[ConfigPad[1].down], CheckStateKey(KEY_INPUT_K));
	input_pad_or_key(&pad[1].key[ConfigPad[1].A], CheckStateKey(KEY_INPUT_N));
	input_pad_or_key(&pad[1].key[ConfigPad[1].B], CheckStateKey(KEY_INPUT_M));
	input_pad_or_key(&pad[1].key[ConfigPad[1].C], CheckStateKey(KEY_INPUT_G));
	input_pad_or_key(&pad[1].key[ConfigPad[1].D], CheckStateKey(KEY_INPUT_H));
	input_pad_or_key(&pad[1].key[ConfigPad[1].L], CheckStateKey(KEY_INPUT_Y));
	input_pad_or_key(&pad[1].key[ConfigPad[1].R], CheckStateKey(KEY_INPUT_U));
	input_pad_or_key(&pad[1].key[ConfigPad[1].start], CheckStateKey(KEY_INPUT_V));
	input_pad_or_key(&pad[1].key[ConfigPad[1].select], CheckStateKey(KEY_INPUT_B));
}

//渡されたパッドキー番号の入力状態を返す。返り値が-1なら不正
int CheckStatePad_1P(unsigned int Handle){
	if (0 <= Handle && Handle<PAD_MAX){
		return pad[0].key[Handle];
	}
	else{
		printfDx("CheckStatePadに渡した値が不正です\n");
		return -1;
	}
}

int CheckStatePad_2P(unsigned int Handle){
	if (0 <= Handle && Handle<PAD_MAX){
		return pad[1].key[Handle];
	}
	else{
		printfDx("CheckStatePadに渡した値が不正です\n");
		return -1;
	}
}

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

Re: 違う条件で似たような処理を実装

#6

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

pad_t pad[PAD_NUM_MAX];に入力状態が格納されているなら、

コード:

void command( int attack_side, int defense_side ) {
	if( pad[attack_side]のAボタンが押されているなら ) {
		move( attack_side );
		damage( defense_side );
	}
}
と出来ませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ノーマ

Re: 違う条件で似たような処理を実装

#7

投稿記事 by ノーマ » 8年前

softya(ソフト屋) さんが書きました:pad_t pad[PAD_NUM_MAX];に入力状態が格納されているなら、

コード:

void command( int attack_side, int defense_side ) {
	if( pad[attack_side]のAボタンが押されているなら ) {
		move( attack_side );
		damage( defense_side );
	}
}
と出来ませんか?
できました!
なるほどそうやってパッドの入力状態を確認すればよかったんですね。

おかげでわかりやすいソースが書けました!ありがとうございました。

閉鎖

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