アイテムを追加する

アイテムを実装し、体力を回復できるようにします。

アイテムクラスの作成

まずは、アイテムのクラスを作成します。

これまでに作成してきたenemyクラスやshotクラスを参考に、ほぼ同じようなクラスを作成します。

import pygame
from pygame.locals import *

import tools

class Item(pygame.sprite.Sprite):
    speed = 5

    def __init__(self, time, x):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image = tools.load_image("data", "item.png", -1)
        self.rect = self.image.get_rect()
        self.rect.center = (x, -24)
        self.frame = 0
        self.exist = False
        self.time = time

    def update(self):
        self.frame += 1
        if self.frame > self.time:
            self.exist = True

        if self.exist == True:
            self.rect.move_ip(0, self.speed)
            if self.rect.top >= 480:
                self.kill()

アニメーションはしないので、アニメーションに関係する変数は削除しています。

基本的な仕組みはenemyクラスと同様、画面外に作成→時間が経つとself.existがTrueとなり移動開始という流れです。

アイテムの画像は、これを使います。

ウサギと言ったらニンジンですよね。

リンゴでもあるのにニンジンを食うとは…

スプライトグループと衝突判定を実装する

アイテムのクラスを作成したら、sample.pyファイルのMainクラスで衝突判定を実装します。

class Main():
    def __init__(self):
        # itemの衝突判定用グループを作成
        self.items = pygame.sprite.Group()
        # グループを登録
        item.Item.containers = self.all, self.items

Mainクラスのコンストラクタで、アイテム用のスプライトグループを作成します。

class Main():
    def __init__(self):
        # アイテムをロード
        self.load_item()

    def load_item(self):
        # アイテムをロードする
        file = os.path.join("data", "item.dat")
        f = open(file, "r", encoding="utf-8")
        for line in f:
            line = line.rstrip()
            data = line.split(",")
            item.Item(int(data[0]), int(data[1]))
        f.close()

続いて、ファイルを読み込んでitemクラスのインスタンスを作成するload_item()関数を作成し、コンストラクタでロードします。

読み込むファイルは、「出現する時間(フレーム数)、x座標」だけです。簡単ですね。

80,120
130,500

最後に、プレイヤーとアイテムとの衝突判定を実装しましょう。

回復時のSEはフリーBGM・音楽素材MusMusさんからお借りしました。

class Main():
    def collision_detection(self):
        # アイテムとの衝突判定
        item_collided = pygame.sprite.spritecollide(self.player, self.items, True)
        if item_collided:
            self.heal_sound.play()
            self.hp.hp += 1

これで、アイテムを実装することができました!

落ちてきたニンジンに接触すると、体力を回復することができるようになりました。

ソースコードのダウンロード