if(プレイヤー1のパッドのAボタンが押されているなら){
プレイヤー1が移動
プレイヤー2にダメージ
}
if(プレイヤー2のパッドのAボタンが押されているなら){
プレイヤー2が移動
プレイヤー1にダメージ
}
もっとスマートにコードを書くにはどう考えれば良いのでしょうか?
プレイヤーの情報を構造体配列化し、移動やダメージ処理の関数化をやってみました。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--;
}
ありがとうございます。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
}
--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;
}
}