Изображение, нарисованное в pygame, не соответствует указанному месту - PullRequest
1 голос
/ 07 мая 2020

Всем привет, я изучаю основы pygame. Недавно я столкнулся с проблемой; Я решил загрузить изображение и назначил ему случайное место в окне pygame, но проблема заключалась в том, что иногда оно просто не появлялось в окне. Я нарисовал черным указателем то место, куда нужно было загрузить изображение. Затем я обнаружил, что черный указатель не совпадает с изображением и, следовательно, изображение не появляется в том месте, где я хочу его разместить. Поэтому мне нужна помощь в решении этой проблемы. Заранее спасибо. Код:

import pygame
import random

pygame.init()

#Pygame starters
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Blob runner")
clock = pygame.time.Clock()
targetpng = pygame.image.load("target.png")
#Quit checker
crashed = False
#COLOURS
white = (255, 255, 255)
black = (0, 0, 0)


def draw_environment(x,y):    
    game_display.fill(white)
    #Image
    game_display.blit(targetpng,(x, y)) 
    #Black pointer
    pygame.draw.circle(game_display, black, (x, y), 5 )
    pygame.display.update()

x, y = random.randrange(0,display_width), random.randrange(0,display_height)

while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
        # print(event)

    draw_environment(x,y)
    clock.tick(30)

pygame.quit()
quit()

Изображение: enter image description here

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Изображение имеет размер. может случиться так, что изображение будет за окном справа или внизу. Источник blit помещает верхний левый угол изображения в указанное положение.

Если вы хотите, чтобы изображение центрировалось на (x, y) , вы должны получить pygame.Rect с размером изображения (get_rect) и установить центр прямоугольника в указанную позицию (аргумент ключевого слова ). Используйте прямоугольник, чтобы указать позицию для операции blit.

img_rect = targetpng.get_rect(center = (x, y))
game_display.blit(targetpng, img_rect) 

У изображения есть размер, поэтому случайное положение изображения должно быть в диапазоне [image_size / 2, window_sizw - image_size / 2] .
Ширина а высоту pygame.Surface можно получить, набрав get_width() / get_height() или get_size(). Например:

img_size = targetpng.get_size()
x = random.randrange(img_size[0]//2, display_width  - img_size[0]//2)
y = random.randrange(img_size[1]//2, display_height - img_size[1]//2)
0 голосов
/ 07 мая 2020

Теперь я понимаю, что пошло не так с идеей @ Rabbid76.

Дело в том, что я нарисовал картинку краской, а затем открыл файл в gimp, чтобы преобразовать белые части изображения в альфа (фон в виде шахматной доски). Но проблема возникла, когда я не удалил нежелательную альфа-канал, так как я думал, что компьютер не распознает альфа-канал, но на самом деле он распознает.

Итак, когда я загружал изображение, угол изображения не фактического "целевого пятна", а всего изображения, поэтому угол будет на альфе. Черная точка все время указывала на угол изображения, и иногда изображение не отображалось, потому что угол находился слишком близко к границе, поэтому изображение могло попасть в неотображаемую часть окна.

Таким образом, исправление состоит в том, чтобы очистить альфа или белый фон до минимума и только затем преобразовать его в альфа. Затем сделайте так, как говорит @ Rabbid76: D.

...