Pyxelのバージョン
Pyxelのバージョン 2.2.0 (2024年8月リリース) から画像の回転、拡大縮小ができるようになりました(2024年11月現在の最新バージョンは2.2.7)
雪の結晶画像
(拡大表示)
実際のファイル "snowflake_image.png"
1つの雪の結晶の大きさは 48 x 49 ドット
実行結果
キラキラしているのはドットが荒いため、縮小した時にドットが欠けたりするから
プログラムについて
上記画像ファイルを読み込み、雪の結晶3種類をランダムに生成し回転しながら落ちてくるプログラム。Snowクラスと複数の雪の結晶を生成して落ちてくるところは ChatGPT に作ってもらいました。ただし、ChatGPT はバージョン2.1.0 までしか把握していないので rotate や scale パラメーターを加えるとエラー扱いしてきます。
ChatGPT いわく
「Pyxelは積極的に更新されているため、将来的に回転やスケールが公式機能として追加される可能性があります。最新のアップデート情報をGitHubのリリースノートで確認してください。」とのこと
# ランダムな大きさの3種類の雪の結晶が回転しながら落ちてくるプログラム
import pyxel
# 雪の結晶を表現するクラス
class Snow:
def __init__(self, x, y, size, type, rotate_speed, fall_speed, scale):
self.x = x
self.y = y
self.size = size
self.type = type
self.rotate_speed = rotate_speed
self.fall_speed = fall_speed
self.scale = scale
self.rotate = 0
# 雪の結晶を動かす
def update(self):
self.rotate += self.rotate_speed
self.y += self.fall_speed
if self.y > 256: # 画面外に出たら上に戻る
self.x = pyxel.rndi(-self.size//8, 256//8) * 8
#self.y = pyxel.rndi(-256//8, 0) * 8
self.y = -self.size
# 雪の結晶を描画
def draw(self):
pyxel.blt(
self.x, self.y,
# 対応するイメージバンクの番号、x座標、y座標、横サイズ、縦サイズ、透明色
0, self.type * self.size, 0, self.size, self.size+1, 0,
# 回転角度(ラジアンでなく度:Degree)、拡大率(1より小さいときは縮小)
self.rotate, self.scale)
class App:
def __init__(self):
pyxel.init(256, 256, title="SNOWFLAKE", capture_scale=1)
self.snow_size = 48
# イメージバンク0の座標 (0, 0)に画像ファイルを読み込む
pyxel.images[0].load(0, 0, "snowflake_image.png")
# 複数の雪の結晶を初期化
self.snowflakes = [
Snow(
x = pyxel.rndi(-self.snow_size//4, 256//4) * 4,
y = pyxel.rndi(-256//8, 0) * 8,
size = self.snow_size,
type = pyxel.rndi(0, 2), # 3種類ある結晶のどれか
fall_speed = pyxel.rndf(0.6, 1.0),
rotate_speed = pyxel.rndf(-3, 3),
scale = pyxel.rndf(0.5, 0.8) # 画像の表示倍率
)
for _ in range(24)
]
pyxel.run(self.update, self.draw)
def update(self):
# 全ての雪の結晶を更新
for flake in self.snowflakes:
flake.update()
def draw(self):
pyxel.cls(5)
# 全ての雪の結晶を描画
for flake in self.snowflakes:
flake.draw()
App()