個人でゲーム開発をしている中で、実装に苦労した部分が多かったので、テクニックとして紹介していこうと思います。
今回はプレイヤーの「ワープ」について書きます。
プレイヤーを変形させて消す方法
def animation_jump(self, Player):
"""
スキルのアニメーションを実行する処理
"""
rate_x = -2.5
rate_y = 5
margin_x = 5
margin_y = -10
x,y = self.IMG_SCALE
icon_x,icon_y = Player.ICON_POS
for i in range(0, 20, 1):
self.redraw()
P_TRANS_IMG_1 = pg3.transform.scale(Player.P_IMG_FRONT, (x, y))
self.screen.blit(P_TRANS_IMG_1, (icon_x+margin_x+i, icon_y+margin_y-i))
pg3.display.update()
pg3.time.delay(20)
x += rate_x
y += rate_y
self.redraw()
pg3.display.update()
for m_x in range(0, 11):
for m_y in range(0, 11):
flag = self.MAZE[m_y][m_x]
if flag == 9:
margin_y = 5
for i in range(20, -1, -1):
self.redraw()
P_TRANS_IMG_1 = pg3.transform.scale(Player.P_IMG_FRONT, (x, y))
self.screen.blit(P_TRANS_IMG_1, (m_x+margin_x+i, m_y+margin_y-i))
pg3.display.update()
pg3.time.delay(20)
x -= rate_x
y -= rate_y
self.redraw()
self.screen.blit(Player.P_IMG, (m_x, m_y), Player.P_IMG_D_1)
Player.ICON_POS = (m_x, m_y)
pg3.display.update()
break
最初のfor文で、一定の割合でプレイヤーの縦横比を変形させていき、最後は消します。
横幅は「rate_x」の分だけ小さくなり、縦幅は「rate_y」の分だけ大きくなります。
プレイヤーの画像は徐々に縦長になっていき、最後は横幅が0になって消えたように見えるという流れです。
ただし、そのままだとプレイヤーの表示位置もずれていってしまうため、「margin_x」「margin_y」で位置調整をしています。
次のfor文で、さっきとは逆のことをしています。
横幅は「rate_x」の分だけ大きくなり、縦幅は「rate_y」の分だけ小さくなります。
縦長だったプレイヤーの画像は徐々に元の形に戻っていきます。
「self.MAZE[m_y][m_x]」は画面にあるオブジェクトの座標と種類が入っているので、「flag == 9」でプレイヤーを表示したい座標(m_x,m_y)を取得しています。
プレイヤーを画面外に飛ばす方法
def animation_jump(self, Player):
"""
スキルのアニメーションを実行する処理
"""
# プレイヤーの位置を取得する
icon_x,icon_y = Player.ICON_POS
# プレイヤーを画面外へ飛ばす
for i in range(icon_y, -121, -30):
self.redraw()
self.screen.blit(Player.P_IMG, (icon_x, i), Player.P_IMG_D_1)
pg3.display.update()
pg3.time.delay(1)
# ゴール地点の座標を取得する
m_x,m_y = self.MAZE.get_coordinate(9)
# プレイヤーを画面外からゴール地点に戻す
for i in range(-121, m_y+1, 30):
self.redraw()
self.screen.blit(Player.P_IMG, (m_x, i), Player.P_IMG_D_1)
pg3.display.update()
pg3.time.delay(1)
self.redraw()
self.screen.blit(Player.P_IMG, (m_x, m_y), Player.P_IMG_D_1)
Player.ICON_POS = (m_x, m_y)
pg3.display.update()
プレイヤーは現在地から上昇していき、画面外に出ます。その後、画面外から指定の座標まで下りてきます。
最初のfor文ではプレイヤーを上昇させたいので、Y軸を「30」ずつ減算しています。
次のfor文ではプレイヤーを下降させたいので、Y軸を「30」ずつ加算しています。
上昇の到達点と下降の開始地点は一致させたいので、今回は「-121」としています。
負の数にすることで、画面の外を表現することができます。
「self.MAZE.get_coordinate(9)」はプレイヤーを変形させる方法で述べた、プレイヤーを表示したい座標(m_x,m_y)を取得する関数です。
関数はあとから作成したので、こちらだけそうなっています。
「ワープ」に関しては以上となります。
リリース済みのゲームはこちら
・PC向け無料ゲーム
『LAbyrinth』(2Dの迷路探索ゲーム)
●Freem!
https://www.freem.ne.jp/win/game/33791
●Unityroom
https://unityroom.com/games/2025-labyrinth-isukaka