teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2019/08/07 13:47

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -1,3 +1,37 @@
1
1
  animationの状態を直接Playerが持つのはちょっと汚いという思いがあります。クラスに出してしまいたいところです。`anime_s`は`enum class`にするほうがいいでしょう。
2
2
 
3
- あとカウンター変数は`int`じゃなくて`std::uint64_t`とかを使うほうがいいでしょう。少なくともunsignedであるほうが適切でしょう。
3
+ あとカウンター変数は`int`じゃなくて`std::uint64_t`とかを使うほうがいいでしょう。少なくともunsignedであるほうが適切でしょう。
4
+
5
+ ---
6
+
7
+ 追記
8
+
9
+ 時間不足で中保半端な解答になってしまったのでもう少し追記します。
10
+
11
+ まずanimationの状態を直接Playerが持つのは責任がぼやけているというのはすでに指摘したとおりです。なので新たにアニメーションクラスを作るわけですが、今回どういうアニメーションかというと、状態がサイクリックですよね?`1->2->3->1`みたいな。
12
+
13
+ とするとまずそういうイテレータを作るべきでしょう。つまり任意の閉区間`[n1...n2]`をサイクリックするイテレータです。イテレータの作り方は
14
+
15
+ [イテレータの解説をするなんて今更佳代](https://qiita.com/yumetodo/items/245e94a0e85db9bf5cbb)
16
+
17
+ を参照してください。
18
+
19
+ 次に結局これらの数字は何だったかと言うと、画像ハンドルの配列の要素番号として使うのでしたね。
20
+
21
+ とするとこのイテレータをラップしたアニメーションクラスをつくりましょう。以下の物を少なくとも持つクラスです。
22
+
23
+ 1. 今は走っているのか待機しているのかのフラグ
24
+ 2. 走っている状態を表すイテレータ
25
+ 3. 画像ハンドルの配列
26
+
27
+ ところで現状`Player::Draw_Update()`では左右にキーが入力されているときのみ描画するようですが、これだと静止しているときに何も描画されないのでは?つねに何かは描画する必要があるでしょう。なぜなら通常
28
+
29
+ 1. 画面クリア
30
+ 2. なんか描画
31
+ 3. 裏画面を表画面に転送
32
+
33
+ を繰り返すはずだからです。
34
+
35
+ まあ何れにせよ`Player::Draw_Update()`ではキーの状態によってアニメーションクラスの状態を更新し画像ハンドルをもらい、描画する処理になりますね。
36
+
37
+ さて、そう考えるとおかしなことがあります。なぜ`Player`がキーの状態を持つのでしょうか?責任が広すぎます。動くものが一つだけならぎりぎりわかりますがちょっと読みにくいです。別クラスに追い出して、必要なキー状態はメンバ関数の引数経由で教えることにしましょう。

1

unsigned

2019/08/07 13:46

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -1,1 +1,3 @@
1
- animationの状態を直接Playerが持つのはちょっと汚いという思いがあります。クラスに出してしまいたいところです。`anime_s`は`enum class`にするほうがいいでしょう。
1
+ animationの状態を直接Playerが持つのはちょっと汚いという思いがあります。クラスに出してしまいたいところです。`anime_s`は`enum class`にするほうがいいでしょう。
2
+
3
+ あとカウンター変数は`int`じゃなくて`std::uint64_t`とかを使うほうがいいでしょう。少なくともunsignedであるほうが適切でしょう。