コンテンツへスキップ

スペースハリアー風味の床描画(1)

ポリゴンによる 3D 空間の描画が出来なかった時代に、画面の奥に向かって進行するゲームを開発するには、いくつかの手法がありました。

そのひとつに水平同期割り込み時に VRAM の読み取り位置を書き換えることによる変形処理で擬似的な 3D 表示を行っているものがあり、自分がすぐに思い浮かぶのはスペースハリアーだったりします。

というわけで、スペースハリアーの床(ラスター処理に渡すための画像)を描画するプログラムを作成してみました。

# -*- coding: utf-8 -*-
##
# ----------------------------------------------------------------- import(s)
import Image, ImageDraw


# ------------------------------------------------------------------ param(s)
IMAGE_W = 512
IMAGE_H = IMAGE_W >> 1
IMAGE_HALF_W = IMAGE_W >> 1
IMAGE_LINE_W = IMAGE_W >> 4
RENDER_COUNT = IMAGE_W
IMAGE_H_ADJUST = -4

COLOR_0 = "#000000"
COLOR_1 = "#FFFFFF"


# --------------------------------------------------------------- function(s)
# ===========================================================================
##
#   @brief  x
#
#   @param [in] oCDraw  x
#
def render_image(oCDraw):

    for c in range(RENDER_COUNT):

        if(c & 1):
            strColor_0 = COLOR_0
            strColor_1 = COLOR_1
        else:
            strColor_0 = COLOR_1
            strColor_1 = COLOR_0

        for n in range(IMAGE_LINE_W):
            nX = (IMAGE_LINE_W * c ) + n

            oCDraw.line(
                (
                    (IMAGE_HALF_W, IMAGE_H_ADJUST),
                    (IMAGE_HALF_W + nX, IMAGE_H)
                ),
                fill=strColor_0
            )

            oCDraw.line(
                (
                    (IMAGE_HALF_W, IMAGE_H_ADJUST),
                    (IMAGE_HALF_W - nX, IMAGE_H)
                ),
                fill=strColor_1
            )


# ===========================================================================
##
#
def main():

    oCImage = Image.new("RGB", (IMAGE_W, IMAGE_H), "white")
    oCDraw = ImageDraw.Draw(oCImage)

    render_image(oCDraw)

    strFilename = "export_w%04d_h%04d.png" % (IMAGE_W, IMAGE_H)
    oCImage.save(strFilename, "PNG")



if(__name__ == "__main__"):
    main()



# --------------------------------------------------------------------- [EOF]
PIL で線を引いているだけのプログラムなんですけどね。

実行すると以下のような画像が生成されます。

スペースハリアーは、 512×256 ドットのデータを内部に保持しているようですので、 IMAGE_W には 512 を指定すると、もっともそれっぽいデータが作成されます。

このデータを使用して擬似 3D な空間を表現するには、ラインごとにポリゴンを分割しなければなりませんが、細長い画像にしてしまえば javascript なんかでも描画出来るかも。