質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
Pygame

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

Python

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

Q&A

解決済

1回答

5218閲覧

pygame.sprite.spritecollideを使ってスプライトの当たり判定をつけたい

Waki123

総合スコア10

Pygame

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

Python

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

0グッド

0クリップ

投稿2019/04/06 07:53

編集2019/04/07 17:00

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

python

1blocks_collided = pygame.sprite.spritecollide(self, self.blocks ,False) 2 if blocks_collided: 3 self.vy=-self.vy

上記のコードを下記のコードのように変えると正常に動いた。

python

1blocks_collided = pygame.sprite.spritecollide(self, self.blocks ,False) 2 if player_collided: 3 for player in player_collided: 4 self.vy=-self.vy

投稿2019/04/08 07:37

Waki123

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問