1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Day 3: python初心者がダンジョンゲーム作成してみる

Posted at

Day 3: 衝突検出とアニメーション

全体のコード

import pygame
import random

# pygameモジュールの初期化
pygame.init()

# ゲームの設定
# 画面の幅と高さ
screen_width = 800
screen_height = 600

# 共通のサイズ
common_width = 50
common_height = 50

# 画面の作成
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("My Game")

# Playerクラスの定義
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("player.png")
        self.image = pygame.transform.scale(self.image, (common_width, common_height))
        self.rect = self.image.get_rect()
        self.rect.center = (screen_width // 2, screen_height // 2)
        self.speed = 1

        # アニメーションの初期化
        self.images = [
            pygame.image.load("frame1.png"),
            pygame.image.load("frame2.png"),
            pygame.image.load("frame3.png"),
            # 追加のフレーム画像を読み込む
        ]
        self.current_frame = 0
        self.animation_timer = pygame.time.get_ticks()
        self.animation_delay = 200  # フレームの更新間隔(ミリ秒)

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT]:
            self.rect.x += self.speed
        if keys[pygame.K_UP]:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN]:
            self.rect.y += self.speed

    def check_collision(self, enemies, items):
        # プレイヤーと敵の衝突検出
        enemy_collisions = pygame.sprite.spritecollide(self, enemies, True)
        # 衝突した敵の処理を記述

        # プレイヤーとアイテムの衝突検出
        item_collisions = pygame.sprite.spritecollide(self, items, True)
        # 衝突したアイテムの処理を記述

    def animate(self):
        now = pygame.time.get_ticks()
        if now - self.animation_timer > self.animation_delay:
            self.current_frame = (self.current_frame + 1) % len(self.images)
            self.image = self.images[self.current_frame]
            self.animation_timer = now


# Enemyクラスの定義
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("enemy.png")
        self.image = pygame.transform.scale(self.image, (common_width, common_height))
        self.rect = self.image.get_rect()
        self.rect.center = (random.randint(0, screen_width), random.randint(0, screen_height))
        self.speed = 1

    def update(self):
        self.rect.x += self.speed
        if self.rect.left > screen_width:
            self.rect.right = 0
            self.rect.bottom = random.randint(0, screen_height)

    def animate(self):
        pass
    
# Itemクラスの定義
class Item(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("item.png")
        self.image = pygame.transform.scale(self.image, (100, common_height))
        self.rect = self.image.get_rect()
        self.rect.center = (random.randint(0, screen_width), random.randint(0, screen_height))
        self.speed = 1

        # アニメーションの初期化
        self.images = [
            pygame.image.load("item_frame1.png"),
            pygame.image.load("item_frame2.png"),
            pygame.image.load("item_frame3.png"),
            # 追加のフレーム画像を読み込む
        ]
        self.current_frame = 0
        self.animation_timer = pygame.time.get_ticks()
        self.animation_delay = 200  # フレームの更新間隔(ミリ秒)

    def update(self):
        self.rect.x += self.speed
        if self.rect.left > screen_width:
            self.rect.right = 0

    def animate(self):
        now = pygame.time.get_ticks()
        if now - self.animation_timer > self.animation_delay:
            self.current_frame = (self.current_frame + 1) % len(self.images)
            self.image = self.images[self.current_frame]
            self.animation_timer = now

# プレイヤーの作成
player = Player()

# 敵の作成
enemies = pygame.sprite.Group()
for _ in range(5):
    enemy = Enemy()
    enemies.add(enemy)

# アイテムの作成
items = pygame.sprite.Group()
for _ in range(10):
    item = Item()
    items.add(item)

# ゲームループ
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()
    player.check_collision(enemies, items)
    player.animate()

    enemies.update()
    items.update()

    screen.fill((0, 0, 0))

    screen.blit(player.image, player.rect)
    for enemy in enemies:
        screen.blit(enemy.image, enemy.rect)
        enemy.animate()
    for item in items:
        screen.blit(item.image, item.rect)
        item.animate()

    pygame.display.flip()

# ゲームの終了
pygame.quit()

今回の追加

衝突検出について

def check_collision(self, enemies, items):
    enemy_collisions = pygame.sprite.spritecollide(self, enemies, True)
    item_collisions = pygame.sprite.spritecollide(self, items, True)
  • check_collisionメソッドは、プレイヤーと敵、アイテムとの衝突を検出します。

  • pygame.sprite.spritecollide()関数を使用して、プレイヤーと敵、アイテムとの衝突をチェックします。衝突した敵とアイテムはグループから削除されます(Trueパラメータによって指定)。

  • 衝突した敵やアイテムの処理はまだ記述されていませんので、必要に応じてこのメソッドを拡張してください。

アニメーションについて

def animate(self):
    now = pygame.time.get_ticks()
    if now - self.animation_timer > self.animation_delay:
        self.current_frame = (self.current_frame + 1) % len(self.images)
        self.image = self.images[self.current_frame]
        self.animation_timer = now
  • animateメソッドは、プレイヤーのアニメーションを制御します。

  • pygame.time.get_ticks()関数を使用して現在の時刻を取得し、アニメーションの更新間隔を超えた場合にアニメーションを進めます。

  • current_frameを更新し、次のフレームのインデックスを計算します。len(self.images)でフレーム数を取得し、リスト内を循環させるために%演算子を使用しています。

  • current_frameに応じて適切なフレームのイメージを取得し、プレイヤーのイメージを更新します。

  • 最後に、animation_timerを現在の時刻に更新します。

これにより、プレイヤーのアニメーションが指定されたフレーム更新間隔で再生されます。

まとめ

衝突時の処理については、def check_collision(self, enemies, items): に追加で書く必要がありそうです…
animatiionをさらに滑らかにする作業はまだ先でも良さそうだと思いました。いずれ、エフェクトもつけれるようにしたいです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?