すぐ影響されるブログ

アニメやマンガにすぐ影響されるミーハーのブログ

【アニメーション】NEW GAME! 観ました。プログラミング始めます。(2-2)【pygame】

f:id:kirintt:20180721174925p:plain
©得能正太郎芳文社NEW GAME!製作委員会

ねねっちは今日も変わらずかわいい。


前回
nagoyanofes.hatenadiary.jp

画面の更新頻度と画像を動かす方法について。

ソースコード

# -*- coding:utf-8 -*-
import pygame   # pygame 使う
from pygame.locals import *   # pygame.localsは略す
import sys   # sys 使う

def main():   # main て名前の関数作る   
    pygame.init()   # pygame 初期化する
    
    SCR_WIDTH,SCR_HEIGHT = 640,480
        # 画面サイズ用の変数
    screen = pygame.display.set_mode((SCR_WIDTH,SCR_HEIGHT))
        # ゲーム画面の設定
    player = pygame.image.load("player_walk.png").convert_alpha()
        # プレイヤー画像はこれ使う  
    player_rect = player.get_rect()
        # プレイヤーの位置情報
    vx = 5   # (New)横方向の移動速度
    vy = 10   # (New)縦方向の移動速度
    
    clock = pygame.time.Clock()
        # (New)プログラムの時間を管理する変数を使う
    
    while (1):   # ループ
        clock.tick(30)
            # (New)画面の更新頻度は1秒間に30回
        player_rect.move_ip(vx, vy)
           # (New)プレイヤーの移動
        if player_rect.left < 0 or player_rect.right > SCR_WIDTH:
            vx = -vx
           # (New)横方向の跳ね返り
        if player_rect.top < 0 or player_rect.bottom > SCR_HEIGHT:
            vy = -vy
           # (New)縦方向の跳ね返り
        pygame.display.update()	# 画面を更新する
        
        screen.fill((0,0,0))   # 画面を黒く
        
        screen.blit(player, player_rect)
            # 画面にプレイヤーを表示する
        
        for event in pygame.event.get():
            # イベント(キー入力等)を設定する
            if event.type == pygame.QUIT:
                # "閉じる"を押した時
                pygame.quit()   # pygame を終了する
                sys.exit()   # python プログラムを終了する
       
if __name__ == '__main__':   # このファイルが直接実行された時
    main()   # 関数 main を実行

実行結果

(プレイヤーの画像はStudio 4D 素材・2D ACG sideviewより)。
f:id:kirintt:20180721171106p:plain

画面左上から斜め下に向かって移動→画面端で跳ね返る

コードの説明

(ご指摘お待ちしております)
既出、コメントアウトだけでわかりそうな箇所は省略。

【20, 24行目】画面の更新頻度

clock = pygame.time.Clock()
   # (New)プログラムの時間を管理する変数を使う

clock.tick(30)
   # (New)画面の更新頻度は1秒間に30回

ゲーム画面の更新頻度について。
画面上ではわかりにくいけど、コメントアウトに書いてある通り1秒間に30回画面を更新する(30fps)設定に。
これを書かない状態では、めちゃくちゃな頻度で画面を更新しまくってるらしい。

【15~18, 26~32, 36行目】プレイヤー画像の移動、跳ね返り

# 15-18
    player_rect = player.get_rect()
        # (New)プレイヤーの位置情報
    vx = 5   # (New)横方向の移動速度
    vy = 10   # (New)縦方向の移動速度

# 26-32
        player_rect.move_ip(vx, vy)
           # (New)プレイヤーの移動
        if player_rect.left < 0 or player_rect.right > SCR_WIDTH:
            vx = -vx
           # (New)横方向の跳ね返り
        if player_rect.top < 0 or player_rect.bottom > SCR_HEIGHT:
            vy = -vy

# 36
        screen.fill((0,0,0))   # 画面を黒く

プレイヤーの画像を時間経過で移動させる。
もしも画面端まで行ったら跳ね返る。
これらを繰り返す。

ミスったところ

38行目:変数の書き換え忘れ

        screen.blit(player, player_rect)

前回は、下記のように書いた。

        screen.blit(player, player.get_rect())

最初はこれをそのまま使っており、プレイヤーが動かなかった。

これは、26行目

        player_rect.move_ip(vx, vy)

が反映されていないため。

36行目:screen.fill 入れ忘れた

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

これを書き忘れてた。プレイヤー画像が重ねて表示されまくった。

f:id:kirintt:20180721172914p:plain

参考サイト

Pygameでゲーム作成 - Qiita
 ☝大きな流れはこちらを参考にしています。
画像の移動と跳ね返り処理 - 人工知能に関する断創録
 ☝ほとんどこの記事を参考にしました。ありがとうございます。
rect - Pygameドキュメント 日本語訳
 ☝move_ip を含む pygame.Rect 系の関数について記載されています。
Studio 4D 素材・2D ACG sideview
 ☝プレイヤーの画像を使用させて頂きました。ありがとうございます。