Как сгладить числа в пигаме? - PullRequest
0 голосов
/ 04 мая 2018

В настоящее время я работаю над игрой, в которой вам задают математический вопрос, например 2 + 1, и цифры будут выпадать из верхней части экрана. Игрок должен щелкнуть правильный ответ, прежде чем он упадет под экран. Тем не менее, я не хочу загружать изображения чисел, потому что это будет тратить много времени. Есть ли способ рисовать или билить цифры вместо? Если есть, могут ли числа быть в форме круга вместо прямоугольника?

РЕДАКТИРОВАТЬ : Я мог бы создать числа, отображая их в виде текста. Однако это означало бы, что я должен создать сотни различных прямоугольников для каждого возможного ответа. У меня вопрос: есть ли способ сказать Python, чтобы он генерировал числа и помещал их в прямоугольник без необходимости делать это вручную?

1 Ответ

0 голосов
/ 05 мая 2018

Одним из решений будет создание класса, в котором вы храните фактический ответ, текстовую поверхность и прямоугольник для обнаружения столкновений. Я использую здесь подкласс pygame.sprite.Sprite, но вы можете сделать то же самое с обычным классом. Когда задают новый вопрос, вы можете просто создать группу экземпляров и добавить их в группу спрайтов, чтобы вы могли полностью обновить их в основном цикле. Вы можете использовать метод pygame.Rect.collidepoint для обнаружения столкновений.

import random

import pygame as pg
from pygame.math import Vector2


pg.init()
BLUE = pg.Color('dodgerblue1')
FONT = pg.font.Font(None, 42)


class Answer(pg.sprite.Sprite):

    def __init__(self, pos, number):
        super().__init__()
        # Store the actual number, so that we can compare it
        # when the user clicks on this object.
        self.number = number
        # Render the new text image/surface.
        self.image = FONT.render(str(number), True, BLUE)
        # A rect with the size of the surface, used for collision
        # detection and rendering.
        self.rect = self.image.get_rect(topleft=pos)
        self.vel = Vector2(0, random.uniform(1, 4))
        self.pos = Vector2(pos)

    def update(self):
        self.pos += self.vel
        self.rect.center = self.pos

        if self.rect.top > 480:  # Screen bottom.
            self.kill()  # Remove the sprite from all groups.


def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    all_sprites = pg.sprite.Group()
    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.MOUSEBUTTONDOWN:
                if event.button == 3:  # Right mouse button.
                    # Add 20 numbers (Answer objects).
                    for _ in range(20):
                        number = random.randrange(100)
                        all_sprites.add(Answer((random.randrange(620), -20), number))
                elif event.button == 1:  # Left mouse button.
                    # See if the user clicked on a number.
                    for answer in all_sprites:
                        # event.pos is the mouse position.
                        if answer.rect.collidepoint(event.pos):
                            print(answer.number)


        all_sprites.update()

        screen.fill((30, 30, 30))
        all_sprites.draw(screen)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()

(Щелкните правой кнопкой мыши, чтобы вызвать числа, щелкните левой кнопкой мыши, чтобы коснуться отдельных чисел.)

...