9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PyxelAdvent Calendar 2024

Day 9

Pyxelの画像の回転、拡大縮小を使って雪の結晶を降らす

Last updated at Posted at 2024-11-26

Pyxelのバージョン

Pyxelのバージョン 2.2.0 (2024年8月リリース) から画像の回転、拡大縮小ができるようになりました(2024年11月現在の最新バージョンは2.2.7)

雪の結晶画像

(拡大表示)
snowflake_image_big.png
実際のファイル "snowflake_image.png"
1つの雪の結晶の大きさは 48 x 49 ドット
snowflake_image.png

実行結果

キラキラしているのはドットが荒いため、縮小した時にドットが欠けたりするから
snowflake_20241129.gif

プログラムについて

上記画像ファイルを読み込み、雪の結晶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()
9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?