PythonのPygameで背景を繰り返し表示するようにする方法

スポンサーリンク

今日は、Pygameで楽しいループする背景を作る方法を解説します。

スポンサーリンク

STEP1:Pygameをインポートする

まず始めに pygame モジュールをインポートします。

また、プログラムの中で pygame を初期化します。

また、pygameウィンドウの基本的な機能のために、python.localsライブラリもインポートする予定です。

以下は、そのコードです。

1
2
3
import pygame
from pygame.locals import *
pygame.init()

ステップ2:基本的なウィンドウを作成する


次に必要なのは、ゲームウィンドウの幅と高さを設定するための変数を作成することです。

ここでは、幅と高さをそれぞれ1000と500としておきます。

pygameの関数 display.set_mode を使ってウィンドウオブジェクトを作成し、ゲームウィンドウの高さと幅を渡します。

以下はそのコードです。

1
2
width,height = 1000,500
window = pygame.display.set_mode((width,height))

STEP 3: 背景画像の追加

背景画像を追加するには、image.loadという関数を使い、パラメータとして画像のパスを追加するだけです。

また、画像を画面いっぱいに表示させるために、画像のサイズを調整します。

そのためには、transform.scale 関数を使用して、元の画像とスケーリングサイズ、つまり画面の寸法を渡します。

そのためのコードを以下に示します。

1
2
bg_img = pygame.image.load('Images/bg.jpg')
bg_img = pygame.transform.scale(bg_img,(width,height))

しかし、このコードは数秒間だけウィンドウを表示し、その後は消えてしまいます。

これは不要です。

そこで、画面上の X がユーザーによってクリックされるまで、そしてクリックされない限り、画面が表示され続けるようにするロジックを追加することにします。

まず、そのコードをお見せしましょう。

1
2
3
4
5
6
7
8
runing = True
while runing:
    window.blit(bg_img,(0,0))
    for event in pygame.event.get():
        if event.type == QUIT:
            runing = False
    pygame.display.update()
pygame.quit()

このコードでは、デフォルトで True に設定されている running 変数を作成しました。

アプリケーションはこのrunning変数がTrueである間だけ実行されます。

そして、画像を配置するために、blit関数を実行ループの中に置かなければならない。

blit`関数はimage変数と画像の座標を受け取ります。

エンドゲームのロジックを設定するために、すべてのイベントを記録して、ゲーム中に起こったイベントの種類をチェックします。

もし、イベントの種類が画面上のXボタンを押すことであれば、実行値をFalseに設定します。

しかし、背景画像の表示はまだ完全ではありません。

そのために、display.update関数を追加して、宣言されたすべての要素で画面を更新することにします。

画面全体が読み込まれ、閉じられたら、先ほど初期化したpygameを終了します。


必要なことをすべて行った後、以下のような画面になります。

(背景画像やウィンドウの大きさが異なる場合は、背景画像やウィンドウの形が異なる可能性があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pygame
from pygame.locals import *
pygame.init()
width = 1000
height = 500
window = pygame.display.set_mode((width,height))
bg_img = pygame.image.load('Images/bg.jpg')
bg_img = pygame.transform.scale(bg_img,(width,height))
i = 0
runing = True
while runing:
    window.blit(bg_img,(i,0))
    i-=1
    for event in pygame.event.get():
        if event.type == QUIT:
            runing = False   
    pygame.display.update()
pygame.quit()

STEP4:Pygameで背景をループさせる

私たちの主な目的は、画面の幅に沿って背景画像をループさせることです。

そのために、イテレータiを使用し、最初に0値で初期化します。

このイテレータ(i)を減らしていくのは、withに沿って先に進んでいく必要があるからです。


このコードの進行状況と必要な変更点は以下のコードに示されています。

理解しやすいように、変更された行はハイライトされています。

1
window.fill((0,0,0))

下のビデオは、このコードの結果を示しています。

右側のループする背景を見てください。

しかし、最後がうまくいきません。

ここで問題なのは、画像を再描画していないことです。

そのため、プログラムは最後に読み込まれたピクセルの設定のままになっています。

さて、この問題を解決するために、画像が完全に読み込まれたときに背景色を置くという状況をテストすることにします。

同じことをするために、fill関数を使い、色にRBG形式を渡します。

今のところ、黒を使うことにします。

そのためのコードを以下に示します。

この行は、背景画像の読み込みコマンドの直前に来ます。

1
window.blit(bg_img,(width+i,0))

出力は以下のようになります。

しかし、黒色を使う代わりに、背景画像の幅を超えたら背景画像をロードするようにしたいのです。

そのために、blit関数を使用して、将来の座標に背景画像を適用することにします。

そのためのコードラインを以下に示します。

1
2
3
if (i==-width):
        window.blit(bg_img,(width+i,0))
        i=0

このコード行を追加した後の出力は以下のようになります。

背景画像は2回表示され、その後再び背景画像に戻る。

これは困ります。

さて、このようなことが起こる原因は、iが画面の幅のマイナスになったことです。


同じ状況を処理する必要があり、それはiが幅のマイナスに達したときにblit関数を使用することで行われる。

また、iの値はリセットされ、すなわち0に設定される。

そのためのコードを以下に示す。

このコードは、iの減少コマンドと背景画像の初期読み込みの間に追加されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import pygame
from pygame.locals import *
pygame.init()
width = 1000
height = 500
window = pygame.display.set_mode((width,height))
bg_img = pygame.image.load('Images/bg.jpg')
bg_img = pygame.transform.scale(bg_img,(width,height))
 
i = 0
 
runing = True
while runing:
    window.fill((0,0,0))
    window.blit(bg_img,(i,0))
    window.blit(bg_img,(width+i,0))
    if (i==-width):
        window.blit(bg_img,(width+i,0))
        i=0
    i-=1
    for event in pygame.event.get():
        if event.type == QUIT:
            runing = False
    pygame.display.update()
pygame.quit()

最終的なコードは以下のようになります。

これで、すべてのコンセプトが理解できたと思います。

Screen01 Loop Bg
Screen01 Loop Bg

このコードの最終的な出力は以下のとおりです。

まとめ

このような背景ループは、シンプルなランニングゲームやジャンプゲームのような基本的な2Dゲームを作成するために使用することができます

チュートリアルを楽しんでいただけたでしょうか?

お読みいただきありがとうございました。

タイトルとURLをコピーしました