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

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

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

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

Python

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

Q&A

解決済

1回答

5250閲覧

Pythonのpygameを使用した簡単なシューティングゲームで敵の管理をlistで行い、敵を同時に複数表示可能にしたい

kei3709

総合スコア2

Pygame

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

Python

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

0グッド

0クリップ

投稿2021/10/14 10:31

前提・実現したいこと

Pythonのpygameを使用した簡単なシューティングゲームを作っています。
画面の上から敵が降らせることはできたのですが、一つずつしか降ってきません。敵の管理をlistで行い、敵を同時に複数表示可能なようにしたいです。

該当のソースコード

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 fps = 30 #描画速度(フレームレート) 10 mv = 10 #移動速度(弾) 11 c = [] #弾を管理用のリスト 12 (mv, mv2) = (10, 10) #移動速度(弾)と敵 13 j = 0 #カウンタ(敵の出現管理) 14 cnt = 50 #敵の出現間隔 15 pygame.init() #ライブラリの初期化 16 screen = pygame.display.set_mode((w,h)) #画面サイズをw,hで設定 17 pygame.display.set_caption('アニメーションの練習') #ウインドウのタイトル設定 18 r = Rect(x, y, pw, ph) #四角形(プレイヤー) 19 clock = pygame.time.Clock() #時間管理用オブジェクトの作成 20 e = Rect(random.randrange(0, w), 0, pw, ph) 21 22 while 1: #イベント処理用ループ 23 screen.fill((0, 0, 0)) #黒で塗りつぶす 24 pygame.draw.rect(screen, (255, 0, 0), r) #四角形(プレイヤー) 25 26 for i,item in enumerate(c): #弾の数だけ繰り返し 27 28 item.move_ip(0, -mv) #弾の移動処理 29 pygame.draw.circle(screen, (0, 255, 0), (item.x, item.y), item.w/2) #弾の描画処理 30 if item.y < 0: #弾が画面外に出た場合 31 c.pop(i) #弾の削除 32 33 34 35 e.move_ip(0, mv2) #敵の移動処理 36 pygame.draw.rect(screen, (0, 0, 255), e) #敵の描画処理 37 j += 1 #カウンタ増加 38 if j > cnt : #出現間隔チェック 39 e = Rect(random.randrange(0, w), 0, pw, ph) #敵生成 40 j = 0 #カウンタ初期化 41 42 43 pygame.display.update() #描画の更新 44 45 46 clock.tick(fps) #FPSの設定 47 for event in pygame.event.get(): #イベント処理用の繰り返し 48 if event.type == QUIT: #ウインドウが閉じられた場合 49 return 50 if (event.type == KEYDOWN and event.key == K_ESCAPE): #エスケープキーが押された場合 51 return 52 if event.type == MOUSEMOTION: #マウスが移動した場合 53 x,y = event.pos 54 r.move_ip((x - r.x), (y - r.y)) 55 if event.type == MOUSEBUTTONDOWN and event.button == 1: #マウスをクリックした場合 56 cx,cy = event.pos #クリック時のマウス座標を取得 57 cx += pw/2 58 c.append(Rect(cx, cy, 10, 10)) #円(弾)) 59if __name__ == '__main__': main()

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「敵となる青い四角を複数出現させるには」に特化した解答となります。

見たところ、弾についてはクリックイベントごとに複数表示できています。
これは「弾」を管理用リストに格納し、1件ずつ処理して画面外に出たら削除(pop)しているようです。

Pythoh

1 c = [] #弾を管理用のリスト 2... 3 for i,item in enumerate(c): #弾の数だけ繰り返し 4 item.move_ip(0, -mv) #弾の移動処理 5 pygame.draw.circle(screen, (0, 255, 0), (item.x, item.y), item.w/2) #弾の描画処理 6 if item.y < 0: #弾が画面外に出た場合 7 c.pop(i) #弾の削除 8... 9 if event.type == MOUSEBUTTONDOWN and event.button == 1: #マウスをクリックした場合 10 cx,cy = event.pos #クリック時のマウス座標を取得 11 cx += pw/2 12 c.append(Rect(cx, cy, 10, 10)) #円(弾))

敵についても同じように実装すれば、複数出現させることができそうです。
簡単に実装例を記載しますので、参考になれば幸いです。

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 fps = 30 #描画速度(フレームレート) 10 mv = 10 #移動速度(弾) 11 c = [] #弾を管理用のリスト 12 (mv, mv2) = (10, 10) #移動速度(弾)と敵 13 j = 0 #カウンタ(敵の出現管理) 14 cnt = 30 #敵の出現間隔 ##### カウンタを変更 15 pygame.init() #ライブラリの初期化 16 screen = pygame.display.set_mode((w,h)) #画面サイズをw,hで設定 17 pygame.display.set_caption('アニメーションの練習') #ウインドウのタイトル設定 18 r = Rect(x, y, pw, ph) #四角形(プレイヤー) 19 clock = pygame.time.Clock() #時間管理用オブジェクトの作成 20 e = Rect(random.randrange(0, w), 0, pw, ph) 21 enemies = [e] ####################################################################################################追加 22 23 while 1: #イベント処理用ループ 24 screen.fill((0, 0, 0)) #黒で塗りつぶす 25 pygame.draw.rect(screen, (255, 0, 0), r) #四角形(プレイヤー) 26 27 for i,item in enumerate(c): #弾の数だけ繰り返し 28 29 item.move_ip(0, -mv) #弾の移動処理 30 pygame.draw.circle(screen, (0, 255, 0), (item.x, item.y), item.w/2) #弾の描画処理 31 if item.y < 0: #弾が画面外に出た場合 32 c.pop(i) #弾の削除 33 34 35 36 ###e.move_ip(0, mv2) #敵の移動処理 # 削除 37 ###pygame.draw.rect(screen, (0, 0, 255), e) #敵の描画処理 # 削除 38 j += 1 #カウンタ増加 39 if j > cnt : #出現間隔チェック 40 ###e = Rect(random.randrange(0, w), 0, pw, ph) #敵生成 # 削除 41 enemies.append(Rect(random.randrange(0, w), 0, pw, ph)) ########################################追加 42 j = 0 #カウンタ初期化 43 44 ####################################################################################################追加ここから 45 # 敵の数だけ繰り返し 46 for i,enemy in enumerate(enemies): 47 # 敵の移動処理 48 enemy.move_ip(0, mv2) 49 pygame.draw.rect(screen, (0, 0, 255), enemy) 50 # 敵が画面外に出た場合 51 if enemy.y > h: 52 enemies.pop(i) 53 ####################################################################################################追加ここまで 54 55 pygame.display.update() #描画の更新 56 57 58 clock.tick(fps) #FPSの設定 59 for event in pygame.event.get(): #イベント処理用の繰り返し 60 if event.type == QUIT: #ウインドウが閉じられた場合 61 return 62 if (event.type == KEYDOWN and event.key == K_ESCAPE): #エスケープキーが押された場合 63 return 64 if event.type == MOUSEMOTION: #マウスが移動した場合 65 x,y = event.pos 66 r.move_ip((x - r.x), (y - r.y)) 67 if event.type == MOUSEBUTTONDOWN and event.button == 1: #マウスをクリックした場合 68 cx,cy = event.pos #クリック時のマウス座標を取得 69 cx += pw/2 70 c.append(Rect(cx, cy, 10, 10)) #円(弾)) 71if __name__ == '__main__': main()

投稿2021/10/17 02:42

nemoplus

総合スコア161

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

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

kei3709

2021/10/18 02:57 編集

わざわざありがとうございます。 実装してみたのですが、画面上に存在できる敵の数が2体までのように思います。一度に画面上に出てくる敵が4,5体程度にしたいのですが、その場合はどこをどのように変更すれば良いでしょうか。返信お待ちしております。
nemoplus

2021/10/18 03:25

なるべく元の実装を変更しないように修正しております。 コメント文「#敵の出現間隔」「#出現間隔チェック」で敵の出現間隔をコントロールしていますので、 この値を小さくしたり、ランダムに変更することでゲーム性が高められるかと思います。
kei3709

2021/10/18 08:01

丁寧にありがとうございます。 「#敵の出現間隔」の値を小さくして敵の数を増やすことができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問