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
の座標に作成されます。
プログラムの全体的なワークフローは次のとおりです。
-
init
メソッドを使用して Pygame を初期化します。 -
display.set_mode
を呼び出してウィンドウを設定します。これは通常、画面のサイズの設定、いくつかのフラグの調整、色深度の調整に使用されます。 -
load
を使用して 2つの画像を読み込みます。 -
背景を目的の色で塗りつぶします。 この場合、背景は黒
(0,0,0)
の r,g,b 表現を使用して黒に設定されました。 -
blit
を使用して画面に画像を描画します。これには x 座標と y 座標を渡す必要があります。 通常、タプルの形で与えられます。 -
update
メソッドを使用して画面を更新し、キャンバス/画面に加えられた新しい変更を表示します。 この場合、背景が黒色で塗りつぶされ、読み込まれた 2つの画像が表示されます。 -
get_rect
メソッドを使用してrect
を作成し、座標のタプルを渡して初期位置を設定します。 それ以外の場合、通常、位置(0,0)
が割り当てられます。この場合、四角形の位置を移動したい画像 (青い画像) の位置に設定します。
-
長方形の位置を、設定したい新しい位置に更新します。 通常は、画像を動かしたい位置に設定します。
この場合、その x 座標は最初の (赤) 画像の x 座標に設定されました。
-
しばらく待ってから変更を確認します。 この場合、待機時間は 2 秒に設定されました。
-
イメージの背景を再描画します。 これは、
削除
する必要がある古いイメージ インスタンス/ピクセルが背景で上書きされるようにするために行われます。 この例では、黒に設定されています。 -
背景が描画されたら、移動したい画像を目的の場所に描画します。 これは
blit
メソッドを使用して行われます。この場合、2つのパラメーターが渡されます。 1つ目は描画する必要があるイメージで、2つ目は先ほど作成した
rect
です。rect
は、画面上に描画される画像の位置を指定します。 位置は通常、x-y 座標の形式です。 -
画像の移動、背景の再描画、画面への反映など、上記で行ったすべての変更を確実に行うために、
pygame.display.update
関数を呼び出します。 -
最後の無限ループは、手動で閉じるまでウィンドウを実行し続けます。 各イベントは
pygame.event.get
メソッドを使用してフェッチされ、イベントのタイプに基づいてアクションが実行されます。通常、キーストロークをキャプチャする場合も、ここで行います。
メインループ
と呼ばれることもあります。
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