前提・実現したいこと
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()
あなたの回答
tips
プレビュー