Pygameで方向キーを使って動いているキャラクターの向きを変えよう
前回はキャラクターが正面を向いて動いているだけのプログラムでしたが、今回は方向キーを使ってキャラクターの向きを変えるプログラムを作ります。
画像の素材は前回と同じものを使っています。
前回の記事もあわせて参照してください。
Pythonスクリプト
今回のスクリプトは、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
### インポート import sys import pygame from pygame.locals import * ### 定数 WIDTH = 200 # 画面横サイズ HEIGHT = 200 # 画面縦サイズ C_SIZE = 32 # キャラクターサイズ F_POSE = 20 # ポーズフレーム F_RATE = 60 # フレームレート ### 画面定義(X軸,Y軸,横,縦) SURFACE = Rect(0, 0, WIDTH, HEIGHT) ############################ ### キャラクタークラス ############################ class Character(pygame.sprite.Sprite): ### クラス変数 frame = 0 # フレーム flag = 0 # 切り替えフラグ images = [] # 画像リスト ############################ ### 初期化メソッド ############################ def __init__(self, name, x, y): pygame.sprite.Sprite.__init__(self) ### ファイル読み込み all_image = pygame.image.load(name).convert_alpha() ### 画像サイズ取得 self.char_width = all_image.get_width() self.char_height = all_image.get_height() ### キャラクターパターン格納 for i in range(0, self.char_height, C_SIZE): for j in range(0, self.char_width, C_SIZE): c_pattern = pygame.Surface((C_SIZE, C_SIZE)) c_pattern.blit(all_image, (0,0), (j,i,C_SIZE,C_SIZE)) self.images.append(c_pattern) ### キャラクター初期設定 self.image = self.images[0] self.rect = self.image.get_rect(center=(x,y)) ############################ ### キャラクター更新 ############################ def update(self, way): ### 画像切り替え self.image = self.images[int(self.frame / F_POSE) + way * int(self.char_width / C_SIZE)] if self.flag == 0: self.frame += 1 else: self.frame -= 1 ### 繰り返し(images[0]→[1]→[2]→[1]→[0]→[1]...) if self.frame >= len(self.images) / int(self.char_height / C_SIZE) * F_POSE: self.frame = F_POSE * 2 - 1 self.flag = 1 elif self.frame < 0: self.frame = F_POSE self.flag = 0 ############################ ### キャラクター描画 ############################ def draw(self, surface): surface.blit(self.image, self.rect) ############################ ### メイン関数 ############################ def main(): ### 変数 way = 0 ### 画面初期化 pygame.init() surface = pygame.display.set_mode(SURFACE.size) ### キャラクター作成 char = Character("pipo-charachip030b.png", int(WIDTH/2), int(HEIGHT/2)) ### 時間オブジェクト生成 clock = pygame.time.Clock() ### 無限ループ while True: ### フレームレート設定 clock.tick(F_RATE) ### 背景色設定 surface.fill((0,0,0)) ### スプライト更新 char.update(way) ### スプライト描画 char.draw(surface) ### 画面更新 pygame.display.update() ### イベント取得 for event in pygame.event.get(): ### 終了処理 if event.type == QUIT: exit() if event.type == KEYDOWN: if event.key == K_ESCAPE: exit() ### 方向キー elif event.key == K_DOWN: # 下 way = 0 elif event.key == K_LEFT: # 左 way = 1 elif event.key == K_RIGHT: # 右 way = 2 elif event.key == K_UP: # 上 way = 3 ############################ ### 終了関数 ############################ def exit(): pygame.quit() sys.exit() ############################ ### メイン関数呼び出し ############################ if __name__ == "__main__": ### 処理開始 main() |
スクリプト解説
前回から変更した部分を中心に解説します。
36、37行目
画像のサイズを取得して、クラス内で参照できるようにします。
40~44行目
1段目から順番にすべてのキャラクターパターンをself.imagesリストに追加します。
56行目
入力した方向キーによって、リストの何番目の画像を読み込むかを指定します。
下キーは0~2、左キーは3~5、右キーは6~8、上キーは9~11が入ります。
124~131行目
入力した方向キーによって、画像の何段目を描画するかが決まります。
下キーは正面向き、左キーは左向き、右キーは右向き、上キーは後ろ向きのキャラクターになります。