Pyxelを触ってみよう4

こんにちは!元TENTO生で現在TENTOでスタッフをしているSです。

今日は「Pyxelを触ってみよう」の第4弾ということで、敵から逃げるゲームの続きを作りたいと思います。

前回のコラムはこちらから

Step4 メインキャラクターを動かす

step3で、メインキャラクターをついでに表示させてみましたが、このstepではこちらを動かしていきます。

キャラクターの動かし方は、前回のゲームと同じでキーボードの矢印を押したら、矢印を押した向きにメインキャラクターが進むようにします。

step3までは、メインキャラクターの位置を blt(50,20,0,0,0,8,8,0)
と書いていたので、このキャラクターのx座標とy座標を変数に置き換えます。

blt(meX,meY,0,0,0,8,8,0)

そしてキーボードの矢印が押されるごとに、この変数の値を変化させます。

if btn(KEY_RIGHT) and meX < 84:
    meX += 2
if btn(KEY_LEFT) and meX > 16:
    meX -= 2
if btn(KEY_UP) and meY > 16:
    meY -= 2
if btn(KEY_DOWN) and meY < 84:
    meY += 2

するとどうでしょう!左右上下のキーボードを操作すると、それに合わせてメインキャラクターも左右上下に動くようになりました。

Step4の最終的なコードはこちら

from pyxel import * import random init(100, 100) load (“rocket.pyxres”) meX = 10 # 自分のx座標 meY = 50 # 自分のy座標 # 敵を入れるリスト(最初は1体) enemies = [[random.randint(8, 89), 90, random.randint(0,4)]] # [x, y] の形で保存 def update(): global enemies,meX,meY # 敵を全部移動(上に) for e in enemies: e[1] -= 1.5 # 画面外の敵は削除 enemies = [e for e in enemies if e[1] > 0] # 敵が0体になったら新しい敵を追加 if not enemies: enemies.append([random.randint(8, 89), 90, random.randint(0,3)]) if btn(KEY_RIGHT) and meX < 84: meX += 2 if btn(KEY_LEFT) and meX > 16: meX -= 2 if btn(KEY_UP) and meY > 16: meY -= 2 if btn(KEY_DOWN) and meY < 84: meY += 2 def draw(): cls(6) # 背景色 # 敵を全て描画 for x, y, z in enemies: blt(x,y,1, z*8,0,8,8,0) rect(0, 90, 100, 5, 5) # 発射台 blt(meX,meY,0,0,0,8,8,0) run(update, draw)

Step5 発射台を増やす

では次に、もう少しゲームの難易度を上げるために、発射台を二箇所に増やしたいと思います。

発射台を二箇所に増やすのは、もう一つリストを作って、step3までに書いたコードをもう一体分書く形です。

#敵を入れるリスト
enemies1 = [[random.randint(8, 89), 87, random.randint(0,4)]]
enemies2 = [[random.randint(8, 89), 10, random.randint(0,4)]]

同じ方向から2体出るより、反対側から挟まれる形で敵が出現する方が面白いので、座標や敵の進向きについて調整をしていきます。

元々の発射台は下から上に敵が発射されたので、追加の発射台は上から下に向かって敵が発射されるようにしました。あとは、微調整をして完成です。

#  敵発射台1
for e in enemies1:
    e[1] -=  2
enemies1 = [e for e in enemies1 if e[1] > -8]
if not enemies1:
    enemies1.append([random.randint(8, 89),  87, random.randint(0,3)])

 # 敵発射台2
for e in enemies2:
    e[1] += 2
enemies2 = [e for e in enemies2 if e[1]  < 108]
if not enemies2:
    enemies2.append([random.randint(8, 89), 10, random.randint(0,3)])

Step5の最終的なコードはこちら

from pyxel import * import random init(100, 100) load (“rocket.pyxres”) meX = 10 # 自分のx座標 meY = 50 # 自分のy座標 # 敵を入れるリスト enemies1 = [[random.randint(8, 89), 87, random.randint(0,4)]] enemies2 = [[random.randint(8, 89), 10, random.randint(0,4)]] def update(): global enemies1,enemies2,meX,meY # 敵発射台1 for e in enemies1: e[1] -= 2 enemies1 = [e for e in enemies1 if e[1] > -8] if not enemies1: enemies1.append([random.randint(8, 89), 87, random.randint(0,3)]) # 敵発射台2 for e in enemies2: e[1] += 2 enemies2 = [e for e in enemies2 if e[1] < 108] if not enemies2: enemies2.append([random.randint(8, 89), 10, random.randint(0,3)]) # 自分をキーボードで動かす if btn(KEY_RIGHT) and meX < 85: meX += 1 if btn(KEY_LEFT) and meX > 7: meX -= 1 if btn(KEY_UP) and meY > 7: meY -= 1 if btn(KEY_DOWN) and meY < 85: meY += 1 def draw(): cls(6) # 背景色 # 敵を全て描画 for x, y, z in enemies1: # 敵1 blt(x,y,1, z*8,0,8,8,0) for x, y, z in enemies2: # 敵2 blt(x,y,1, z*8,0,8,8,0) rect(0, 92, 100, 5, 5) # 発射台1 rect(0, 3, 100, 5, 5) # 発射台2 blt(meX,meY,0,0,0,8,8,0) run(update, draw)

TENTOのおすすめポイント

体験授業ご希望の方はお気軽にお申し込みください。

友達募集中・LINE公式アカウントはじめました!