Pygame get_rect メソッド

Salman Mehmood 2023年6月21日
  1. Python で Pygame の get_rect メソッドを使用する
  2. Pygame get_rect 使用時の重複画像の解決策
Pygame get_rect メソッド

この記事の主な目的は、Pygame ライブラリの get_rect() メソッドを使用して画像を操作し、画面上で移動する方法を示すことです。

Python で Pygame の get_rect メソッドを使用する

Pygame でプロジェクトやゲームに取り組んでいる間、画面上の画像の位置を操作できなければなりません。 たとえば、プレーヤーを画面上で動かしたい場合、プレーヤーが特定のボタンを押すと、画面上の位置を変更する必要があります。

次の例を検討してください。

import pygame
import sys
from pygame.locals import *

pygame.init()

# Set up the window
WIN = pygame.display.set_mode((400, 400))

# Load two images
imgOne = pygame.image.load("images\\img 1.jpg")
imgTwo = pygame.image.load("images\\img 2.jpg")

# Fill bg with black color
WIN.fill((0, 0, 0))

# Place the images
WIN.blit(imgOne, (0, 0))
WIN.blit(imgTwo, (300, 0))

pygame.display.update()

# Obtain the rectangle for each image
imgOneRect = imgOne.get_rect()
imgTwoRect = imgTwo.get_rect()

imgTwoRect.x = imgOneRect.x
imgTwoRect.y = imgOneRect.y

WIN.blit(imgTwo, (imgTwoRect.x, imgTwoRect.y))
pygame.display.update()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

2つの画像が読み込まれたときの出力:

問題プロット - 画像の読み込み

2 番目 (青) の画像を右の画像の上に移動した後の出力:

問題プロット - 画像を移動

上の画像からわかるように、最初の画像の上に青い画像を移動しようとしています。 必要な入力を取得する代わりに、青色の画像が複製され、赤色の画像の上に完全に移動する代わりに、元の位置に表示されることがわかります。

青い画像が複製されないように、これを修正する方法を見てみましょう。

Pygame get_rect 使用時の重複画像の解決策

次のコードを検討してください。

import pygame
import sys
import time
from pygame.locals import *

pygame.init()

# Set up the window
WIN = pygame.display.set_mode((400, 400))

# Load two images
imgOne = pygame.image.load("images\\img 1.jpg")
imgTwo = pygame.image.load("images\\img 2.jpg")

# Fill bg with black color
WIN.fill((0, 0, 0))

# Place the images
WIN.blit(imgOne, (0, 0))
WIN.blit(imgTwo, (300, 0))

pygame.display.update()

# Make a rect of the size of the image
# set its top-left coords to (300, 0).
img2_rect = imgTwo.get_rect(topleft=(300, 0))

# Set the rect's x value to 0 (x value of red image)
img2_rect.x = 0

# Wait for two seconds
time.sleep(2)

# Redraw the background as a black color
WIN.fill((0, 0, 0))

# Draw the image (blue image) at the coordinates of the rect
WIN.blit(imgTwo, img2_rect)

# Update the screen to show newly drawn images
pygame.display.update()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

2つの画像を読み込んだ後の出力:

解決策 - 画像を読み込む

青の画像を赤の画像の上に移動した後の出力:

解決策 - 画像を移動

これを実現する主なアイデアは、get_rect メソッドを使用して rect を作成することです。

長方形の初期位置は (0,0) になります。 移動したい画像の位置に設定する必要があります。

四角形を初期化した後、四角形の位置を画像を配置したい場所に変更します。 その後、画像の背景を再描画して、古い画像インスタンスが画面のインスタンスから確実に削除されるようにします。

背景が描画されたら、blit メソッドを呼び出して画像と先ほど作成した四角形に渡すことで、目的の場所に画像を描画できます。 画像は rect の座標に作成されます。

プログラムの全体的なワークフローは次のとおりです。

  1. init メソッドを使用して Pygame を初期化します。

  2. display.set_mode を呼び出してウィンドウを設定します。これは通常、画面のサイズの設定、いくつかのフラグの調整、色深度の調整に使用されます。

  3. load を使用して 2つの画像を読み込みます。

  4. 背景を目的の色で塗りつぶします。 この場合、背景は黒 (0,0,0) の r,g,b 表現を使用して黒に設定されました。

  5. blit を使用して画面に画像を描画します。これには x 座標と y 座標を渡す必要があります。 通常、タプルの形で与えられます。

  6. update メソッドを使用して画面を更新し、キャンバス/画面に加えられた新しい変更を表示します。 この場合、背景が黒色で塗りつぶされ、読み込まれた 2つの画像が表示されます。

  7. get_rect メソッドを使用して rect を作成し、座標のタプルを渡して初期位置を設定します。 それ以外の場合、通常、位置 (0,0) が割り当てられます。

    この場合、四角形の位置を移動したい画像 (青い画像) の位置に設定します。

  8. 長方形の位置を、設定したい新しい位置に更新します。 通常は、画像を動かしたい位置に設定します。

    この場合、その x 座標は最初の (赤) 画像の x 座標に設定されました。

  9. しばらく待ってから変更を確認します。 この場合、待機時間は 2 秒に設定されました。

  10. イメージの背景を再描画します。 これは、削除する必要がある古いイメージ インスタンス/ピクセルが背景で上書きされるようにするために行われます。 この例では、黒に設定されています。

  11. 背景が描画されたら、移動したい画像を目的の場所に描画します。 これは blit メソッドを使用して行われます。

    この場合、2つのパラメーターが渡されます。 1つ目は描画する必要があるイメージで、2つ目は先ほど作成した rect です。

    rect は、画面上に描画される画像の位置を指定します。 位置は通常、x-y 座標の形式です。

  12. 画像の移動、背景の再描画、画面への反映など、上記で行ったすべての変更を確実に行うために、pygame.display.update 関数を呼び出します。

  13. 最後の無限ループは、手動で閉じるまでウィンドウを実行し続けます。 各イベントは pygame.event.get メソッドを使用してフェッチされ、イベントのタイプに基づいてアクションが実行されます。

    通常、キーストロークをキャプチャする場合も、ここで行います。 メインループと呼ばれることもあります。

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - Pygame Image