Lesson17 ゲームフェーズをつくろう
割引あり
前回まででシューティングゲームの形はほぼ完成です。
今回は、プログラム全体の構造を大きく変えることになります。
というのも、今のところステージ1が始まると同時にすべての敵キャラが出現しますよね。別にそれはそれでいいのですが、どうせならある程度順番に敵が出てくるようにしたいところです。
そこで今回導入するのが、「ゲームフェーズ」です。
例えば、敵Aを倒したら次の敵が出現するという具合にフェーズを構築します。
ではやっていきましょう。
stage1.py
#### stage1.py ####
############################################################################################
#### ライブラリの読み込み ####
############################################################################################
#### メインプログラム ####
def main(hp,mp,idx): # 追加済み
########################################################################################
#### 初期設定 ####
phase_count = 1
new_create = True
original_bomb = pygame.image.load("image/bakuhatsu3.png")
image_bomb = pygame.transform.scale(original_bomb, (100, 100))
########################################################################################
## 省略 ##
########################################################################################
#### ザコ敵のスプライト ####
#★★ 関数に入れて、一部修正 ★★
def blue_enemy_create():
blue_enemy_width = 100
blue_enemy_height = 100
image1 = pygame.image.load("image/alien_ufo.png")
image_blue_enemy = pygame.transform.scale(image1, (blue_enemy_width, blue_enemy_height))
# 削除 image2 = pygame.image.load("image/bakuhatsu3.png")
# 削除 image_bomb = pygame.transform.scale(image2, (blue_enemy_width, blue_enemy_height))
blue_enemy_params = {
'x': 600,
'y': 30,
'image': image_blue_enemy,
'image_bomb': image_bomb,
'speed_x': 0,
'speed_y': 1,
'rotation_speed': 0,
'start_angle': 0,
'atk': 1.0,
'enemy_hp': 5,
'size_multiplier': 1.0,
}
blue_enemy = Enemy(**blue_enemy_params)
single_enemies.add(blue_enemy)
return blue_enemy
def single_enemy(hp): # 追加済み
## 省略 ##
return hp # 追加済み
########################################################################################
## 省略 ##
########################################################################################
#### 同じ敵を複数作る場合 ####
#### エネミーのスプライト ####
#★★ 関数に入れる ★★
def white_enemy_create():
white_enemy_width = 100
white_enemy_height = 100
image3 = pygame.image.load("image/character_fish_ika.png")
image_white = pygame.transform.scale(image3, (white_enemy_width, white_enemy_height))
white_enemy_params = [
{'x': 500, 'y': 10, 'image': image_white, 'image_bomb': image_bomb, 'speed_x': -1, 'speed_y': 1,'rotation_speed':5,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
{'x': 500, 'y': 400, 'image': image_white, 'image_bomb': image_bomb, 'speed_x': -1, 'speed_y': 0,'rotation_speed':10,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
{'x': 500, 'y': 710, 'image': image_white, 'image_bomb': image_bomb, 'speed_x': -1, 'speed_y': -1,'rotation_speed':-10,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
{'x': 920, 'y': 10, 'image': image_white, 'image_bomb': image_bomb, 'speed_x': -2, 'speed_y': 1,'rotation_speed':5,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
{'x': 920, 'y': 300, 'image': image_white, 'image_bomb': image_bomb, 'speed_x': -2, 'speed_y': 0,'rotation_speed':5,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
{'x': 920, 'y': 710, 'image': image_white, 'image_bomb': image_bomb, 'speed_x': -2, 'speed_y': -1,'rotation_speed':5,'start_angle':45,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
]
# パラメータを元に生成
for params in white_enemy_params:
white_enemy = Enemy(**params)
white_enemies.add(white_enemy)
def white(hp): # 追加済み
## 省略 ##
return hp # 追加済み
########################################################################################
#### ボスキャラのスプライト ####
#★★ 関数に入れる ★★
def boss_enemy_create():
boss_width = 200
boss_height = 200
image1 = pygame.image.load("image/space_kaseijin.png")
image_boss = pygame.transform.scale(image1, (boss_width, boss_height))
image2 = pygame.image.load("image/bakuhatsu4.png")
image_bomb = pygame.transform.scale(image2, (boss_width, boss_height))
boss_enemy_params = {
'x': 780,
'y': 360,
'image': image_boss,
'image_bomb': image_bomb,
'speed_x': 0,
'speed_y': 0,
'rotation_speed': 5,
'start_angle': -90,
'atk': 5,
'enemy_hp': 5,
'size_multiplier': 1.0,
'dead_flag': False,
'circle_R': 100
}
boss_enemy = BossEnemy(**boss_enemy_params)
single_enemies.add(boss_enemy)
########################################################################################
## 省略 ##
########################################################################################
#### ゲームループ ####
while True: # 追加済み
## 省略 ##
#### ステージごとに変える要素 ####
if phase_count ==1:
if new_create:
white_enemy_create()
new_create = False
hp = white(hp)
if phase_count ==2:
if new_create:
blue_enemy = blue_enemy_create()
new_create = False
hp = single_enemy(hp)
hp = clone(hp,frame_count,clone_enemies)
if phase_count == 3:
if new_create:
boss_enemy_create()
new_create = False
hp = single_enemy(hp)
#削除 hp = white(hp)
#削除 hp = single_enemy(hp)
#削除 hp = clone(hp,frame_count,clone_enemies)
hp,fire = clone_bullet(hp,frame_count,new_bullets,fire) # 追加済み
first_player() # 追加済み
## 省略 ##
## ステージクリア ##
total_enemies = len(single_enemies.sprites()) + len(clone_enemies.sprites()) + len(white_enemies.sprites())
if total_enemies == 0:
phase_count += 1
new_create = True
if phase_count == 4:
pygame.display.update()
pygame.time.delay(1500)
idx = 2
return hp, mp, idx
pygame.display.update() # 追加済み
if player_turn == False: # 追加済み
frame_count += 1 # 追加済み
clock.tick(30) # 追加済み
########################################################################################
はい。激長です。
すでに記述した部分を大きく修正しています。
わかりにくい部分もありますね。
基本的な貼り付け方として、今回の追加部分をそのまま追記してからダブりのコードを削除していくようにしてください。
また前回までに追加済みで今回変更しないでいいコードは「追加済み」か「## 省略 ##」と書いてあります。
上手に変更できたら下記を実行してください。
>python main.py
実行がうまくいけば下記のようになります。
どうですか?ゲームっぽいでしょ?
解説は激長になります。心してお進みください。
ここから先は
18,321字
この記事が気に入ったらチップで応援してみませんか?