14
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pygameとは

pygameは、Pythonでゲームを作るためのライブラリ。
SDL(Simple DirectMedia Layer)のラッパーで、2Dゲーム開発に最適。

C++やRustでゲーム作るのはハードル高いけど、pygameなら簡単に始められる。

pip install pygame

基本構造

pygameゲームの基本構造:

import pygame

# 1. 初期化
pygame.init()

# 2. 画面設定
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()

# 3. ゲームループ
running = True
while running:
    # イベント処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    # 状態更新
    # ...
    
    # 描画
    screen.fill((0, 0, 0))  # 黒で塗りつぶし
    pygame.display.flip()
    
    # フレームレート制御
    clock.tick(60)

# 4. 終了
pygame.quit()

画面表示

# 画面作成
screen = pygame.display.set_mode((800, 600))

# フルスクリーン
screen = pygame.display.set_mode((800, 600), pygame.FULLSCREEN)

# リサイズ可能
screen = pygame.display.set_mode((800, 600), pygame.RESIZABLE)

# タイトル設定
pygame.display.set_caption("Game Title")

# アイコン設定
icon = pygame.image.load("icon.png")
pygame.display.set_icon(icon)

図形描画

# 色定義(RGB)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# 画面クリア
screen.fill(BLACK)

# 矩形
pygame.draw.rect(screen, RED, (x, y, width, height))

# 円
pygame.draw.circle(screen, GREEN, (center_x, center_y), radius)

# 線
pygame.draw.line(screen, BLUE, (x1, y1), (x2, y2), width)

# 多角形
points = [(100, 100), (200, 50), (300, 100), (200, 200)]
pygame.draw.polygon(screen, WHITE, points)

# 楕円
pygame.draw.ellipse(screen, RED, (x, y, width, height))

イベント処理

for event in pygame.event.get():
    # 終了
    if event.type == pygame.QUIT:
        running = False
    
    # キーが押された瞬間
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_ESCAPE:
            running = False
        elif event.key == pygame.K_SPACE:
            player.jump()
    
    # キーが離された瞬間
    elif event.type == pygame.KEYUP:
        pass
    
    # マウスクリック
    elif event.type == pygame.MOUSEBUTTONDOWN:
        pos = event.pos  # (x, y)
        if event.button == 1:  # 左クリック
            shoot()
    
    # マウス移動
    elif event.type == pygame.MOUSEMOTION:
        mouse_x, mouse_y = event.pos

押しっぱなしの検出

# キーボード
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    player_x -= 5
if keys[pygame.K_RIGHT]:
    player_x += 5
if keys[pygame.K_UP]:
    player_y -= 5
if keys[pygame.K_DOWN]:
    player_y += 5

# マウス
mouse_buttons = pygame.mouse.get_pressed()
if mouse_buttons[0]:  # 左ボタン
    shoot()

mouse_pos = pygame.mouse.get_pos()

画像

# 画像読み込み
image = pygame.image.load("player.png")

# 透過PNG対応
image = pygame.image.load("player.png").convert_alpha()

# 描画
screen.blit(image, (x, y))

# リサイズ
image = pygame.transform.scale(image, (new_width, new_height))

# 回転
rotated = pygame.transform.rotate(image, angle)

# 反転
flipped = pygame.transform.flip(image, True, False)  # 水平反転

テキスト

# フォント初期化
pygame.font.init()

# フォント作成
font = pygame.font.SysFont(None, 48)  # システムフォント
font = pygame.font.Font("myfont.ttf", 48)  # カスタムフォント

# テキストレンダリング
text_surface = font.render("Score: 100", True, WHITE)

# 描画
screen.blit(text_surface, (10, 10))

# 中央配置
text_rect = text_surface.get_rect(center=(400, 300))
screen.blit(text_surface, text_rect)

サウンド

# ミキサー初期化
pygame.mixer.init()

# 効果音
sound = pygame.mixer.Sound("shoot.wav")
sound.play()

# BGM
pygame.mixer.music.load("bgm.mp3")
pygame.mixer.music.play(-1)  # -1でループ
pygame.mixer.music.set_volume(0.5)
pygame.mixer.music.stop()

衝突判定

Rect(矩形)

# Rect作成
player_rect = pygame.Rect(x, y, width, height)
enemy_rect = pygame.Rect(ex, ey, ew, eh)

# 衝突判定
if player_rect.colliderect(enemy_rect):
    print("衝突!")

# 点との衝突
if player_rect.collidepoint(mouse_pos):
    print("クリックされた!")

# 複数との衝突
enemies = [enemy1_rect, enemy2_rect, enemy3_rect]
hit_index = player_rect.collidelist(enemies)
if hit_index != -1:
    print(f"Enemy {hit_index} と衝突")

Rectの便利なプロパティ

rect = pygame.Rect(100, 200, 50, 30)

rect.x, rect.y          # 左上座標
rect.width, rect.height # サイズ
rect.center             # 中心座標
rect.centerx, rect.centery
rect.top, rect.bottom   # 上下端
rect.left, rect.right   # 左右端

スプライト

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("player.png")
        self.rect = self.image.get_rect()
        self.rect.center = (400, 300)
        self.speed = 5
    
    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

# グループで管理
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

# ゲームループ内
all_sprites.update()
all_sprites.draw(screen)

# グループ同士の衝突
hits = pygame.sprite.groupcollide(bullets, enemies, True, True)

完全なサンプル:動くプレイヤー

import pygame

pygame.init()

# 設定
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Simple Game")
clock = pygame.time.Clock()

# プレイヤー
player_x, player_y = 400, 300
player_size = 50
player_speed = 5
player_color = (255, 0, 0)

# ゲームループ
running = True
while running:
    # イベント処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
    
    # キー入力
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        player_x -= player_speed
    if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        player_x += player_speed
    if keys[pygame.K_UP] or keys[pygame.K_w]:
        player_y -= player_speed
    if keys[pygame.K_DOWN] or keys[pygame.K_s]:
        player_y += player_speed
    
    # 画面端の制限
    player_x = max(0, min(player_x, WIDTH - player_size))
    player_y = max(0, min(player_y, HEIGHT - player_size))
    
    # 描画
    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, player_color, 
                     (player_x, player_y, player_size, player_size))
    pygame.display.flip()
    
    clock.tick(60)

pygame.quit()

pygameモジュール一覧

モジュール 用途
pygame.display 画面管理
pygame.event イベント処理
pygame.draw 図形描画
pygame.image 画像読み込み
pygame.mixer サウンド再生
pygame.font テキスト描画
pygame.time 時間・FPS管理
pygame.key キーボード入力
pygame.mouse マウス入力
pygame.sprite スプライト管理

まとめ

pygameでゲームを作る流れ:

  1. 初期化 - pygame.init()
  2. 画面作成 - pygame.display.set_mode()
  3. ゲームループ - while running:
    • イベント処理
    • 状態更新
    • 描画
    • FPS制御
  4. 終了 - pygame.quit()

シンプルなAPIで2Dゲームが作れます!

14
0
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
14
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?