回答編集履歴

1

追記

2020/04/13 10:59

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -19,3 +19,177 @@
19
19
 
20
20
 
21
21
  この辺りは、個々のメソッドの使い方というよりも、むしろ得られている重力加速度などの値をいかに加工するのかといったテクニックの見せ所のようにも思えます(物理法則に従わせることよりも、見せ方かも)。
22
+
23
+
24
+
25
+ #追記
26
+
27
+
28
+
29
+ たとえば、こんな感じでコードを変更すれば、それなりにそれっぽい処理ができます。
30
+
31
+ 必要なところだけ抜粋しているので、処理の流れをよく考えてオリジナルに追加してみてください。
32
+
33
+
34
+
35
+ ```swift
36
+
37
+ import UIKit
38
+
39
+ import CoreMotion
40
+
41
+
42
+
43
+ class ViewController: UIViewController {
44
+
45
+ // 略
46
+
47
+
48
+
49
+ // ここから追加
50
+
51
+ // リングバッファ
52
+
53
+ // 過去10回分のドラッグ履歴を残す
54
+
55
+ var index = 0
56
+
57
+ var maxIndex = 10
58
+
59
+ var dX: [CGFloat] = []
60
+
61
+ var dY: [CGFloat] = []
62
+
63
+ // ここまで
64
+
65
+
66
+
67
+ // 値を書き換えるので、let -> var に変更
68
+
69
+ var mag: Double = 20.0
70
+
71
+
72
+
73
+ override func viewDidLoad() {
74
+
75
+ super.viewDidLoad()
76
+
77
+
78
+
79
+ // ここから追加
80
+
81
+ // 配列の初期化
82
+
83
+ // dX = [0.0, 0.0, ..(全部で10回繰り返し), 0.0] と同じ
84
+
85
+ dX = Array(repeating: CGFloat(0.0), count: maxIndex)
86
+
87
+ dY = Array(repeating: CGFloat(0.0), count: maxIndex
88
+
89
+ // ここまで。
90
+
91
+
92
+
93
+ // 以下略
94
+
95
+ }
96
+
97
+
98
+
99
+ // 略
100
+
101
+ override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
102
+
103
+ // dx, dy を表示 -> デバッグのため。本質的な処理ではない
104
+
105
+ for i in 0..<dX.count {
106
+
107
+ print("dx[(i)]: (dX[i]), dy[(i)]: (dY[i])")
108
+
109
+ }
110
+
111
+
112
+
113
+ // ここからが本質的な処理
114
+
115
+ // 新しい加速度(vx, vy)を計算
116
+
117
+ // ドラッグした値の変化からドラッグ後の加速度を計算する
118
+
119
+ // 過去10回分の変位(dX, dY)から加速度を求める -> 実際は過去10回分の平均を求めているだけ
120
+
121
+ let amp = 5.0 // 倍率。適切に決める
122
+
123
+ // 簡潔に書くため reduce を使っているが、計算は for 文を使って配列全ての要素を足して、最後に要素数で割る処理と同じ
124
+
125
+ vx = Double(dX.reduce(0.0) { $0 + $1 } / CGFloat(dX.count)) * amp
126
+
127
+ vy = Double(dY.reduce(0.0) { $0 + $1 } / CGFloat(dY.count)) * amp
128
+
129
+
130
+
131
+ print("vx: ", vx!, "vy: ", vy!)
132
+
133
+ // ここまで
134
+
135
+ startGame()
136
+
137
+ }
138
+
139
+
140
+
141
+ override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
142
+
143
+ print("touchesMoved", touches.count)
144
+
145
+ // タッチイベントを取得.
146
+
147
+ // 途中略
148
+
149
+
150
+
151
+ // ドラッグで移動したx, y距離をとる.
152
+
153
+ let deltaX: CGFloat = location.x - prevLocation.x
154
+
155
+ let deltaY: CGFloat = location.y - prevLocation.y
156
+
157
+
158
+
159
+ // ここから追加
160
+
161
+ // deltaX, deltaY をリングバッファに保存
162
+
163
+ dX[index] = deltaX
164
+
165
+ dY[index] = deltaY
166
+
167
+ // リングバッファの現在のインデックス(配列の要素)を一つ進める
168
+
169
+ index += 1
170
+
171
+ // インデックスが maxIndex を超えた場合には 0 に戻す(剰余の計算)
172
+
173
+ index %= maxIndex
174
+
175
+ // ここまで追加
176
+
177
+
178
+
179
+ // 移動した分の距離をmyFrameの座標にプラスする.
180
+
181
+ myFrame.origin.x += deltaX
182
+
183
+ myFrame.origin.y += deltaY
184
+
185
+ // 以下略
186
+
187
+ }
188
+
189
+
190
+
191
+ // 以下略
192
+
193
+ }
194
+
195
+ ```