アイテムを実装し、体力を回復できるようにします。
アイテムクラスの作成
まずは、アイテムのクラスを作成します。
これまでに作成してきた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
これで、アイテムを実装することができました!
落ちてきたニンジンに接触すると、体力を回復することができるようになりました。