tairadate_highschool_programming_lesson_2025

弾を出そう

弾を発射するためには、いくつかやらなくちゃいけないことがあるけど、とりあえず弾を表示するだけのコードを書いてみよう

弾はシンプルに、pyxel の機能でできる四角形を使おう。 スペースキーが押されたときに、黄色い資格がキャラクターの上に表示されるようにしてみよう。

import pyxel
pyxel.init(120, 120)
pyxel.load("danmaku.pyxres")

character = {
    "x": 120 / 2 - 16 / 2,
    "y": 90,
    "tama": []
}
enemy = {
    "x": 120 / 2 - 16 / 2,
    "y": 20,
    "direction": 1
}

    


def update():
    print(character["tama"])
    enemy["x"] = enemy["x"] + enemy["direction"]
    if enemy["x"] >= 120 - 16 or enemy["x"] <= 16:
        enemy["direction"] = enemy["direction"] * -1
    
    if pyxel.btn(pyxel.KEY_RIGHT) == True:
        character["x"] = character["x"] + 1
        
    elif pyxel.btn(pyxel.KEY_LEFT) == True:
        character["x"] = character["x"] - 1

    if pyxel.btnp(pyxel.KEY_SPACE) == True:
       character["tama"].append([character["x"], character["y"] - 16])
    
    


def draw():
    pyxel.cls(0)
    pyxel.blt(character["x"], character["y"], 0, 0, 0, 16, 16, 0)
    pyxel.blt(enemy["x"], enemy["y"], 0, 16, 0, 16, 16, 0)
    
    for i in character["tama"]:
        pyxel.blt(i[0], i[1], 0, 32, 0, 16, 16, 0)
    
pyxel.run(update, draw)


弾を動かすために、[tama]の中にある弾丸を、y方向に1づつ移動させよう。この処理をupdate関数の中に追加します

for i in character["tama"]:
    i[1] = i[1] - 1


これで、ゲームっぽくなってきた!!
動く弾

弾を消そう

今ターミナルを見てみると、めちゃくちゃ文字がたくさん出ていて、何がなんだかって感じになってる

full_bullet_list

うん、キモい。 これは、update()関数の一番最初に

print(character["tama"])

が入っているからなんだけど。tamaリスト、つまり弾丸の座標のリストが、弾を打つたびに増えていってるから。 見て分かる通り、弾が画面外に出たあとも表示されているし、数字が変わっているね。表示場はうまくいってても、裏側では、もう画面上ん存在しない弾の処理を、プログラムがさせられている状態。 「うまくいってるんだからいいじゃん」って言ってこれを放置しておくと、例えばゲーム後半で処理が重くなって、ゲームの動作が不安定になったり、思わぬところでバグが発生したりして、大変なことになりかねない。 じゃあ、必要のない弾を消してしまおう。 弾を消すには、必要ない座標のリストをtamaリストから消してしまえばいいんだけど、どういう条件で弾を消すかを先に考えよう。

この2つを、順番に実装していこう。

敵HP・ダメージ、クリア画面の実装

このままではゲームが終わらないので、敵のHPがゼロになったらゲームクリア、という感じに実装してみよう