見出し画像

Lesson22 特殊能力を使おう

割引あり

アイテムの使用、武器の変更まで来ました。

最後に「とくしゅ」コマンドの実装に移ります。

まず今回画像データを追加します。
最初にダウンロードしたものには含まれませんので、必ずダウンロードしてください。
ダウンロードしたら、 >game >image フォルダに入れといてください。

ではプログラムを変更していきましょう。
今回は2つのプログラムを変更します。

enemy.py

    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 = self.original_image      # 
        self.image_bomb = image_bomb            # 追加済み
        self.speed_x = speed_x                  # 追加済み
        self.speed_y = speed_y                  # 追加済み

    ## 省略 ##

    #### 折り返し関数 ####
    def turn(self,player,damage_base):
        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    # 追加済み
        if pygame.sprite.collide_mask(self, player) and damage_base == 0: # 
            self.speed_x = self.speed_x * -1    # 
            self.speed_y = self.speed_y * -1    # 

player.py

class Player(pygame.sprite.Sprite):

    ## 省略 ##

    # +字キーで上下左右に移動する関数
    def handle_input_carsol(self,speeder):          # 
        player_speed = 5 * speeder                  # 
        keys = pygame.key.get_pressed()             # 追加済み
        if keys[pygame.K_LEFT] or keys[pygame.K_a]: # 追加済み
            self.move(-player_speed, 0)             # 追加済み
        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:# 追加済み
            self.move(player_speed, 0)              # 追加済み
        if keys[pygame.K_UP] or keys[pygame.K_w]:   # 追加済み
            self.move(0, -player_speed)             # 追加済み
        if keys[pygame.K_DOWN] or keys[pygame.K_s]: # 追加済み
            self.move(0, player_speed)              # 追加済み

stage1.py

#### stage1.py ####

############################################################################################
#### ライブラリの読み込み ####


############################################################################################
#### メインプログラム ####
def main(hp,mp,idx,weapons,itemBag,special):            # 追加済み

    ########################################################################################
    #### 初期設定 ####

    ## 省略 ##

    speeder = 1                                         # 
    special_time = 0                                    # 

    ########################################################################################
    #### プレイヤーのスプライト ####
    player_width = 45        # 追加済み
    player_height = 40       # 追加済み 
    image0 = pygame.image.load("image/player1.png")                                 # 追加済み
    image_barrier = pygame.image.load("image/player_barrier.png")                   # 
    image_player = pygame.transform.scale(image0, (player_width, player_height))    # 追加済み

    ## 省略 ##
   
    ########################################################################################
    #### ザコ敵のスプライト ####

    ## 省略 ##

    def single_enemy(hp):                                           # 追加済み
        for single_enemy in single_enemies:                         # 追加済み
            single_enemy.turn(player,damage_base)                 # 
            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                                                   # 追加済み
    
    ########################################################################################
    #### ザコ敵のクローンスプライト ####

    ## 省略 ##
    
        for clone_enemy in clone_enemies:                       # 追加済み
            clone_enemy.turn(player,damage_base)              # 
            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(player,damage_base)              # 
            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                                               # 追加済み

    ########################################################################################
    #### 特殊能力関数 ####
    def special_effect(player,item_name,speeder,damage_base):   # 
        if item_name == "Bigger":                               # 
            player_width = 45 * 2                               # 
            player_height = 40 * 2                              # 
            image_player = pygame.transform.scale(image0, (player_width, player_height))    # 
            print("Special_NO.1")                               # 
            player.original_image = image_player                # 
        elif item_name == "Smaller":                            # 
            player_width = 45 * 0.5                             # 
            player_height = 40 * 0.5                            # 
            image_player = pygame.transform.scale(image0, (player_width, player_height))    # 
            print("Special_NO.2")                               # 
            player.original_image = image_player                # 
        elif item_name == "Speeder":                            # 
            print("Special_NO.3")                               # 
            speeder = 1.8                                       # 
        elif item_name == "Barrier":                            # 
            player_width = 45                                   # 
            player_height = 45                                  # 
            image_player = pygame.transform.scale(image_barrier, (player_width, player_height)) # 
            print("Special_NO.4")                               # 
            player.original_image = image_player                # 
            damage_base = 0                                     # 
        return speeder,damage_base                              # 


    ########################################################################################
    #### ゲームループ ####
    while True:
        ## 省略 ##
        #### キー操作設定 ####
        # 単押し
        for event in pygame.event.get():        # 追加済み
            ## 省略 ##
            if event.type == pygame.KEYDOWN:     # 追加済み
                ## 省略 ##
                if event.key == pygame.K_SPACE:   # 追加済み
                    if player_turn:
                        if command_mode == False:   # 追加済み
                            ## 省略 ##
                        else:
                            ## 省略 ##
                            else:
                                if selected_button == 1:                                # 追加済み
                                    print("selected_button = 1 , selected_item_name = ",selected_item_name)
                                    weapon_param ,damage = change_weapons(selected_item_name,weapon_param,damage)   # 追加済み
                                elif selected_button == 2:                              # 追加済み
                                    print("selected_button = 2 , selected_item_name = ",selected_item_name)
                                    hp,mp,selected_item_name,damage = use_item(hp,mp,selected_item_name,damage) # 追加済み
                                    # 削除 selected_item = 1                            # 削除
                                elif selected_button == 3:                              # 追加済み
                                    print("selected_button = 3 , selected_item_name = ",selected_item_name)
                                    speeder,damage_base = special_effect(player,selected_item_name,speeder,damage_base) # 
                                selected_item = 1                                       # 
                                special_time = frame_count                              # 
                                command_mode = False                                    # 追加済み
                                player_turn = False                                     # 追加済み
                    else:
                        selected_button = 1                                     # 追加済み
                        player_turn = True                                      # 追加済み

        # 長押し
        if not player_turn:                         # 追加済み
            player.handle_input_carsol(speeder)   # 

        ## 省略 ##


        ## 特殊能力タイムオーバー ##
        if frame_count - special_time == 150:       # 
            special_time = 0                        # 
            image_player = pygame.transform.scale(image0, (player_width, player_height))    # 
            player.original_image = image_player    # 
            speeder = 1                             # 
            damage_base = 1                         # 
        
        ## ゲームオーバー ##
        
        ## 省略 ##

変更箇所が多いので、注意しながら貼り付けてください。
貼り付けられたら以下を実行してください。

>python main.py


実行したらゲームを開始してください。
コマンド選択から「とくしゅ」を選択しましょう。

実行結果1: 「Bigger」を選択すると
実行結果2: でっかくなります
実行結果3: 「Smaller」を選択すると
実行結果4: ちっちゃくなります
実行結果5: 「Speeder」を選択すると
実行結果6: 素早くなります
実行結果7: 「Barrier」を選択すると
実行結果8: バリア―が張られます

バリア―を張ると、敵が跳ね返っていくので試してみてください★

ちなみにどの特殊能力も5秒ほどで効果は消えます。
これで特殊能力の実装が完成です。


それでは解説に移ります。Ⅹ(旧Twitter)で拡散してお進みください。

ここから先は

22,155字

この記事が気に入ったらチップで応援してみませんか?