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

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

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

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

Python

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

Q&A

0回答

2341閲覧

pygameでのcollidelistを用いた当たり判定について

kei3709

総合スコア2

Pygame

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

Python

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

0グッド

0クリップ

投稿2021/10/21 09:45

前提・実現したいこと

Pythonのpygameを使用した簡単なシューティングゲームを作っています。collidelistを用い、敵とプレイヤーのあたり判定の処理を実装したいです。
・プレイヤーの初期ライフは3
・ 敵にあたるとライフが –1
・現在のライフを上部に表示(●の個数)
・ぶつかった敵は消える

発生している問題

プレイヤーの弾の敵への当たり判定は正常に動くのですが、プレイヤーの敵への当たり判定のコードを入力して実装したところ、敵が画面上部で消えライフの値が当たってもないのに下がっていきます。

該当のソースコード

python

1import pygame #pygame(ゲームエンジン)をインポート 2from pygame.locals import * 3import random 4 5def main(): 6 (w, h) = (500, 500) #画面サイズ 7 (x, y) = (150, 150) #初期位置 8 (pw, ph) = (30, 30) #プレイヤーの幅と高さ 9 (mv, mv2) = (10, 10) #移動速度(弾)と敵 10 fps = 30 #描画速度(フレームレート) 11 c = [] #弾を管理用のリスト 12 e = [] #敵の管理用のリスト 13 j = 0 #カウンタ(敵の出現管理) 14 cnt = 10 #敵の出現間隔 15 ss = 0 #スコアとダメージ 16 tt = 3 #ライフ 17 stxt = "" #文字列 18 19 pygame.init() #ライブラリの初期化 20 screen = pygame.display.set_mode((w,h)) #画面サイズをw,hで設定 21 pygame.display.set_caption('あたり判定の練習') #ウインドウのタイトル設定 22 r = Rect(x, y, pw, ph) #四角形(プレイヤー) 23 clock = pygame.time.Clock() #時間管理用オブジェクトの作成 24 font = pygame.font.SysFont("yumincho", 20) #フォントとサイズ指定 25 26 while 1: #イベント処理用ループ 27 screen.fill((0, 0, 0)) #黒で塗りつぶす 28 pygame.draw.rect(screen, (255, 0, 0), r) #四角形(プレイヤー) 29 30 for i,item in enumerate(c): #弾の数だけ繰り返し 31 item.move_ip(0, -mv) #弾の移動処理 32 pygame.draw.circle(screen, (0, 255, 0), (item.x, item.y), item.w/2) #弾の描画処理 33 if item.y < 0: #弾が画面外に出た場合 34 c.pop(i) #弾の削除 35 36 for I,item in enumerate(e): #敵の数だけ繰り返し 37 item.move_ip(0, mv2) #敵の移動処理 38 pygame.draw.rect(screen, (0, 0, 255), item) #敵の描画処理 39 if item.y > h: #敵が画面外に出た場合 40 e.pop(i) #敵の削除 41 42##########################collidelist########################## 43 44 a = item.collidelist(c) 45 if a > -1: #当たり判定(敵とプレイヤーの弾) 46 ss += 1 #当たった場合はスコア+1 47 c.pop(a) #弾の削除 48 49 b = item.collidelist(e) 50 if b > -1: #当たり判定(敵とプレイヤー) 51 tt -= 1 #当たった場合はスコア-1 52 e.pop(b) #敵の削除 53 54##########################collidelist########################## 55 j += 1 56 if j > cnt : 57 e.append(Rect(random.randrange(0, w), 0, pw, ph)) #敵生成 58 j = 0 59 60 stxt = "スコア:" + str(ss) #文字列を設定 61 txt = font.render(stxt, True, (255,0,0)) #テキスト生成 62 screen.blit(txt, (10, 10)) #テキストを描画する 63 pygame.display.update() #描画の更新 64 stxt = "残りライフ:" + str(tt) #文字列を設定 65 txt = font.render(stxt, True, (255,0,0)) #テキスト生成 66 screen.blit(txt, (10, 25)) #テキストを描画する 67 pygame.display.update() #描画の更新 68 clock.tick(fps) #FPSの設定 69 for event in pygame.event.get(): #イベント処理用の繰り返し 70 if event.type == QUIT: #ウインドウが閉じられた場合 71 return 72 if (event.type == KEYDOWN and event.key == K_ESCAPE): #エスケープキーが押された場合 73 return 74 if event.type == MOUSEMOTION: #マウスが移動した場合 75 x,y = event.pos 76 r.move_ip((x - r.x), (y - r.y)) 77 if event.type == MOUSEBUTTONDOWN and event.button == 1: #マウスをクリックした場合 78 cx,cy = event.pos #クリック時のマウス座標を取得 79 cx += pw/2 80 c.append(Rect(cx, cy, 10, 10)) #円(弾) 81if __name__ == '__main__': main()

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問