Python Pyxel でプログラミング練習 第3回(アクションゲーム 後編)

Pyxelでアクションゲームを作る

 Python向けレトロゲームエンジン「Pyxel(ピクセル)」を使ったゲーム制作を通してプログラミングを学習します。

 【前編の記事】
 Python Pyxel でプログラミング練習 第3回(アクションゲーム 前編) - 勉強ボックス管理者ブログ

プログラムを作成する(続き)

04 ジャンプと落下

 ジャンプ状態を管理する変数 jump を追加し,「0:床にいる状態,1:ジャンプ中,2:落下中」とします。

・床にいる状態のときは足元(キャラクターの座標より1ドット下)のタイルを調べて,床がない場合に落下中に変更します。
・床にいる状態でスペースキーが押されたときは,ジャンプ中に変更します。
・ジャンプ開始時に,y座標の上方向への移動量を与えて徐々に減らしていきます。移動量が下方向になれば落下中になり,床にぶつかるまで落下を続けます。

 

 最初の移動量が8ドットの場合は合計36ドット上方向に移動するので,8ドット1マスで4マス分はジャンプできる計算です。(4マスの高さのブロックには飛び乗れる)

 list05_04.py 抜粋
前のプログラムからの変更箇所は 確認用ファイル を参照してください。

・・・
jump = 0

chkpoint = [(2,0),(6,0),(2,7),(6,7)]
def chkwall(cx,cy):
    c = 0
    if cx < 0 or pyxel.width -8 < cx:
        c = c + 1
    if pyxel.height < cy:
        c = c + 1                  # 画面下に落ちたところで止める
    for cpx,cpy in chkpoint:
        xi = (cx + cpx)//8
        yi = (cy + cpy)//8
        if (1,0) == pyxel.tilemap(0).pget(xi,yi):
            c = c + 1
    return c

def update():
    global x,y,dx,dy,pldir,jump

・・・

    # 横方向の移動
・・・

    # ジャンプと落下
    if jump == 0:
        if chkwall(x,y+1) == 0:
            jump = 2  # 床が無ければ落下
        if pyxel.btnp(pyxel.KEY_SPACE):
            dy = 8
            jump = 1   # ジャンプ開始
    else:
        dy = dy - 1
        if dy < 0:
            jump = 2    # 頂点で落下開始

    ud = pyxel.sgn(dy)
    loop = abs(dy)
    while 0 < loop :
        if chkwall(x, y - ud) != 0:
            dy = 0
            if jump == 1:
                jump = 2   # 壁にぶつかって落下
            elif jump == 2:
                jump = 0   # 着地 落下終了
            break
        y = y - ud
        loop = loop -1
        
    return

・・・

 実行結果
 

 

05 コインの取得とタイルマップの更新

 キャラクターがコインのタイルに触れたら,得点をカウントアップしてコインを消す処理を作成します。(キャラクター座標移動後の位置のタイルを調べて,コインの場合にタイルを空欄のタイルに更新することで実現させます)
 また,コイン10枚取得でゲームクリアのテキストを表示させます。

 list05_05.py 抜粋
前のプログラムからの変更箇所は 確認用ファイル を参照してください。

・・・
score = 0

・・・

def update():
    global x,y,dx,dy,pldir,jump,score

    # 操作判定
・・・

    # 横方向の移動
・・・

    # ジャンプと落下
・・・

    # コイン判定
    xi = (x + 4)//8
    yi = (y + 4)//8
    if (1,1) == pyxel.tilemap(0).pget(xi,yi):
        score = score + 1
        pyxel.tilemap(0).pset(xi,yi,(0,0))
    
    return

def draw():
    pyxel.cls(0)
    pyxel.bltm(0,0, 0, 0,0, pyxel.width,pyxel.height, 0)
    pyxel.blt( x, y, 0,  0, 8, pldir*8,8, 0)

    if 10 == score :
        pyxel.text(45,56,"FINISH!",7)
        
    return

・・・

 実行結果
 

・pyxel.tilemap(0).pset(xi,yi,(0,0))
 pset()命令で,指定位置のタイルを設定できます。
 これを利用すると,アイテムを集めたら扉が開くなどのゲームの仕掛けを作ることができそうです。

 

改造案

 今回はコイン10枚でゲームクリアとしましたが,ステージクリアの表示に変えて,タイルマップの開始座標を変えて次のステージが遊べるようにするなど改造できるかと思います。

・ジャンプの効果音を作成して,再生処理を追加してみましょう。
・穴に落ちる,障害物のタイルに触れるなどゲームオーバーとなる仕組みを考えてみましょう。



【参考文献】
 廣瀬 豪(2022)『7大ゲームの作り方を完全マスター! ゲームアルゴリズムまるごと図鑑』 技術評論社

 本記事は上記書籍の「第5章 横スクロールアクション」の内容を参考に作成しました。書籍内では「スペースキーを短く押すと低く跳ね,長く押すと高く跳ねる」などより詳細な動きをさせる方法なども解説されています。