見出し画像

Lesson9 敵キャラをつくろう

割引あり
I'm enemy

突然の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

実行結果1: UFOが出現しました

ゆっくりと動くUFOが出現しましたね。かわいい。

ちょっと喧嘩売ってみましょうか。

実行結果2: 敵に触れるとHPが減ります

ぶつかった瞬間からめちゃめちゃHPが削られますね。
そのままずっと減らされ続けると…

実行結果3: ゲームオーバー画面に

はい、ゲームが終わってしまいましたね。
Enter キーでまたオープニング画面に戻ります。

ちょっとゲームになってきましたね。

では解説に移りたいと思います。

今回も一応有料記事(100円)ですが、X(旧Twitter)でリポストして無料でお読みください★

ここから先は

14,970字

この記事が気に入ったらサポートをしてみませんか?