Q&A
前提・実現したいこと
pythonのpygame.sprite.spritecollideを使ってスプライトの当たり判定をつけたいのです。
上からくるスプライト(human)と下からくるスプライト(human)が接触したらhumanの進む方向を逆にしたいです。
発生している問題・エラーメッセージ
スプライトが初期位置から動かない。vyの正負が交互に変わっているためだと思う。原因としてはpygame.sprite.spritecollideがスタート時から当たり判定が出ているためと思われる。
当たり判定を正しく機能させたい。
該当のソースコード
python
1import pygame 2from pygame.locals import * 3import sys 4 5SCR_RECT = Rect(0, 0, 600, 500) 6 7class Player(pygame.sprite.Sprite): 8 def __init__(self, filename, x, y, vx, vy): 9 pygame.sprite.Sprite.__init__(self,self.containers) 10 self.image = pygame.image.load(filename).convert_alpha() 11 width = self.image.get_width() 12 height = self.image.get_height() 13 self.rect = Rect(x, y, width, height) 14 self.vx = vx 15 self.vy = vy 16 self.x=x 17 self.y=y 18 19 def update(self): 20 self.rect.move_ip(self.vx,self.vy) 21 pressed_key = pygame.key.get_pressed() 22 if pressed_key[K_LEFT]: 23 self.rect.move_ip(-2, 0) 24 self.x=self.x-2 25 if pressed_key[K_RIGHT]: 26 self.rect.move_ip(2, 0) 27 self.x=self.x+2 28 if pressed_key[K_UP]: 29 self.rect.move_ip(0, -2) 30 self.y=self.y-2 31 if pressed_key[K_DOWN]: 32 self.rect.move_ip(0, 2) 33 self.y=self.y+2 34 def draw(self, screen): 35 screen.blit(self.image, self.rect) 36 37class Human(pygame.sprite.Sprite): 38 def __init__(self, filename, x, y, vx, vy,blocks): 39 pygame.sprite.Sprite.__init__(self,self.containers) 40 self.image = pygame.image.load(filename).convert_alpha() 41 width = self.image.get_width() 42 height = self.image.get_height() 43 self.blocks=blocks 44 self.rect = Rect(x, y, width, height) 45 self.vx = vx 46 self.vy = vy 47 48 def update(self): 49 self.rect.move_ip(self.vx, self.vy) 50 blocks_collided = pygame.sprite.spritecollide(self, self.blocks ,False) 51 if blocks_collided: 52 self.vy=-self.vy 53 def draw(self, screen): 54 screen.blit(self.image, self.rect) 55 56def main(): 57 pygame.init() 58 screen = pygame.display.set_mode(SCR_RECT.size) 59 pygame.display.set_caption(u"スプライトの使い方") 60 # スプライトグループの作成 61 group = pygame.sprite.RenderUpdates() 62 blocks=pygame.sprite.Group() 63 # スプライトの追加 64 Player.containers=group 65 Human.containers=group,blocks 66 # スプライトを作成 67 for i in range(5): 68 Human("image/human.png", 300+(60*i), 0, 0, 1,blocks) 69 Human("image/human.png", 330+(60*i), 300, 0, -1,blocks) 70 Player("image/player.png", 300, 400, 0, 0) 71 clock = pygame.time.Clock() 72 while True: 73 clock.tick(60) # 60fps 74 screen.fill((255,255,255)) 75 # スプライトグループを更新 76 group.update() 77 # スプライトを描画 78 group.draw(screen) 79 pygame.display.update() 80 81 for event in pygame.event.get(): 82 if event.type == QUIT: 83 pygame.quit() 84 sys.exit() 85 if event.type == KEYDOWN: # キーを押したとき 86 if event.key == K_ESCAPE: # Escキーが押されたとき 87 pygame.quit() 88 sys.exit() 89 90if __name__ == "__main__": 91 main()
試したこと
補足情報(FW/ツールのバージョンなど)
Python 3.6.5
pygame 1.9.4
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。