Pyxelを触ってみよう3

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

今日は「Pyxelを触ってみよう」の第三弾ということで、新しいミニゲームに挑戦してみようと思います。
前回までは、敵を捕まえるゲームを作っていましたが、今回は敵から逃げるゲームを作ります。

Step1. 簡単な発射台を作る

まず最初に、発射台の台と動かない敵を1体表示させます。
今回、発射台は横長な長方形で、敵は円を用いて書いてみました。

def update():
    pass

def draw():
    cls(6)  # 背景色
    rect(0,90,100,5,5)  #  敵発射台
    circ(50,80,1, 9) #  敵

init(100, 100)
run(update, draw)

次に、敵を下から上にゆっくり動くようにします。
敵のy座標を変数で置き、その変数の値をだんだんと減らしていくことで、敵を下から上にゆっくりと動かします。

enemyY =  100

def update():
    global enemyY,enemyX
    enemyY -=  1.5

def draw():
    cls(6)  # 背景色
    rect(0,90,100,5,5)  #  敵発射台
    circ(50,enemyY,1, 9) #  敵

しかしこのままでは、発射台から敵が出てくるようには見えません。
なので微調整を行います。具体的には、書く順番を並べ直して敵に重ねる形で発射台を描き、さらに発射台と敵のy座標を同じ値にすることで、発射台の長方形から敵が出てきているように見えるようになりました。

enemyY =   90

def draw():
    cls(6)  # 背景色
    circ(50,enemyY,1, 9) #  敵
    rect(0,90,100,5,5)  #  敵発射台
では最後に、面白くするために、敵のx座標をランダムにしたいと思います。今までのコードだと、敵のx座標は固定されているので、どこから敵が出てくるか簡単にわかってしまいます。ここで今回はrandom関数を使って、毎回敵の出現する場所が変わるようにします。
enemyX = random.randint(8, 89)

def draw():
    cls(6)  # 背景色
    circ(enemyX,enemyY,1, 9) #  敵
    rect(0,90,100,5,5)  #  敵発射台

Step1の最終的なコードはこちら
from pyxel import *
import random

enemyX = random.randint(8, 89)
enemyY =  90


def update():
    global enemyY,enemyX
    enemyY -=  1.5

def draw():
    cls(6)  # 背景色
    circ(enemyX,enemyY,1, 9) #  敵
    rect(0,90,100,5,5)  #  敵発射台
    

init(100, 100)
run(update, draw)

Step2. 敵を連続で出現させる

Step1では、スタートさせると敵が1回だけ表示させるコードを作りましたが、これだと連続的に遊ぶことはできません。
連続的に遊べるように、敵が画面外に出たら、新たに敵を1体表示させるようにしたいと思います。

敵を連続的に表示させるために、「リスト」を使います。リストとは「複数のデータをまとめて格納できるデータ型」のことです。今回は、敵のx座標とy座標をリストを使って管理します。

# 敵を入れるリスト(最初は1体)
enemies = [[random.randint(8, 89), 90]]  # [x, y] の形で保存

def update():
    global enemies

    # 敵を全部移動(上に)
    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])

def draw():

    # 敵を全て描画
    for x, y in enemies:
        circ(x, y, 1,  8)

もし、1体だけの敵を変数で管理していたら、画面外に出た時点でまた新しい変数を作る必要がありますが、リストを使うことで、敵を連続的に出す仕組みを作ることができました。

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

from pyxel import *
import random

init(100, 100)

# 敵を入れるリスト(最初は1体)
enemies = [[random.randint(8, 89), 90]]  # [x, y] の形で保存

def update():
    global enemies

    # 敵を全部移動(上に)
    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])
    

def draw():
    cls(6)  # 背景色

    # 敵を全て描画
    for x, y in enemies:
        circ(x, y, 1,  8)  
        
    rect(0, 90, 100, 5, 5)  # 発射台
        
run(update, draw)

(画像で見るとstep1とstep2で違いが全然わからないですね、、)

Step.3 敵を自作イラストに変えよう

このstepでは見た目に関わる部分を変えます。具体的には、今まで敵を丸を使って描いていましたが、これを自分で書いたイラストに変えて、見た目をアップデートします。

イラストの描き方はこちらの教材をもとに取り組みます。

今回は4種類の敵を描いてみました。(後々敵の種類によって色々な仕掛けをつけたいので、複数の敵を描いてみました)

そして、敵の情報をまとめて扱うために、リストに敵のキャラ番号も追加しました。こうすることで、各敵のデータは [x座標, y座標, キャラ番号(z)] の形になりました。

キャラクターを表示するのには、blt( )関数を使いますが、今回blt( )関数の4番目の値が数字以外も使って書かれています。これは、1体あたりの画像サイズが8ピクセルだからです。
つまり、z が 0~3 のランダムな値を取ることで、画像の横方向に8ピクセルずつずらして、4種類のキャラクターをランダムに表示できるようになります。

せっかくなので、メインキャラクターも表示させてみました。メインキャラクターについては、ひとまずはただ表示させるだけにします。(ちなみにこれはchatGPT曰くなのですが、メインキャラクターなどをパレットの1枚目に書き、敵キャラなどを2枚目、背景などを3枚目以降に書くと良いらしいです。)

ただの記号のみでなく、キャラクターを表示できると見た目のクオリティが上がるので楽しいですね。

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

from pyxel import *
import random

init(100, 100)

load ("rocket.pyxres")

# 敵を入れるリスト(最初は1体)
enemies = [[random.randint(8, 89), 90, random.randint(0,4)]]  # [x座標, y座標, キャラ番号(z)] 

def update():
    global enemies

    # 敵を全部移動(上に)
    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)])

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(50,20,0,0,0,8,8,0) # メインキャラクター
        
run(update, draw)

まとめ

今回は一旦ここまでにしたいと思います。

step1で1体の敵が出現する簡単な発射台を作り、step2でリストを用いて敵を連続で出現させました。
そして、step3で敵を記号ではなく自分で描いたキャラクターに置き換えました。

次回は、メインキャラクターを動かしたり、発射台を複数設置してみたりしたいと思います。

TENTOのおすすめポイント

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