![見出し画像](https://assets.st-note.com/production/uploads/images/128930943/rectangle_large_type_2_b20afc12b706153702594ab0be02c315.png?width=1200)
Lesson9 敵キャラをつくろう
割引あり
![](https://assets.st-note.com/img/1706244382315-G5tPZ93FIa.png)
突然のUFOで恐縮です。
今回はコチラのUFOを敵キャラとしてゲーム内に出現させていきます。
まず必要なものをそろえましょう。セットでダウンロード済みの方は先へお急ぎください。
画像データ
ソースファイル(プログラムを書くファイルのこと)
######## enemy.py ########
# ここに敵キャラの基本形式を設定します
############################################################################################
#### ライブラリの読み込み ####
############################################################################################
# 敵キャラの基本設定
############################################################################################
# ボスキャラの基本設定
############################################################################################
いつものように空っぽです。ここに書いていきましょう。
enemy.py
#### enemy.py ####
############################################################################################
#### ライブラリの読み込み ####
import pygame
import math
import pygame.time
############################################################################################
# 敵キャラの基本設定
class Enemy(pygame.sprite.Sprite):
#### 初期設定 ####
def __init__(self, x, y, image, image_bomb, speed_x ,speed_y,rotation_speed,start_angle,atk,enemy_hp,size_multiplier):
super().__init__()
self.x = x
self.y = y
self.original_image = image
self.image_bomb = image_bomb
self.speed_x = speed_x
self.speed_y = speed_y
self.start_angle = start_angle
self.rotation_speed = rotation_speed
self.atk = atk
self.size = size_multiplier
self.angle = start_angle
self.rect = self.original_image.get_rect(center=(self.x, self.y))
self.path = [(self.x, self.y)]
self.enemy_hp = enemy_hp
self.bomb = False
#### 再表示関数 ####
def update(self,player_turn):
if player_turn == False:
self.angle = self.angle + self.rotation_speed
self.x = self.x + self.speed_x
self.y = self.y + self.speed_y
else:
self.angle = self.angle
self.x = self.x
self.y = self.y
if self.enemy_hp > 0:
rotate_image = pygame.transform.rotozoom(self.original_image, self.angle, self.size)
self.rect = rotate_image.get_rect(center=(self.x, self.y))
self.image = rotate_image
self.path.append((self.x, self.y))
else:
self.image =self.image_bomb
self.speed_x = 0
self.speed_y = 0
self.rect = self.image.get_rect(center=(self.x, self.y))
if pygame.time.get_ticks()>self.explosion_time:
self.kill()
#### 描画関数 ####
def draw(self, screen):
screen.blit(self.image, self.rect.topleft)
#### 軌跡関数 ####
def draw_path(self, screen):
pygame.draw.lines(screen, (255, 0, 0), False, self.path, 2)
#### ダメージ計算関数 ####
def attack_damage(self, damage):
self.enemy_hp -= damage
if self.enemy_hp <= 0:
self.explosion_time = pygame.time.get_ticks() + 500
############################################################################################
コピペできたら保存しましょう。
続いて、stage.py にも追記していきます。
stage1.py
#### stage1.py ####
############################################################################################
#### ライブラリの読み込み ####
from enemy import Enemy
############################################################################################
#### メインプログラム ####
def main(hp,mp,idx): # 追加済み
########################################################################################
#### 初期設定 ####
single_enemies = pygame.sprite.Group()
########################################################################################
#### プレイヤーのスプライト ####
########################################################################################
#### コマンドボタンのスプライト ####
########################################################################################
#### 壁のスプライト ####
########################################################################################
#### ザコ敵のスプライト ####
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': -1,
'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)
def single_enemy(hp):
for single_enemy in single_enemies:
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
########################################################################################
#### ゲームループ ####
while True: # 追加済み
screen.fill((0, 0, 0)) # 追加済み
#### ステージ共通の要素 ####
command_button() # 追加済み
square_structure() # 追加済み
#### ステージごとに変える要素 ####
hp = single_enemy(hp)
first_player() # 追加済み
保存できましたか?では下記を実行しましょう。
>python main.py
![](https://assets.st-note.com/img/1706325929222-h7rJ7WDCAj.png?width=1200)
ゆっくりと動くUFOが出現しましたね。かわいい。
ちょっと喧嘩売ってみましょうか。
![](https://assets.st-note.com/img/1706326389725-i7FSW7BhzX.png?width=1200)
ぶつかった瞬間からめちゃめちゃHPが削られますね。
そのままずっと減らされ続けると…
![](https://assets.st-note.com/img/1706326393151-P9P5ba7P0n.png?width=1200)
はい、ゲームが終わってしまいましたね。
Enter キーでまたオープニング画面に戻ります。
ちょっとゲームになってきましたね。
では解説に移りたいと思います。
今回も一応有料記事(100円)ですが、X(旧Twitter)でリポストして無料でお読みください★
ここから先は
14,970字
この記事が気に入ったらチップで応援してみませんか?