質問編集履歴

1 問題点が変わった

Waki123

Waki123 score 10

2019/04/08 02:00  投稿

pygame.sprite.spritecollideanyを使ってスプライトの当たり判定をつけたい
pygame.sprite.spritecollideを使ってスプライトの当たり判定をつけたい
### 前提・実現したいこと
pythonのpygameを使ってスプライトの当たり判定をつけたいのです。
上からくるスプライト(human)と下からくるスプライト(player)が接触したらhumanの進む方向を逆にしたいです。今後、スプライトを増やしていきたいのでグループのどれかに当たったことを判定したいです。
pythonのpygame.sprite.spritecollideを使ってスプライトの当たり判定をつけたいのです。
上からくるスプライト(human)と下からくるスプライト(human)が接触したらhumanの進む方向を逆にしたいです。
### 発生している問題・エラーメッセージ
pygame.sprite.spritecollideany(human, group)においてhumanが定義されていないと出る
```
NameError                                Traceback (most recent call last)
<ipython-input-1-05ff0019ad46> in <module>()
    69
    70 if __name__ == "__main__":
---> 71    main()
<ipython-input-1-05ff0019ad46> in main()
    54        screen.fill((255,255,255))
    55        # スプライトグループを更新
---> 56        group.update()
    57        # スプライトを描画
    58        group.draw(screen)
~\Anaconda3\lib\site-packages\pygame\sprite.py in update(self, *args)
   460        """
   461        for s in self.sprites():
--> 462            s.update(*args)
   463
   464    def draw(self, surface):
<ipython-input-1-05ff0019ad46> in update(self)
    32    def update(self):
    33        self.rect.move_ip(self.vx, self.vy)
---> 34        if pygame.sprite.spritecollideany(human, group):
    35            self.vy=-self.vy
    36    def draw(self, screen):
NameError: name 'human' is not defined
```
スプライトが初期位置から動かない。vyの正負が交互に変わっているためだと思う。原因としてはpygame.sprite.spritecollideがスタート時から当たり判定が出ているためと思われる。
当たり判定を正しく機能させたい。
### 該当のソースコード
```python
import pygame
from pygame.locals import *
import sys
SCR_RECT = Rect(0, 0, 600, 500)
class Player(pygame.sprite.Sprite):
   def __init__(self, filename, x, y, vx, vy):
       pygame.sprite.Sprite.__init__(self)
       pygame.sprite.Sprite.__init__(self,self.containers)
       self.image = pygame.image.load(filename).convert_alpha()
       width = self.image.get_width()
       height = self.image.get_height()
       self.rect = Rect(x, y, width, height)
       self.vx = vx
       self.vy = vy
       self.x=x  
       self.y=y  
       
   def update(self):
       self.rect.move_ip(self.vx,self.vy)
       pressed_key = pygame.key.get_pressed()  
       if pressed_key[K_LEFT]:  
           self.rect.move_ip(-2, 0)  
           self.x=self.x-2  
       if pressed_key[K_RIGHT]:  
           self.rect.move_ip(2, 0)  
           self.x=self.x+2  
       if pressed_key[K_UP]:  
           self.rect.move_ip(0, -2)  
           self.y=self.y-2  
       if pressed_key[K_DOWN]:  
           self.rect.move_ip(0, 2)  
           self.y=self.y+2  
   def draw(self, screen):
       screen.blit(self.image, self.rect)
class Human(pygame.sprite.Sprite):
   def __init__(self, filename, x, y, vx, vy):
       pygame.sprite.Sprite.__init__(self)
   def __init__(self, filename, x, y, vx, vy,blocks):
       pygame.sprite.Sprite.__init__(self,self.containers)
       self.image = pygame.image.load(filename).convert_alpha()
       width = self.image.get_width()
       height = self.image.get_height()
       self.blocks=blocks  
       self.rect = Rect(x, y, width, height)
       self.vx = vx
       self.vy = vy
   
   def update(self):
       self.rect.move_ip(self.vx, self.vy)
       if pygame.sprite.spritecollideany(human, group):
       blocks_collided = pygame.sprite.spritecollide(self, self.blocks ,False)
       if blocks_collided:
           self.vy=-self.vy
   def draw(self, screen):
       screen.blit(self.image, self.rect)
       
def main():
   pygame.init()
   screen = pygame.display.set_mode(SCR_RECT.size)
   pygame.display.set_caption(u"スプライトの使い方")
   # スプライトを作成  
   player=Player("image/player.png", 300, 500, 0, -1)  
   human = Human("image/human.png", 300, 0, 0, 1)  
   # スプライトグループの作成
   group = pygame.sprite.RenderUpdates()
   blocks=pygame.sprite.Group()  
   # スプライトの追加
   group.add(player)
   group.add(human)
   Player.containers=group
   Human.containers=group,blocks
   # スプライトを作成
   for i in range(5):
       Human("image/human.png", 300+(60*i), 0, 0, 1,blocks)
       Human("image/human.png", 330+(60*i), 300, 0, -1,blocks)
   Player("image/player.png", 300, 400, 0, 0)
   clock = pygame.time.Clock()
   while True:
       clock.tick(60) # 60fps
       screen.fill((255,255,255))
       # スプライトグループを更新
       group.update()
       # スプライトを描画
       group.draw(screen)
       pygame.display.update()
       
       for event in pygame.event.get():
           if event.type == QUIT:
               pygame.quit()
               sys.exit()
       if event.type == KEYDOWN:      # キーを押したとき
               if event.key == K_ESCAPE:  # Escキーが押されたとき
                   pygame.quit()
                   sys.exit()
               
if __name__ == "__main__":
   main()
```
### 試したこと
### 補足情報(FW/ツールのバージョンなど)
Python 3.6.5
pygame 1.9.4
  • Python

    26894 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Pygame

    113 questions

    Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る