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

質問編集履歴

1

問題点が変わった

2019/04/07 17:00

投稿

Waki123
Waki123

スコア10

title CHANGED
@@ -1,1 +1,1 @@
1
- pygame.sprite.spritecollideanyを使ってスプライトの当たり判定をつけたい
1
+ pygame.sprite.spritecollideを使ってスプライトの当たり判定をつけたい
body CHANGED
@@ -1,40 +1,9 @@
1
1
  ### 前提・実現したいこと
2
- pythonのpygameを使ってスプライトの当たり判定をつけたいのです。
2
+ pythonのpygame.sprite.spritecollideを使ってスプライトの当たり判定をつけたいのです。
3
- 上からくるスプライト(human)と下からくるスプライト(player)が接触したら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
- ---> 34 if pygame.sprite.spritecollideany(human, group):
5
+ スプライトが初期位置から動かない。vyの正負が交互に変わっているためだと思う。原因としてはpygame.sprite.spritecollideがスタート時から当たり判定が出ているためと思われる。
31
- 35 self.vy=-self.vy
32
- 36 def draw(self, screen):
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
- if pygame.sprite.spritecollideany(human, group):
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
- group.add(player)
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
- group.add(human)
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