【アニメーション】NEW GAME! 観ました。プログラミング始めます。(2-2)【pygame】
ねねっちは今日も変わらずかわいい。
画面の更新頻度と画像を動かす方法について。
ソースコード
# -*- 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 を実行
コードの説明
(ご指摘お待ちしております)
既出、コメントアウトだけでわかりそうな箇所は省略。
【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))
これを書き忘れてた。プレイヤー画像が重ねて表示されまくった。
参考サイト
・Pygameでゲーム作成 - Qiita
☝大きな流れはこちらを参考にしています。
・画像の移動と跳ね返り処理 - 人工知能に関する断創録
☝ほとんどこの記事を参考にしました。ありがとうございます。
・rect - Pygameドキュメント 日本語訳
☝move_ip を含む pygame.Rect 系の関数について記載されています。
・Studio 4D 素材・2D ACG sideview
☝プレイヤーの画像を使用させて頂きました。ありがとうございます。