回答編集履歴

6

Nキーロールオーバーについて追記

2018/03/05 09:44

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -44,12 +44,24 @@
44
44
 
45
45
 
46
46
 
47
+ ■条件
48
+
49
+ ・自機を左上方向に移動中
50
+
51
+ ・ショットキーを押下
52
+
53
+
54
+
47
- キーボード左上キーを押下して移動時に弾が発射されないという点でしたね。
55
+ 時にショットキーを押下して弾が発射されないという点でね。
48
-
56
+
49
- 不具合ではないでしょうか、以下のprint文で正しい値が取れているのかdebugしてみてはどうでしょうか。
57
+ 不具合ではないでしょうか、以下のprint文で各処理で正しい値が取れているのかdebugしてみてはどうでしょうか。
50
58
 
51
59
  少し調査してみた限りでは、event.key == K_SPACE:のスペース押下イベントが発生してませんでした。
52
60
 
61
+ [キーボードの同時押しの制限(Nキーロールオーバー)に引っかかった可能性もあります](http://wikiwiki.jp/fpag/?%A5%AD%A1%BC%A5%DC%A1%BC%A5%C9%A4%CE%C6%B1%BB%FE%B2%A1%A4%B7%A4%CB%A4%C4%A4%A4%A4%C6)
62
+
63
+
64
+
53
65
  あとはがんばってくださいな。
54
66
 
55
67
 

5

質問を読み違えていたので訂正。

2018/03/05 09:44

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -44,27 +44,23 @@
44
44
 
45
45
 
46
46
 
47
- こちらはバグですねご指摘ありがとうございます。
48
-
49
- Bullet#is_destroyで弾生存判定をしているのすが、
47
+ キーボード左上キー押下して移動時に弾が発射されなという点したね。
50
-
48
+
51
- 自機サイズを計算するのを忘れそのため、すぐに弾が削除対象になります。
49
+ 不具合ではないでしょうか、以下print文で正しい値が取れているのかdebugしみてはどうでょうか
50
+
52
-
51
+ 少し調査してみた限りでは、event.key == K_SPACE:のスペース押下イベントが発生してませんでした。
52
+
53
-
53
+ あとはがんばってくださいな。
54
+
55
+
56
+
54
-
57
+ ```Python
58
+
55
- 対応方法は2案あって、
59
+ import time
56
-
57
- 0. Player#moveにて自機の移動範囲を制限する。
60
+
58
-
59
- 0. Bulletis_destroyで自機のサイズを計算に含める。
61
+ print('Done' + str(time.perf_counter()))
60
-
61
-
62
-
62
+
63
- 案2で実装します。
63
+ ```
64
-
65
- 質問文に自機の画像が無いため正確な自機のサイズはわかりませんが、
66
-
67
- Player#moveを参考に30*30としておきます。
68
64
 
69
65
 
70
66
 

4

空白行を削除!

2018/03/05 09:26

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -266,8 +266,6 @@
266
266
 
267
267
  for bullet in bullet_list:
268
268
 
269
-
270
-
271
269
  bullet.move()
272
270
 
273
271
  bullet.draw()

3

Bullet#is_destroyを自機のサイズを計算するように変更、bullet説明変数を追加

2018/03/05 06:57

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -16,7 +16,63 @@
16
16
 
17
17
 
18
18
 
19
+ ---
20
+
21
+ 2018/03/05 コメント欄の質問を受けて追記
22
+
23
+
24
+
25
+ > bullet = Bullet()
26
+
27
+ としていないのに
28
+
29
+ bullet.move()
30
+
31
+ bullet.draw()
32
+
33
+ が動くのはなぜですか?
34
+
35
+
36
+
19
- 上記対応をたサンプルコードを記載しおきます。ご参考
37
+ これはしてます処理の流れをコメント1~5で説明し
38
+
39
+ 動きが分かりづらい時は図でプログラムの動作を書いてみるといいかもです。
40
+
41
+
42
+
43
+ > 自機を左上に移動してるときだけ弾が発射されないのですが、これはなぜでしょうか?
44
+
45
+
46
+
47
+ こちらはバグですねご指摘ありがとうございます。
48
+
49
+ Bullet#is_destroyで弾の生存判定をしているのですが、
50
+
51
+ 自機のサイズを計算するのを忘れてました。そのため、すぐに弾が削除対象になります。
52
+
53
+
54
+
55
+ 対応方法は2案あって、
56
+
57
+ 0. Player#moveにて自機の移動範囲を制限する。
58
+
59
+ 0. Bullet#is_destroyで自機のサイズを計算に含める。
60
+
61
+
62
+
63
+ 案2で実装します。
64
+
65
+ 質問文に自機の画像が無いため正確な自機のサイズはわかりませんが、
66
+
67
+ Player#moveを参考に30*30としておきます。
68
+
69
+
70
+
71
+ 以下はサンプルコードです。
72
+
73
+
74
+
75
+ ---
20
76
 
21
77
 
22
78
 
@@ -140,7 +196,7 @@
140
196
 
141
197
  def is_destroy(self) -> bool:
142
198
 
143
- if self.bullet.x < 0 or self.bullet.y < 0:
199
+ if self.bullet.x < -30 or self.bullet.y < - 30:
144
200
 
145
201
  return True
146
202
 
@@ -150,6 +206,8 @@
150
206
 
151
207
  # 自機の位置が移動しても発射位置が追従するようにself.x/self.y ではなく self.rectを使用
152
208
 
209
+ # 3,Bulletクラスのインスタンス変数を生成してshoot関数の戻り値として返す
210
+
153
211
  return Bullet(self.rect.x, self.rect.y)
154
212
 
155
213
 
@@ -182,6 +240,8 @@
182
240
 
183
241
  clock = pygame.time.Clock()
184
242
 
243
+ # 1,リストでbulletの生存管理
244
+
185
245
  bullet_list = []
186
246
 
187
247
 
@@ -202,8 +262,12 @@
202
262
 
203
263
  enemy1.draw(screen)
204
264
 
265
+ # 5,bullet_listの内容をfor in ループで回す。
266
+
205
267
  for bullet in bullet_list:
206
268
 
269
+
270
+
207
271
  bullet.move()
208
272
 
209
273
  bullet.draw()
@@ -228,11 +292,17 @@
228
292
 
229
293
  if event.type == KEYDOWN:
230
294
 
295
+ # 2,ショット:スペースキーを押下時に弾を発射
296
+
231
297
  if event.key == K_SPACE:
232
298
 
233
299
  # 発射時にbullet_listに追加
234
300
 
235
- bullet_list.append(player.shoot(screen))
301
+ bullet = player.shoot(screen)
302
+
303
+ # 4,リストにplayer.shootの戻り値である変数:bulletを追加
304
+
305
+ bullet_list.append(bullet)
236
306
 
237
307
  if event.key == K_ESCAPE:
238
308
 

2

is_destroyをプロパティ化

2018/03/05 06:56

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -70,18 +70,24 @@
70
70
 
71
71
  self.vy = vy
72
72
 
73
+
74
+
73
75
  def draw(self, screen):
74
76
 
75
77
  screen.blit(self.image, self.rect)
76
78
 
77
79
 
78
80
 
81
+
82
+
79
83
  class Player(Flyer):
80
84
 
81
85
  def __init__(self, filename, x, y, vx, vy):
82
86
 
83
87
  super().__init__(filename, x, y, vx, vy)
84
88
 
89
+
90
+
85
91
  def move(self):
86
92
 
87
93
  pressed_key = pygame.key.get_pressed()
@@ -112,7 +118,7 @@
112
118
 
113
119
  class Bullet(object):
114
120
 
115
- def __init__(self, x:int, y:int):
121
+ def __init__(self, x: int, y: int):
116
122
 
117
123
  self.bullet = Rect(x, y, 20, 20)
118
124
 
@@ -124,12 +130,14 @@
124
130
 
125
131
 
126
132
 
127
- def move(self, x:int=0, y:int=-5):
133
+ def move(self, x: int=0, y: int=-5):
128
134
 
129
135
  self.bullet.move_ip(x, y)
130
136
 
131
137
 
132
138
 
139
+ @property
140
+
133
141
  def is_destroy(self) -> bool:
134
142
 
135
143
  if self.bullet.x < 0 or self.bullet.y < 0:
@@ -146,12 +154,16 @@
146
154
 
147
155
 
148
156
 
157
+
158
+
149
159
  class Enemy(Flyer):
150
160
 
151
161
  def __init__(self, filename, x, y, vx, vy):
152
162
 
153
163
  super().__init__(filename, x, y, vx, vy)
154
164
 
165
+
166
+
155
167
  def move(self):
156
168
 
157
169
  self.rect.move_ip(self.vx, self.vy)
@@ -196,9 +208,9 @@
196
208
 
197
209
  bullet.draw()
198
210
 
199
- #リストからスクリーン範囲外のbulletを削除
211
+ #リストからスクリーン範囲外のbulletをクリーンアップ
200
-
212
+
201
- bullet_list = list(filter(lambda x: not x.is_destroy(), bullet_list))
213
+ bullet_list = list(filter(lambda x: not x.is_destroy, bullet_list))
202
214
 
203
215
 
204
216
 
@@ -236,4 +248,6 @@
236
248
 
237
249
  main()
238
250
 
251
+
252
+
239
253
  ```

1

追記

2018/03/03 11:21

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -6,14 +6,10 @@
6
6
 
7
7
 
8
8
 
9
-
10
-
11
9
  それ以外に発射したbulletがスクリーンの描画範囲外かの`生存管理`を行う必要があります。
12
10
 
13
11
 
14
12
 
15
-
16
-
17
13
  0. `class Bullet`を新規追加
18
14
 
19
15
  0. 変数:`bullet_list` にて`Bullet`の生存管理をする。
@@ -222,7 +218,7 @@
222
218
 
223
219
  if event.key == K_SPACE:
224
220
 
225
- #player.shoot(screen)
221
+ # 発射時にbullet_listに追加
226
222
 
227
223
  bullet_list.append(player.shoot(screen))
228
224