3

pygameとそのフォントライブラリを使用するためのチュートリアルをたくさん見つけましたが、それらはすべてまったく同じものを示しています。それらはすべて、背景にプレーンテキストを書き込む方法を示しています。これは素晴らしいことですが、それを超えると、私が見つけた有用な情報はあまりありません。

私が取り組んでいるプロジェクトでは、スプライトとして実装したメニューボタンがあります。それらにカーソルを合わせると、色が変わり、すべてがうまく機能します。私がやりたいのはこれらのボタンにテキストを書くことですが、それを行う方法に困惑しています。ドキュメントからfont.renderは次のように機能します。

「これにより、指定したテキストがレンダリングされた新しいサーフェスが作成されます。Pygameでは、既存のサーフェスにテキストを直接描画する方法はありません。代わりに、Font.renderを使用する必要があります。新しいサーフェスにテキストを描画して、の画像(サーフェス)を作成します。テキストを入力してから、この画像を別のサーフェスにブリットします。」

そこで、スプライトに添付されている画像を取得して、その上にテキストを直接ブリットしようとしました。それはほとんど何もしないようです:

    resume = self.button_font.render(
        'Resume Game',
        True,
        constants.WHITE,
        (23, 56, 245) # Main color of the button, tried without this as well
    )
    self.resume_button.image.blit(
        resume,
        self.resume_button.rect,
    )

コードが実行されることは知っていますが、テキストは表示されません。テキストをメイン画面の表面に直接ブリットすると、再開ボタンの上部に上書きされます(もちろんブリットの順序によって異なります)。私は何が間違っているのですか?ドキュメントはこれがそれを処理する正しい方法であることを示しているようですが、私はまだこれをしている人を見つけていません。どんな助けでも大歓迎です。

4

1 に答える 1

13

あなたはあなたconvertの表面に呼びかけましたSpriteか?そうでない場合は、そうする方がよいでしょう。

表面に異なるピクセルフォーマットがあると、あらゆる種類の迷惑で理解しにくいバグにつながります。


例:

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 400))
image = pygame.image.load('1.png')

sprite = pygame.sprite.Sprite()
sprite.image = image
sprite.rect = image.get_rect()

font = pygame.font.SysFont('Sans', 50)
text = font.render('This is a text', True, (255, 0, 0))

sprite.image.blit(text, sprite.rect)

group = pygame.sprite.Group()
group.add(sprite)
group.draw(screen)

pygame.display.flip()

print 'bits per pixel:'
print 'image', image.get_bitsize()
print 'screen', screen.get_bitsize()

これにより、次のバグが発生します。

変換せずに

出力:

bits per pixel
image 8
screen 32

ここで行を変更します

image = pygame.image.load('1.png')

image = pygame.image.load('1.png').convert()

そして、すべてがうまくいくでしょう:

変換あり

出力:

bits per pixel
image 32
screen 32
于 2012-07-08T20:08:08.510 に答える