1

スペースバーを押すたびに、マウスの位置に円を描こうとしています。目標は、マウス カーソルを追っているキャラクターの周りにこの円を描き、接触する他のオブジェクトを殺すことです。私は正しい軌道に乗っていますか、また円を描くのはどのように機能しますか

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):
        for event in pygame.event.get():
            surface.fill ((255,255,255))
            amntTuple = pygame.mouse.get_pos()
            pygame.draw.circle(surface, BLUE, amntTuple, 20, 300)
            surface.blit (self.space, self.spaceRect)
            pygame.display.update()

var = Hero()
while True:
    for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key == K_SPACE:
                    var.Attack()
4

3 に答える 3

4

機能させるために変更する必要があることがいくつかあります。これらすべての変更の背景にはやや長い説明が含まれているので、それらを理解してゲームの他の部分に正しく適用することができます。追加の説明が必要ない場合は、この回答の下部にある作業コードにスキップできます。変更を加えたすべての場所にコメントを配置しました。

イベント処理

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.spaceself.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()
于 2013-06-06T19:21:59.597 に答える
0

次の行 (プログラムの最後の行):

var.Attack

関数を呼び出していませんattack

に置き換えます

var.Attack()

代わりにそれが機能するかどうかを確認します。

于 2013-06-06T17:18:11.067 に答える
0

コードは概念的に間違っています。メイン ループでのみイベントを処理し、表示を更新する必要があります。

...
class Hero():
    def __init__(self):
        self.attacks = []

    def attack(self):
        self.attacks.add(pygame.mouse.get_pos())

    def update(self):
        for amntTuple in self.attacks:
            pygame.draw.circle(surface, BLUE, amntTuple, 20, 300)
            surface.blit(self.space, self.spaceRect)

hero = Hero()
while True:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_SPACE:
                hero.attack()

    # Clean background
    surface.fill((255,255,255))

    # Update/Draw sprites
    hero.update()

    # Update screen
    pygame.display.update()

イベント中は、ゲーム ロジックを実行してステータスを更新するだけで、フレームごとに現在のステータスに従って画面を描画する必要があります。

于 2013-06-06T19:22:11.840 に答える