前提
- ブロック崩しのような簡単なゲームを作成しようと思った
- ボールを表現するために移動するオブジェクト(block構造体)を作成しようと思った
- 四角いボールでよかったのでボール自体を表すrectangle構造体と、移動方向とそのスピードを表すvector2D構造体があればよいと思った
- それらを実装したが、実際に使用する際冗長な記述を強いられるため、自分の実装は間違っていると感じた
- 自らの知恵では解決できなかったため、質問をしようと思った
実現したいこと
構造体(vector2D, rectangle, block)とその関係を正しく定義し、冗長な記述をなくしたい
発生している問題・エラーメッセージ
- 構造体のメンバへアクセスする際、コードが冗長になる
- メンバへのアクセスを簡潔にすると、メンバへの演算の記述が冗長になってしまう
- 理想とする使用方法を考えたが、それにも問題点があるのでもっと良い方法があればそれを知りたい
該当のソースコード
型の定義
c++
1struct vector2D { 2 int x; 3 int y; 4 /* vector2Dの演算子オーバロードを定義(+=, -=, *=, /=) */ 5} 6 7struct rectangle { vector2D position; vector2D size; } 8struct color { /* 内容に関係ないため省略 */ } 9 10struct block { 11 rectangle area; /* ブロックの表示領域(当たり判定) */ 12 vector2D speed; /* ブロックの移動速度 */ 13 color c; /* ブロックが表示されるときの色 */ 14}
実装:現在のコード↓
c++
1block ball{ /* 実際の値は省略 */ }; 2 3void ball_update() //ボールの移動と表示 4{ 5 vector2D ball_delta{ /* 実際の値は省略 */ } // 移動量の計算 6 7 /* ボールの座標更新 */ 8 ball.area.position.x += ball_delta.x; // メンバ指定が冗長 (block.xとしたい) 9 ball.area.position.y += ball_delta.y; // vecter2Dとして演算したい 10 11 /* 各データへのアクセス */ 12 ball.area.position.x; 13 ball.area.position.y; 14 ball.area.size.x; 15 ball.area.size.x; 16 ball.speed.x; 17 ball.speed.y; 18 ball.c; 19 20 /* ボール表示処理をする */ 21 return; 22}
実装:理想のコード↓
c++
1block ball{ /* 実際の値は省略 */ }; 2 3void ball_update() //ボールの移動と表示 4{ 5 vector2D ball_delta{ /* 実際の値は省略 */ } // 移動量の計算 6 7 /* ボールの座標更新 */ 8 ball.position += ball_delta; // vector2D同士の演算 9 10 /* 各データへのアクセス */ 11 ball.x; //ボールのx座標 12 ball.y; //ボールのy座標 13 ball.width; 14 ball.height; 15 ball.area.position.x; 16 ball.area.position.y; 17 ball.area.size.x; 18 ball.area.size.x; 19 ball.speed.x; 20 ball.speed.y; 21 ball.c; 22 23 /* ボール表示処理をする */ 24 return; 25}
理想のコードの問題点
ball.x
とball.position.x
が同じものを指すことになるball.width
とball.size.x
が同じものを指すことになる
試したこと
struct block
のメンバをprivate
にしてアクセス関数を書く
c++
1class block { 2private: 3 rectangle area; /* ブロックの表示領域(当たり判定) */ 4 vector2D speed; /* ブロックの移動速度 */ 5 color c; /* ブロックが表示されるときの色 */ 6public: 7 // コンストラクタ省略 8 /* getter */ 9 int x() { return area.position.x; } 10 int y() { return area.position.y; } 11 int width() { return area.size.x; } 12 int height(){ return area.size.y; } 13 vector2D position(){ return area.position; } 14 vector2D size() { return area.size; } 15 /* setter */ 16 void x(int x) { area.position.x = x; } 17 void y(int y) { area.position.y = y; } 18 void width(int w) { area.size.x = w; } 19 void height(int h){ area.size.y = h; } 20 void position(vector2D p){ area.position = p; } 21 void size(vector2D s) { area.size = s; } 22}
問題点
block.x()
とblock.position().x
が同じものを指している- 関数と通じて値を変更するため、加算などの表現が分かりにくくなってしまう
vector2D
,rectangle
,block
を内包する構造体を定義したときに、アクセス関数をまた書く必要がある
補足情報(FW/ツールのバージョンなど)
Visual Studio 2019でやってます
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/25 15:40