ゲームセットアップとメインループを完了する
次に、ゲームのセットアップを完成させ、すべてのゲームロジックと相互作用が行われるメインゲームループを作成します。
#... (ステップ 4 のコード)
def main(winstyle=0):
#... (前のコード)
## ゲームウィンドウを装飾する
icon = pg.transform.scale(Alien.images[0], (32, 32))
pg.display.set_icon(icon)
pg.display.set_caption("Pygame Aliens")
pg.mouse.set_visible(0)
## 背景を作成し、背景画像をタイル状に配置する
bgdtile = load_image("background.gif")
background = pg.Surface(SCREENRECT.size)
for x in range(0, SCREENRECT.width, bgdtile.get_width()):
background.blit(bgdtile, (x, 0))
screen.blit(background, (0, 0))
pg.display.flip()
## サウンドエフェクトを読み込む
boom_sound = load_sound("boom.wav")
shoot_sound = load_sound("car_door.wav")
if pg.mixer:
music = os.path.join(main_dir, "data", "house_lo.wav")
pg.mixer.music.load(music)
pg.mixer.music.play(-1)
## ゲームグループを初期化する
aliens = pg.sprite.Group()
shots = pg.sprite.Group()
bombs = pg.sprite.Group()
all = pg.sprite.RenderUpdates()
lastalien = pg.sprite.GroupSingle()
## 初期値を作成する
alienreload = ALIEN_RELOAD
clock = pg.time.Clock()
## 初期のスプライトを初期化する
global SCORE
player = Player(all)
Alien(
aliens, all, lastalien
) ## 注:これはスプライトグループに入るため「生きています」
if pg.font:
all.add(Score(all))
## プレイヤーが生きている間、メインループを実行する
while player.alive():
## 入力を取得する
for event in pg.event.get():
if event.type == pg.QUIT:
return
if event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE:
return
if event.type == pg.KEYDOWN:
if event.key == pg.K_f:
if not fullscreen:
print("Changing to FULLSCREEN")
screen_backup = screen.copy()
screen = pg.display.set_mode(
SCREENRECT.size, winstyle | pg.FULLSCREEN, bestdepth
)
screen.blit(screen_backup, (0, 0))
else:
print("Changing to windowed mode")
screen_backup = screen.copy()
screen = pg.display.set_mode(
SCREENRECT.size, winstyle, bestdepth
)
screen.blit(screen_backup, (0, 0))
pg.display.flip()
fullscreen = not fullscreen
keystate = pg.key.get_pressed()
## 最後に描画されたスプライトをクリア/消去する
all.clear(screen, background)
## すべてのスプライトを更新する
all.update()
## プレイヤーの入力を処理する
direction = keystate[pg.K_RIGHT] - keystate[pg.K_LEFT]
player.move(direction)
firing = keystate[pg.K_SPACE]
if not player.reloading and firing and len(shots) < MAX_SHOTS:
Shot(player.gunpos(), shots, all)
if pg.mixer and shoot_sound is not None:
shoot_sound.play()
player.reloading = firing
## 新しいエイリアンを作成する
if alienreload:
alienreload = alienreload - 1
elif not int(random.random() * ALIEN_ODDS):
Alien(aliens, all, lastalien)
alienreload = ALIEN_RELOAD
## 爆弾を落とす
if lastalien and not int(random.random() * BOMB_ODDS):
Bomb(lastalien.sprite, all, bombs, all)
## エイリアンとプレイヤーの間の衝突を検出する
for alien in pg.sprite.spritecollide(player, aliens, 1):
if pg.mixer and boom_sound is not None:
boom_sound.play()
Explosion(alien, all)
Explosion(player, all)
SCORE = SCORE + 1
player.kill()
## 射撃がエイリアンに当たったかどうかを確認する
for alien in pg.sprite.groupcollide(aliens, shots, 1, 1).keys():
if pg.mixer and boom_sound is not None:
boom_sound.play()
Explosion(alien, all)
SCORE = SCORE + 1
## エイリアンの爆弾がプレイヤーに当たったかどうかを確認する
for bomb in pg.sprite.spritecollide(player, bombs, 1):
if pg.mixer and boom_sound is not None:
boom_sound.play()
Explosion(player, all)
Explosion(bomb, all)
player.kill()
## シーンを描画する
dirty = all.draw(screen)
pg.display.update(dirty)
## フレームレートを 40fps に制限する。または 40HZ とも呼ばれ、1 秒間に 40 回という意味です。
clock.tick(40)
if pg.mixer:
pg.mixer.music.fadeout(1000)
pg.time.wait(1000)
## このスクリプトを実行している場合、「main」関数を呼び出す
if __name__ == "__main__":
main()
pg.quit()
メイン関数では、さまざまなエンティティ用のゲームグループを初期化し、初期値を作成し、メインゲームループを実装します。このループ内でゲームロジック、プレイヤーの入力処理、衝突検出、ゲームシーンの描画が行われます。
ゲームの実行
次に、以下のコマンドを実行することでゲームを実行できます。
cd ~/project
python aliens.py