2025年12月8日月曜日

【Pythonゲーム開発】#3.四角形や円を描いてみよう(QPainter基礎編)

はじめに

ゲーム画面というのは、突き詰めれば「四角形(地形)」や「画像(キャラ)」の集まりです。 つまり、「好きな場所に、好きな色で、好きな図形を描く」ことができれば、画面作りは8割完了したも同然です。今回は、PySide6の描画職人である「QPainter」を使って、ウィンドウに絵を描いてみましょう。


§1. 座標系を知ろう:Y軸は「下」へ

コードを書く前に、ゲームの世界の「地図(座標)」を理解する必要があります。 学校の数学とは少し違います。

  • (0, 0) 原点: ウィンドウの「左上」です。

  • X軸: 右に行くと増えます(数学と同じ)。

  • Y軸: 「下」に行くと増えます(数学と逆!)。

「Yが増える=下に落ちる」とイメージしてください。


§2. 描画のルール:「paintEvent」

ここが少し難しいポイントです。 PySide6では、「描きたいときに勝手に描く」ことはできません。 「OSから『画面を更新していいよ』と言われたタイミング」でのみ描画が許されています。

そのタイミングで自動的に呼ばれる関数(イベント)が、paintEvent です。 私たちは、この paintEvent の中身を書き換える(オーバーライドする)ことで、絵を描きます。


§3. 実践!赤と青の図形を描く

では、実際にコードを書いてみましょう。 今回は「ただのウィンドウ(QWidget)」ではなく、「お絵かき機能付きのウィンドウ(MyGameWindow)」という自作クラスを作ります。

pythonコード

はじまり---------------------------------------------

import sys

from PySide6.QtWidgets import QApplication, QWidget

from PySide6.QtGui import QPainter, QColor, QPen, QBrush

from PySide6.QtCore import Qt

# 1. QWidgetを改造して、自分だけのウィンドウクラスを作る

class MyGameWindow(QWidget):

    def __init__(self):

        super().__init__()

        self.setWindowTitle("お絵かきテスト")

        self.resize(400, 300)

    # 2. 画面描画のタイミングで自動的に呼ばれる関数

    def paintEvent(self, event):

        # 画家(Painter)を呼ぶ

        painter = QPainter(self)

        # --- ここからお絵かきタイム ---

        # ■ 四角形を描く(枠線:黒、中身:赤)

        painter.setPen(QPen(Qt.black, 3))       # ペン(枠線)の設定:黒色、太さ3px

        painter.setBrush(QBrush(Qt.red))        # ブラシ(塗りつぶし)の設定:赤色

        painter.drawRect(50, 50, 100, 100)      # (x=50, y=50)に、幅100, 高さ100の四角を描く

        # ● 円を描く(枠線:なし、中身:青)

        painter.setPen(Qt.NoPen)                # ペンなし(枠線を描かない)

        painter.setBrush(QBrush(Qt.blue))       # 青色で塗りつぶす

        painter.drawEllipse(200, 50, 100, 100)  # (x=200, y=50)に、幅100, 高さ100の円を描く

# --- ここからメイン処理 ---

app = QApplication(sys.argv)

window = MyGameWindow() # 自作したクラスを使う

window.show()

sys.exit(app.exec())

おわり---------------------------------------------

ウィンドウに図形が出現!!
なお、ウィンドウはまだ動かない...

 §4.コードの解説

重要なのは paintEvent の中身です。

  • painter = QPainter(self)

    • 「私(このウィンドウ)に絵を描くための筆をください」という宣言です。

  • painter.setPen(...)

    • 「枠線」の色や太さを決めます。Qt.NoPen にすると枠線が消えます。

  • painter.setBrush(...)

    • 「中身(塗りつぶし)」の色を決めます。

  • painter.drawRect(x, y, w, h)

    • 指定した座標とサイズで四角形(Rectangle)を描きます。

  • painter.drawEllipse(x, y, w, h)

    • 指定した四角形の中に収まるような楕円(Ellipse)を描きます。正方形なら円になります。

次回予告

静止画を描くことはできました。 しかし、ゲームは「動いて」ナンボです。 次回は、この描いた四角形をアニメーションさせてみましょう。

0 件のコメント:

コメントを投稿

【Pythonゲーム開発 】#4.ゲームの心臓「メインループ」を作ろう(QTimer編)

 はじめに  前回、画面に四角形を描くことができましたが、まだ動きません。 ゲームとは、パラパラ漫画のように「少しずつ動かした絵」を高速で切り替えることで成立しています。多くの初心者はここで「while Trueループで回せばいいんでしょ?」と考えますが、GUIアプリでそれをやる...