PythonとPygameで作る レトロ風RPG 全コード

同人誌について

 この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。

 同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。

(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)


7-4 スプライト1 キャラクター

公開:2024-04-15

説明と全体コード

 「src/mymod/image/chara.py」の説明です。

 このモジュールで作るCharaクラスは、pygame.sprite.Spriteを継承します。Charaクラスは、キャラクターを描画するためのスプライトです。

 このクラスには、コンストラクター__init__()update()以外に、次のようなメソッドを作ります。

Charaクラスのメソッド

メソッド 説明
set_pos(x, y) 位置をx yに移動。
shake(size) sizeの範囲で画像を揺らす。
end_shake() 揺らすのをやめて初期位置に戻す。
set_size(rate) 比率rateで拡大縮小する。

 キャラクターの画像は、次の用途で利用します。

import pygame
from ..data.app import U, IMAGE_CHARA
from .util import load_chip
imgs: list[pygame.Surface] = []
# キャラクター
class Chara(pygame.sprite.Sprite):
# 初期化
def __init__(self, img_nums: list[int]):
super().__init__()
global imgs
if len(imgs) == 0: imgs = load_chip(IMAGE_CHARA, True) # 画像読み込み
self.images = list(map(lambda n: imgs[n], img_nums)) # 抜粋
self.image = self.images[0]
self.rect = pygame.Rect(0, 0, U, U)
self.is_shake = False
self.base_x = 0
self.base_y = 0
# 位置
def set_pos(self, x: int, y: int):
self.base_x = self.rect.x = x
self.base_y = self.rect.y = y
# サイズ
def set_size(self, rate: int):
self.rect.width = int(U * rate)
self.rect.height = int(U * rate)
# 揺らす
def shake(self, is_shake: bool):
self.is_shake = is_shake
# 更新
def update(self):
t = pygame.time.get_ticks() # 経過時間
i = t // 500 % len(self.images)
image = self.images[i]
size = (self.rect.width, self.rect.height)
self.image = pygame.transform.scale(image, size)
self.rect.x = self.base_x
self.rect.y = self.base_y
if self.is_shake:
t2 = t // 40
self.rect.x += - U // 2 + int(U * (t2 * 11 % 13 / 13))
self.rect.y += - U // 2 + int(U * (t2 * 11 % 17 / 17))

インポート部分

 まずは、インポート部分を示します。

import pygame
from ..data.app import U, IMAGE_CHARA
from .util import load_chip

 data.appから、描画単位Uと、キャラクター画像のパスIMAGE_CHARAを読み込みます。

 画像を分割して読み込むので、utilload_chipを読み込みます。

読み込んだ画像の保持

 読み込んだ画像を保持する変数imgsです。

imgs: list[pygame.Surface] = []

 キャラクターの画像は最初に1度だけ読み込んで分割して、この変数imgsに代入します。

コンストラクター

 クラスの作成からコンストラクターまでを示します。

# キャラクター
class Chara(pygame.sprite.Sprite):
# 初期化
def __init__(self, img_nums: list[int]):
super().__init__()
global imgs
if len(imgs) == 0: imgs = load_chip(IMAGE_CHARA, True) # 画像読み込み
self.images = list(map(lambda n: imgs[n], img_nums)) # 抜粋
self.image = self.images[0]
self.rect = pygame.Rect(0, 0, U, U)
self.is_shake = False
self.base_x = 0
self.base_y = 0

 コンストラクターではまず、親クラスSprite__init__()関数を実行します。

 続いて、global imgsで、関数外の変数imgsに値を設定可能にします。そして変数imgsの要素数が0なら、画像を読み込んで分割して、変数imgsに代入します。

 この変数imgsの画像から、img_numsの参照位置の画像を抜き出して、キャラクターで使う画像のリストを作り、self.imagesに代入します。

 次に、コンストラクター内で重要なのはself.imageself.rectです。これらの値は、Spriteクラスの処理で利用されます。

 self.is_shakeは、画像を揺らしているかのフラグです。

 self.base_x self.base_yの値は、画像を揺らしたあと、元の位置に戻すのに使います。

位置

 位置を設定するset_pos()関数です。

# 位置
def set_pos(self, x: int, y: int):
self.base_x = self.rect.x = x
self.base_y = self.rect.y = y

 self.rect.x self.rect.yの値と、self.base_x self.base_yの値を変更します。

サイズ

 サイズを変えるset_size()関数です。

# サイズ
def set_size(self, rate: int):
self.rect.width = int(U * rate)
self.rect.height = int(U * rate)

 ここでは数値のみ変えて、実際の拡大縮小はupdate()関数の中でおこないます。

揺らす

 shake()関数にbool値を与えることで、揺らす状態を変えます。

# 揺らす
def shake(self, is_shake: bool):
self.is_shake = is_shake

更新

 更新をおこなうupdate()関数です。

# 更新
def update(self):
t = pygame.time.get_ticks() # 経過時間
i = t // 500 % len(self.images)
image = self.images[i]
size = (self.rect.width, self.rect.height)
self.image = pygame.transform.scale(image, size)
self.rect.x = self.base_x
self.rect.y = self.base_y
if self.is_shake:
t2 = t // 40
self.rect.x += - U // 2 + int(U * (t2 * 11 % 13 / 13))
self.rect.y += - U // 2 + int(U * (t2 * 11 % 17 / 17))

 経過時間に応じて、取り出す画像を変えてアニメーションをおこないます。500ミリ秒ごとに、画像を切り替えます。

 また、self.imagesから取り出した画像をpygame.transform.scale()関数でサイズを変えて、self.imageに代入します。

 描画位置は、いったんself.base_x self.base_yに設定します。

 その後、self.is_shakeTrueのときは、描画位置をガタガタと揺らします。


 次の内容については省略します。こちらは同人誌をご覧ください。


同人誌について

 この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。

 同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。

(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)

 技術系同人誌など まとめページ


トップページに戻る
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2024 Cronus Crown (c)1997-2024 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について