1. ホーム
  2. Python

[コード】pygame 学習

2022-02-14 17:27:20
<パス

記事目次

効果

コード

import pygame
import random
from pygame.locals import *

# Pygame provides a base class called Sprites, for drawing purposes. surface is considered a blank sheet of paper, and Rects are representations of rectangular areas in Surface.
class Player(pygame.sprite:)
    def __init__(self):
        super(Player, self). __init__()
        self.image = pygame.image.load('jet.png').convert()
        self.image.set_colorkey((255, 255, 255), RLEACCEL)
        self.rect = self.image.get_rect()

    # Define the keys
    def update(self, pressed_keys):
        if pressed_keys[K_UP]:
            self.rect.move_ip(0, -2)
        if pressed_keys[K_DOWN]:
            self.rect.move_ip(0, 2)
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-2, 0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(2, 0)

        # out of screen range to correct
        if self.rect.left < 0:
            self.rect.left = 0
        elif self.rect.right > 800:
            self.rect.right = 800
        if self.rect.top <= 0:
            self.rect.top = 0
        elif self.rect.bottom >= 600:
            self.rect.bottom = 600

# Define the enemy class
class Enemy(pygame.sprite:)
    def __init__(self):
        super(Enemy, self). __init__()
        self.image = pygame.image.load('missile.png').convert()
        self.image.set_colorkey((255, 255, 255), RLEACCEL)
        self.rect = self.image.get_rect(
            center=(random.randint(820, 900), random.randint(0, 600)))
        self.speed = random.randint(1, 2)

    def update(self):
        self.rect.move_ip(-self.speed, 0)
        # If out of bounds, remove and not rendered again
        if self.rect.right < 0:
            self.kill()

# Define the background class
class Cloud(pygame.sprite:)
    def __init__(self):
        super(Cloud, self). __init__()
        self.image = pygame.image.load('cloud.png').convert()
        self.image.set_colorkey((0, 0, 0), RLEACCEL)
        self.rect = self.image.get_rect(center=(
            random.randint(820, 900), random.randint(0, 600))
        )

    def update(self):
        self.rect.move_ip(-2, 0)
        if self.rect.right < 0:
            self.kill()

# Initialize pygame
pygame.init()

# Create a canvas and pass the width and height
screen = pygame.display.set_mode((800, 600))

# Create custom events
ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY, 1000)
ADDCLOUD = pygame.USEREVENT + 2
pygame.time.set_timer(ADDCLOUD, 1000)

# Create a class
player = Player()

background = pygame.Surface(screen.get_size())
background.fill((135, 206, 250))

# Group is a collection of Sprites
enemies = pygame.sprite.Group()
clouds = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)

# The main game loop
running = True

while running:
    # Iterate through the event queue
    for event in pygame.event.get():
        # Detect KEYDOWN events: KEYDOWN is a constant defined in pygame.locals, which is imported at the beginning of the pygame.locals file
        if event.type == KEYDOWN:
            # If Esc is pressed then the main loop terminates
            if event.key == K_ESCAPE:
                running = False
        # Detect QUIT: If QUIT, terminate main loop
        elif event.type == QUIT:
            running = False

        elif event.type == ADDENEMY:
            new_enemy = Enemy()
            enemies.add(new_enemy)
            all_sprites.add(new_enemy)

        elif event.type == ADDCLOUD:
            new_cloud = Cloud()
            all_sprites.add(new_cloud)
            clouds.add(new_cloud)

    screen.blit(background, (0, 0))
    pressed_keys = pygame.key.get_pressed()
    player.update(pressed_keys)
    enemies.update()
    clouds.update()
    for entity in all_sprites:
        screen.blit(entity.image, entity.rect)

    if pygame.sprite.spritecollideany(player, enemies):
        player.kill()

    pygame.display.flip()



ナレッジポイント

ここでは簡単な説明しかしていませんので、自分で理解してください。具体的な内容は末尾のリンク先を参照するか、わからない場合は

ブリット&フリップ

blit() は、作成した Surface を別の Surface に Blit(描画)します。blit() は、描画する Surface とソース Surface の座標の 2 つの引数を取ります。フリップは最後のフリップから画面全体を更新し、フリップの間に行われた変更が画面に表示されます。

ユーザー入力

pygameのイベントメソッドの1つ、pygame.event.get_pressed()です。get_pressed()メソッドは、すべてのキーストローク・イベントの辞書を含むキューを返し、それをメインループに入れることで、各フレームのキーストロークを取得することができます。

スプライト

スプライトは、画面上のものを2次元で表現したものです。基本的にスプライトは画像であり、Pygameはスプライトという基底クラスを提供し、画面に表示したいオブジェクトの1つまたは複数のグラフィック表現を含むように拡張するために使用されます。

グループ

GroupsはSpriteのコレクションで、sprite.Groupsには衝突や更新を助ける組み込みメソッドがいくつかあるので、この方法が推奨されます。スプライトを追加するには、add()を使用します。

イベントのカスタマイズ

数秒ごとに敵のバッチを作成するカスタムイベントを作成します。このイベントは、キーストロークや終了イベントをリッスンするのと同じ方法でリッスンすることになります。

コンフリクト

pygame.sprite は関数 spritecollideany() を提供します。これは Sprite オブジェクトと Sprite.Group を受け取り、Sprite オブジェクトが Sprite グループ内の他の Sprit と衝突しているかどうかを検出するものです。

if pygame.sprite.spritecollideany(player,enemies):
    player.kill()


画像

Surfaceオブジェクトを画像に置き換えたいと思います。pygame.image.load()を使って画像へのパスをインポートします。load()メソッドはSurfaceオブジェクトを返します。次に、このSurfaceオブジェクトに対してconvert()を呼び、コピーを作成することで、より速く画面に描画することができます。
set_colorkeyは画像の色を設定するのに使います。そうしないとPygameは画像を透明に設定します。ここでは、平面の背景色と同じ白を選びました。rleaccelはオプションのパラメータで、非アクセラレーションモニタでPyGameのレンダリングを速くするのに役立ちます。

class Player(pygame.sprite:)
    def __init__(self):
        super(Player,self). __init__()
        self.image = pygame.image.load('jet.png').convert()
        self.image.set_colorkey((255,255,255),RLEACCEL)
        self.rect = self.image.get_rect()


参考リンク

小さなゲームを一から開発する PyGameを使い始める
PyGame - 入門編