質問編集履歴
1
問題点が変わった
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
pygame.sprite.
|
1
|
+
pygame.sprite.spritecollideを使ってスプライトの当たり判定をつけたい
|
body
CHANGED
@@ -1,40 +1,9 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
|
-
pythonのpygameを使ってスプライトの当たり判定をつけたいのです。
|
2
|
+
pythonのpygame.sprite.spritecollideを使ってスプライトの当たり判定をつけたいのです。
|
3
|
-
上からくるスプライト(human)と下からくるスプライト(
|
3
|
+
上からくるスプライト(human)と下からくるスプライト(human)が接触したらhumanの進む方向を逆にしたいです。
|
4
4
|
### 発生している問題・エラーメッセージ
|
5
|
-
pygame.sprite.spritecollideany(human, group)においてhumanが定義されていないと出る
|
6
|
-
```
|
7
|
-
NameError Traceback (most recent call last)
|
8
|
-
<ipython-input-1-05ff0019ad46> in <module>()
|
9
|
-
69
|
10
|
-
70 if __name__ == "__main__":
|
11
|
-
---> 71 main()
|
12
|
-
|
13
|
-
<ipython-input-1-05ff0019ad46> in main()
|
14
|
-
54 screen.fill((255,255,255))
|
15
|
-
55 # スプライトグループを更新
|
16
|
-
---> 56 group.update()
|
17
|
-
57 # スプライトを描画
|
18
|
-
58 group.draw(screen)
|
19
|
-
|
20
|
-
~\Anaconda3\lib\site-packages\pygame\sprite.py in update(self, *args)
|
21
|
-
460 """
|
22
|
-
461 for s in self.sprites():
|
23
|
-
--> 462 s.update(*args)
|
24
|
-
463
|
25
|
-
464 def draw(self, surface):
|
26
|
-
|
27
|
-
<ipython-input-1-05ff0019ad46> in update(self)
|
28
|
-
32 def update(self):
|
29
|
-
33 self.rect.move_ip(self.vx, self.vy)
|
30
|
-
|
5
|
+
スプライトが初期位置から動かない。vyの正負が交互に変わっているためだと思う。原因としてはpygame.sprite.spritecollideがスタート時から当たり判定が出ているためと思われる。
|
31
|
-
35 self.vy=-self.vy
|
32
|
-
|
6
|
+
当たり判定を正しく機能させたい。
|
33
|
-
|
34
|
-
NameError: name 'human' is not defined
|
35
|
-
|
36
|
-
```
|
37
|
-
|
38
7
|
### 該当のソースコード
|
39
8
|
|
40
9
|
```python
|
@@ -46,32 +15,49 @@
|
|
46
15
|
|
47
16
|
class Player(pygame.sprite.Sprite):
|
48
17
|
def __init__(self, filename, x, y, vx, vy):
|
49
|
-
pygame.sprite.Sprite.__init__(self)
|
18
|
+
pygame.sprite.Sprite.__init__(self,self.containers)
|
50
19
|
self.image = pygame.image.load(filename).convert_alpha()
|
51
20
|
width = self.image.get_width()
|
52
21
|
height = self.image.get_height()
|
53
22
|
self.rect = Rect(x, y, width, height)
|
54
23
|
self.vx = vx
|
55
24
|
self.vy = vy
|
25
|
+
self.x=x
|
26
|
+
self.y=y
|
56
27
|
|
57
28
|
def update(self):
|
58
29
|
self.rect.move_ip(self.vx,self.vy)
|
30
|
+
pressed_key = pygame.key.get_pressed()
|
31
|
+
if pressed_key[K_LEFT]:
|
32
|
+
self.rect.move_ip(-2, 0)
|
33
|
+
self.x=self.x-2
|
34
|
+
if pressed_key[K_RIGHT]:
|
35
|
+
self.rect.move_ip(2, 0)
|
36
|
+
self.x=self.x+2
|
37
|
+
if pressed_key[K_UP]:
|
38
|
+
self.rect.move_ip(0, -2)
|
39
|
+
self.y=self.y-2
|
40
|
+
if pressed_key[K_DOWN]:
|
41
|
+
self.rect.move_ip(0, 2)
|
42
|
+
self.y=self.y+2
|
59
43
|
def draw(self, screen):
|
60
44
|
screen.blit(self.image, self.rect)
|
61
45
|
|
62
46
|
class Human(pygame.sprite.Sprite):
|
63
|
-
def __init__(self, filename, x, y, vx, vy):
|
47
|
+
def __init__(self, filename, x, y, vx, vy,blocks):
|
64
|
-
pygame.sprite.Sprite.__init__(self)
|
48
|
+
pygame.sprite.Sprite.__init__(self,self.containers)
|
65
49
|
self.image = pygame.image.load(filename).convert_alpha()
|
66
50
|
width = self.image.get_width()
|
67
51
|
height = self.image.get_height()
|
52
|
+
self.blocks=blocks
|
68
53
|
self.rect = Rect(x, y, width, height)
|
69
54
|
self.vx = vx
|
70
55
|
self.vy = vy
|
71
56
|
|
72
57
|
def update(self):
|
73
58
|
self.rect.move_ip(self.vx, self.vy)
|
74
|
-
|
59
|
+
blocks_collided = pygame.sprite.spritecollide(self, self.blocks ,False)
|
60
|
+
if blocks_collided:
|
75
61
|
self.vy=-self.vy
|
76
62
|
def draw(self, screen):
|
77
63
|
screen.blit(self.image, self.rect)
|
@@ -80,14 +66,17 @@
|
|
80
66
|
pygame.init()
|
81
67
|
screen = pygame.display.set_mode(SCR_RECT.size)
|
82
68
|
pygame.display.set_caption(u"スプライトの使い方")
|
83
|
-
# スプライトを作成
|
84
|
-
player=Player("image/player.png", 300, 500, 0, -1)
|
85
|
-
human = Human("image/human.png", 300, 0, 0, 1)
|
86
69
|
# スプライトグループの作成
|
87
70
|
group = pygame.sprite.RenderUpdates()
|
71
|
+
blocks=pygame.sprite.Group()
|
88
72
|
# スプライトの追加
|
73
|
+
Player.containers=group
|
74
|
+
Human.containers=group,blocks
|
75
|
+
# スプライトを作成
|
89
|
-
|
76
|
+
for i in range(5):
|
77
|
+
Human("image/human.png", 300+(60*i), 0, 0, 1,blocks)
|
78
|
+
Human("image/human.png", 330+(60*i), 300, 0, -1,blocks)
|
90
|
-
|
79
|
+
Player("image/player.png", 300, 400, 0, 0)
|
91
80
|
clock = pygame.time.Clock()
|
92
81
|
while True:
|
93
82
|
clock.tick(60) # 60fps
|