2026年8月18日火曜日

師匠の難題0

ゲーム業界を引退し、プログラマーを辞めて20年近くが経ちます。
技術不足ゆえ早期退職を促され、受理して辞めた訳で、未練は無いのですですが、一つ心残りは有りました。

プログラマーになって最初の年に師匠(先輩プログラマ)から出された課題を解いておらず、そのまま有耶無耶になり、引退してしまったのです。

で、その課題が画像の回転コピーを作ってみよでした。
私がプログラマーになった年は、ゲーム業界に入って2年目の95年です。
当時のVC++でも BitBlt 関数で回転コピーはできたと思いますが、当然ライブラリや出来合いの関数を使えと言っているわけでは無いことは明白です。ちなみに師匠はアセンブラの名手で、自作のライブラリを作り、ゲーム機のCPUに合わせてカスタマイズし続けていました。

95年はペンティアム2が出たてくらいで、インテルの486や下手すると386すら現役の時代でした。386は後に386SXと改名され、コプロセッサが搭載された拡張版が386DXとなります。で、このコプロセッサが無いとどうなるか?私もはっきり覚えていないのですが、実数の計算ができませんでした。

つまり…アセンブラ化を前提とした実数を使用しない回転コピーを作ってみよ、という意図だったのではないかと推測されます。

なのでひとまず、縛りと仕様を決めます

仕様
転送元画像の一辺の長さは最大128ドット
転送先の画面の一辺の長さは最大512ドット

縛り
実数は使わない
割り算は使わない
三角関数は計算済みテーブルのみを使用(単位長128で、128度法)

まあ、日和って掛け算は使うんですけどね。
以前セットアップした Pyxel ライブラリを使います。…というのも、以前 Kivy の描画関数で描画プログラムを書いた際は遅すぎてとても実用に耐えなかったからです。
ちなみに Pyxel はパレットカラーマッピングですが、本質的に画像の転送方法が課題で色はどうでも良いので気にしません。


で、ひとまず作ってみたのはこんなプログラム。

ソースここから

import pyxel


class App:

    def __init__(self):
        # 画面サイズ 160x120 で初期化
        pyxel.init(160, 120, title="RollBlt")
        
        # 矢印画像をバンクへ読み込み
        pyxel.load("yajirushi.pyxres")
        
        pyxel.run(self.update, self.draw)

    def update(self):
        pass

    def draw(self):
        # 画面を黒(色番号0)でクリア
        pyxel.cls(0)
        
        # 1ドットずつ転送
        for y in range (16):
            for x in range (32):
                pyxel.blt(80 + x, 60 + y, 0, x, y, 1, 1)

App()

ソースここまで

出力結果

バンクからわざわざ1ドット分の画像を縦横の長さ分転送を繰り返して送っています。
普通こんな無駄な転送を行いませんが今後必要になるコードです。次回からはこれを改造していきます。

0 件のコメント:

コメントを投稿