0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゲーム開発で使用したテクニック~ワープ~

Posted at

個人でゲーム開発をしている中で、実装に苦労した部分が多かったので、テクニックとして紹介していこうと思います。

今回はプレイヤーの「ワープ」について書きます。

プレイヤーを変形させて消す方法

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?