回答編集履歴
6
Nキーロールオーバーについて追記
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
質問を読み違えていたので訂正。
test
CHANGED
@@ -44,27 +44,23 @@
|
|
44
44
|
|
45
45
|
|
46
46
|
|
47
|
-
こちらはバグですねご指摘ありがとうございます。
|
48
|
-
|
49
|
-
|
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
|
-
|
59
|
+
import time
|
56
|
-
|
57
|
-
|
60
|
+
|
58
|
-
|
59
|
-
|
61
|
+
print('Done' + str(time.perf_counter()))
|
60
|
-
|
61
|
-
|
62
|
-
|
62
|
+
|
63
|
-
|
63
|
+
```
|
64
|
-
|
65
|
-
質問文に自機の画像が無いため正確な自機のサイズはわかりませんが、
|
66
|
-
|
67
|
-
Player#moveを参考に30*30としておきます。
|
68
64
|
|
69
65
|
|
70
66
|
|
4
空白行を削除!
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説明変数を追加
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
|
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をプロパティ化
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
|
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
追記
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
|
-
#
|
221
|
+
# 発射時にbullet_listに追加
|
226
222
|
|
227
223
|
bullet_list.append(player.shoot(screen))
|
228
224
|
|