機能させるために変更する必要があることがいくつかあります。これらすべての変更の背景にはやや長い説明が含まれているので、それらを理解してゲームの他の部分に正しく適用することができます。追加の説明が必要ない場合は、この回答の下部にある作業コードにスキップできます。変更を加えたすべての場所にコメントを配置しました。
イベント処理
Pygame は、キー押下など、ゲームで発生するイベントのリストを保持します。を呼び出すと、最後の呼び出し以降にpygame.event.get()
発生したすべてのイベントのリストが返されます。これは、の各イベントに対して発生するため、関数内でコードが実行されていないことを意味しますが、while ループで呼び出したばかりであるため、空のリストを返します。一般的に言えば、コードの最後にあるのとまったく同じように、ループごとに 1 回だけ呼び出す必要があります。for ループには目的がないため、削除する必要があります。Attack()
pygame.event.get()
pygame.event.get()
pygame.event.get()
Attack()
やめる
pygame の小さな不都合は、デフォルトでは閉じるボタンが機能しないことです。つまり、ゲームを強制的に閉じる必要があります。これを修正するには、イベント ループで QUIT イベントを確認し、ゲームを終了する必要があります。コードがゲームに挿入される様子の例を次に示します。
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_SPACE:
var.Attack()
色
残念ながら、Pygame には色が組み込まれていないためBLUE
、inは機能しpygame.draw.circle(surface, BLUE, amntTuple, 20, 300)
ません。代わりに、RGB カラー モデルを使用して自分で青を作成するBLUE
には、 に置き換えます。pygame.Color(0,0,255)
描く
Pygame では、描画は 2 つのステップで行われます。まず、オブジェクトは見えない仮想面に描画されます。次に、 を呼び出すpygame.display.update()
と、仮想サーフェスが画面に描画され、ユーザーが見ることができます。これには、コンピューターが画面のちらつきなしでスムーズに描画できるなどの技術的な利点がありますが、 を呼び出さない限り、描画したものが表示されないことも意味しますpygame.display.update()
。pygame.display.update()
、あなたが描いたものは決して見えません。ただし、何度も呼び出すと、ゲームがちらついたり、予期しない動作をする場合があります。このため、通常はpygame.display.update()
ゲームループごとに 1 回だけ呼び出す必要があります ( のようにpygame.event.get()
)。一般に、pygame.display.update()
while ループの最後のコード行にすることができ、他のすべてはその前に置かれます。
Pygame で画面に描画するには、さまざまな方法があります。1 つの方法は、次のような組み込み関数を使用するpygame.draw.circle.
ことです。まず、前述したように BLUE は存在しません。次に、幅パラメータは、円自体の幅ではなく、円を描くために使用される線の幅です。したがって、通常は小さい数値にする必要があります。幅を 0 に設定すると、円はアウトラインとして描画される代わりに塗りつぶされます。draw.circle の修正版は次のとおりです。pygame.draw.circle(surface, pygame.Color(0,0,255), amntTuple, 20, 2)
画面に描画するもう 1 つの方法は、ブリッティングです。Pygame のすべては、仮想キャンバスのような Surface に描画する必要があります。pygame.image.load() を使用して画像をロードすると、画像は Surface としてロードされます。サーフェスを作成したら、ブリッティングを使用してそれを画面に描画します。例えば:
man = pygame.image.load("/images/man.png")
surface.blit (man, (0,0))
男性の画像を画面のピクセル 0,0 に描画するために使用されます。これは、後のゲーム開発プロセスで役立ちます。ただし、円を描いた直後に現在持っている blit は何もせず、self.space
とself.spaceRect
が存在しないためエラーが発生するため、今は削除する必要があります。
ワーキングコード
import math
import pygame, sys, time
from pygame.locals import *
pygame.init()
WINDOW_WIDTH = 1000
WINDOW_HEIGHT = 600
surface = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT),0,32)
pygame.display.set_caption('follow mouse')
surface.fill((255,255,255))
class Hero():
def Attack(self):
surface.fill ((255,255,255))
amntTuple = pygame.mouse.get_pos()
#Use pygame.Color to make a color.
#The last parameter is linewidth, and can be set to 0 for filled circles.
pygame.draw.circle(surface, pygame.Color(0,0,255), amntTuple, 20, 2)
#The blit was deleted because it did nothing and the broke code.
var = Hero()
while True:
for event in pygame.event.get():
#Add a quit event so you can close your game normally.
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_SPACE:
var.Attack()
#Update once at the end of each gameloop.
pygame.display.update()