Lesson16 画面の端で折り返す
前回までのプログラムでは敵キャラが画面外に飛び出して行ってしまいます。しかも見えなくなってるだけなので、全滅判定にならずゲームが破綻します。
そこで今回は敵キャラが外に飛び出ていかないように調整します。
具体的には、キャラの座標(キャラの中央部分)が画面の端を越えようとしたタイミングで
キャラの移動方向を逆に設定しなおします。これで戻ってきます。
さっそくコードを見てみましょう。
enemy.py
#### enemy.py ####
############################################################################################
#### ライブラリの読み込み ####
############################################################################################
# 敵キャラの基本設定
class Enemy(pygame.sprite.Sprite):
#### 初期設定 ####
## 省略 ##
#### 折り返し関数 ####
def turn(self):
if self.x < 0 or self.x > 960:
self.speed_x = self.speed_x * -1
if self.y < 0 or self.y > 720:
self.speed_y = self.speed_y * -1
############################################################################################
stage1.py
#### stage1.py ####
############################################################################################
#### ライブラリの読み込み ####
############################################################################################
#### メインプログラム ####
def main(hp,mp,idx):
## 省略 ##
########################################################################################
#### ザコ敵のスプライト ####
### 省略 ###
def single_enemy(hp):
for single_enemy in single_enemies:
single_enemy.turn()
single_enemy.update(player_turn)
single_enemy.draw(screen)
#single_enemy.draw_path(screen)
attack_enemy = single_enemy
if not player_turn:
hp =player.take_damage(hp,damage_base,attack_enemy)
return hp
########################################################################################
#### ザコ敵のクローンスプライト ####
del_time = 5
def clone(hp,frame_count,clone_enemies):
### 省略 ###
for clone_enemy in clone_enemies:
clone_enemy.turn()
clone_enemy.update(player_turn)
clone_enemy.draw(screen)
attack_enemy = clone_enemy
if not player_turn:
hp =player.take_damage(hp,damage_base,attack_enemy)
if frame_count - clone_enemy.creation_frame >= del_time * 30:
clone_enemies.remove(clone_enemy)
return hp
########################################################################################
#### 同じ敵を複数作る場合 ####
#### エネミーのスプライト ####
### 省略 ###
def white(hp):
for white_enemy in white_enemies:
white_enemy.turn()
white_enemy.update(player_turn)
white_enemy.draw(screen)
#white_enemy.draw_path(screen)
attack_enemy = white_enemy
if not player_turn:
hp =player.take_damage(hp,damage_base,attack_enemy)
return hp
########################################################################################
stage1.py の方は3か所に折り返し関数を記述します。
貼り付けられましたか?
それでは実行してみましょう。
>python main.py
ちょっと画像だとわかりにくいですが、移動式の敵キャラはすべて端っこで折り返してくれるようになりました。
関数はシンプルですし、導入も簡単なのでぜひやってみてね★
それでは解説に移ります。
enemy.py
#### enemy.py ####
class Enemy(pygame.sprite.Sprite):
#### 折り返し関数 ####
def turn(self):
if self.x < 0 or self.x > 960: # x方向で画面外に出たら
self.speed_x = self.speed_x * -1 # 移動速度を反転
if self.y < 0 or self.y > 720: # y方向で画面外に出たら
self.speed_y = self.speed_y * -1 # 移動速度を反転
Enemy クラスの一番下に新しい関数 def turn(self): をつくりました。
内容はシンプルで、横方向(x方向)において、
もしキャラの座標(self.x)が画面の端(左:x=0、右:x=960)を越えたら、キャラの移動指示(self.speed_x)にマイナス1をかけ算します。
すると、左に動いていたら右に、右に動いていたら左に方向転換をする仕組みです。
縦方向(y方向)も同様に条件分岐しています。
stage1.py
#### ザコ敵のスプライト ####
### 省略 ###
def single_enemy(hp): # 追加済み
for single_enemy in single_enemies: # 追加済み
single_enemy.turn() # 画面端で折り返し
single_enemy.update(player_turn) # 追加済み
single_enemy.draw(screen) # 追加済み
#single_enemy.draw_path(screen) # 追加済み
attack_enemy = single_enemy # 追加済み
if not player_turn: # 追加済み
hp =player.take_damage(hp,damage_base,attack_enemy) # 追加済み
return hp # 追加済み
ザコ敵スプライトのゾーンに、関数 single_enemy.turn() というコードを追加します。
これは先ほど enemy.py につくった関数を single_enemy の名前で呼び出しています。これで呼び出した敵キャラがターンしたりしなかったりします。
#### ザコ敵のクローンスプライト ####
del_time = 5 # 追加済み
def clone(hp,frame_count,clone_enemies):
### 省略 ###
for clone_enemy in clone_enemies: # 追加済み
clone_enemy.turn() # 画面端で折り返し
clone_enemy.update(player_turn) # 追加済み
clone_enemy.draw(screen) # 追加済み
attack_enemy = clone_enemy # 追加済み
if not player_turn: # 追加済み
hp =player.take_damage(hp,damage_base,attack_enemy) # 追加済み
if frame_count - clone_enemy.creation_frame >= del_time * 30: # 追加済み
clone_enemies.remove(clone_enemy) # 追加済み
return hp # 追加済み
クローンも同じです。
#### 同じ敵を複数作る場合 ####
#### エネミーのスプライト ####
### 省略 ###
def white(hp):
for white_enemy in white_enemies: # 追加済み
white_enemy.turn() # 画面端で折り返し
white_enemy.update(player_turn) # 追加済み
white_enemy.draw(screen) # 追加済み
#white_enemy.draw_path(screen) # 追加済み
attack_enemy = white_enemy # 追加済み
if not player_turn: # 追加済み
hp =player.take_damage(hp,damage_base,attack_enemy) # 追加済み
return hp # 追加済み
白い敵も同じです。
stage1.py の変更は以上です。ボスキャラは移動しないのでそのままにしてあります。もし移動させるのであれば、他の敵キャラをマネしてみてください。
今回の解説は以上です。
次回、プログラム全体に大きな変更を加えます。
解説激長の超有料記事です。でもまたⅩ(旧Twitter)拡散で無料で読めます。お楽しみに★
解説付きコード
enemy.py
#### enemy.py ####
############################################################################################
#### ライブラリの読み込み ####
############################################################################################
# 敵キャラの基本設定
class Enemy(pygame.sprite.Sprite):
#### 初期設定 ####
## 省略 ##
#### 折り返し関数 ####
def turn(self):
if self.x < 0 or self.x > 960: # x方向で画面外に出たら
self.speed_x = self.speed_x * -1 # 移動速度を反転
if self.y < 0 or self.y > 720: # y方向で画面外に出たら
self.speed_y = self.speed_y * -1 # 移動速度を反転
############################################################################################
stage1.py
#### stage1.py ####
############################################################################################
#### ライブラリの読み込み ####
############################################################################################
#### メインプログラム ####
def main(hp,mp,idx):
## 省略 ##
########################################################################################
#### ザコ敵のスプライト ####
### 省略 ###
def single_enemy(hp): # 追加済み
for single_enemy in single_enemies: # 追加済み
single_enemy.turn() # 画面端で折り返し
single_enemy.update(player_turn) # 追加済み
single_enemy.draw(screen) # 追加済み
#single_enemy.draw_path(screen) # 追加済み
attack_enemy = single_enemy # 追加済み
if not player_turn: # 追加済み
hp =player.take_damage(hp,damage_base,attack_enemy) # 追加済み
return hp # 追加済み
########################################################################################
#### ザコ敵のクローンスプライト ####
del_time = 5 # 追加済み
def clone(hp,frame_count,clone_enemies):
### 省略 ###
for clone_enemy in clone_enemies: # 追加済み
clone_enemy.turn() # 画面端で折り返し
clone_enemy.update(player_turn) # 追加済み
clone_enemy.draw(screen) # 追加済み
attack_enemy = clone_enemy # 追加済み
if not player_turn: # 追加済み
hp =player.take_damage(hp,damage_base,attack_enemy) # 追加済み
if frame_count - clone_enemy.creation_frame >= del_time * 30: # 追加済み
clone_enemies.remove(clone_enemy) # 追加済み
return hp # 追加済み
########################################################################################
#### 同じ敵を複数作る場合 ####
#### エネミーのスプライト ####
### 省略 ###
def white(hp):
for white_enemy in white_enemies: # 追加済み
white_enemy.turn() # 画面端で折り返し
white_enemy.update(player_turn) # 追加済み
white_enemy.draw(screen) # 追加済み
#white_enemy.draw_path(screen) # 追加済み
attack_enemy = white_enemy # 追加済み
if not player_turn: # 追加済み
hp =player.take_damage(hp,damage_base,attack_enemy) # 追加済み
return hp # 追加済み
########################################################################################