40歳から始めるプログラミング

40歳になったおっさんがゲーム作りを目指すブログです。

Python学習とゲーム作り#12 #11の復習

今回は#11で扱ったコードをもう少し掘り下げてみたいと思います。

import pygame

# pygameの初期化
pygame.init()

# 画面の設定
screen_x, screen_y = 800, 600
screen = pygame.display.set_mode((screen_x, screen_y))
pygame.display.set_caption("Python学習とゲーム作り")

# 色の定義
WHITE = (255, 255, 255)

# キャラクターの読込
img = pygame.image.load("player.png")

# キャラクターの設定
player_width = 240  # 戦車の横サイズ
player_height = 72  # 戦車の縦サイズ
player_x = screen_x // 2 - player_width // 2  # 戦車の初期X位置
player_y = screen_y // 2 - player_height // 2  # 戦車の初期Y位置
player_speed = 5

# 押されているキーを記録するリスト
current_direction = []

# ゲームループ
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 in (pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN):
                if event.key not in current_direction:
                    current_direction.append(event.key)  # キーを押した順番でリストに追加
        elif event.type == pygame.KEYUP:
            if event.key in current_direction:
                current_direction.remove(event.key)  # キーを離した順番でリストから削除

    # 最後に押されたキーを取得
    if current_direction:
        last_direction = current_direction[-1]  # 最後に押されたキーを取得
    else:
        last_direction = None  # すべてのキーが離されたら停止

    # 最後に押されたキーに応じてキャラクターを動かす(斜め移動を防ぐ)
    if last_direction == pygame.K_LEFT:
        player_x -= player_speed
    elif last_direction == pygame.K_RIGHT:
        player_x += player_speed
    elif last_direction == pygame.K_UP:
        player_y -= player_speed
    elif last_direction == pygame.K_DOWN:
        player_y += player_speed

    # 壁に当たった場合止まる
    if player_x < 0:
        player_x = 0 #左端を超えた場合X座標を0にする
    if player_x > screen_x - player_width:
        player_x = screen_x - player_width #画面サイズからキャラクターサイズを引いた値を超えないようにする(X軸)
    if player_y < 0:
        player_y = 0 #左端を超えた場合Y座標を0にする
    if player_y > screen_y - player_height:
        player_y = screen_y - player_height #画面サイズからキャラクターサイズを引いた値を超えないようにする(Y軸)

    # 画面を更新
    screen.fill(WHITE)  # 背景を白にする
    screen.blit(img, (player_x, player_y))  # キャラクターを描画
    pygame.display.update()

    # フレームレート
    pygame.time.Clock().tick(60)

多少補足を追加しました。何がしたいコードなのかというと、基本はウィンドウの枠外に出ないように上下左右に動かすという内容です。途中にあるキーをリストに追加したり削除したりするのは、方向キーを二つ以上同時に押したときの移動をコントロールするためのものです。ドラクエなどの2DRPGは作品によって違いはあるけど、斜めには移動しないのが大半だと思います。例えば左キーと上キーを同時に押すと、#9で扱ったコードだと左斜め上に移動します。それを斜めに移動しないようにするために、方向キーを押された順番にリストに登録し、最後に押されたキーを取得しそのキーの方向に動かすコードになります。上、左、右、下と順番に押したとしましょう。最後に登録された方向キーは下なので、4つの方向キーが同時に押されていても下に動くというわけです。そして下を離すとリストから下が削除され、その次の右がリストの最後になるので右に動きます。全ての方向キーを離すと当然停止します。これで方向キーを複数同時に押しても斜めには移動せず、最期に押した方向キーに移動するコードになりました。私の表現力がかなり残念なのでうまく伝わるといいのですが…😂 今回はここまで!