после того, как я нажму на изображение для блита, когда MOUSEBUTTONDOWN новый блит, затем исчезнет в pygame

Я новичок в python, особенно в pygame, и задаюсь вопросом, как сохранить новое изображение после MOUSEBUTTONDOWN. Вот мой код:

color = pygame.image.load('billes.png')
red = color.subsurface(50, 70, 79, 71)
r = display.blit(red,(918,920))

def play():  
    if event.type == pygame.MOUSEBUTTONDOWN:
        pos = pygame.mouse.get_pos()
        if r.collidepoint(pos):
            display.blit(red, (10,10))
while True:
    ...
    for event in pygame.event.get():
        ...
        if event.type == MOUSEBUTTONDOWN and event.button == 1:
            if r.collidepoint(pos):
                display.blit(red, (800, 700))

он отображает мое новое изображение, когда я нажимаю левую кнопку мыши, но исчезает через одну секунду, даже если кнопка все еще нажата. Я тоже пробовал использовать pygame.mouse.get_pressed()[0], но результат тот же. Как мне сохранить новый блит после MOUSEBUTTONDOWN? Я думал поставить условие с помощью MOUSEBUTTONUP, но не знаю, как это сделать.


person Jayson Galante    schedule 03.01.2015    source источник


Ответы (1)


import pygame
pygame.init()
red = (200,0,0)
white = (255,255,255)
gameDisplay=pygame.display.set_mode((800,600))

FPS=30
clock=pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            quit()
    cur = pygame.mouse.get_pos() #taking click events every time
    click=pygame.mouse.get_pressed() ##again, every time
    if click[0] == 1: #if left-clicked
        pygame.draw.rect(gameDisplay,red, (100,200,100,200)) #draw a red rectangle
        pygame.display.update() #and update the display


    clock.tick(FPS)

Проблема в том, что вы использовали pygame.display.update () в неправильном месте. Я поправил и теперь работает.

На самом деле при каждом щелчке левой кнопкой мыши при этом рисуется прямоугольник, но вы можете видеть только один прямоугольник, потому что они находятся в одних и тех же координатах.

Если вы хотите быть уверены в этом, попробуйте:

import pygame,random
pygame.init()
red = (200,0,0)
white = (255,255,255)
black = (0,0,0)
gameDisplay=pygame.display.set_mode((800,600))

FPS=30
clock=pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            quit()
    cur = pygame.mouse.get_pos()
    click=pygame.mouse.get_pressed()
    if click[0] == 1:
        x=random.randint(1,700) #random coords of x
        y=random.randint(50,500) #random coords of y
        wx=random.randint(10,100) #random size of x
        hy=random.randint(60,200) #random size of y
        pygame.draw.rect(gameDisplay,red, (x,y,wx,hy)) #drawing with random variables
        pygame.display.update()


    clock.tick(FPS)

Это показывает, что наш метод работает. Также убедитесь, что если вы продолжаете нажимать левую кнопку мыши, она продолжит рисовать прямоугольники. Он рисовал прямоугольники и раньше, но мы не могли их увидеть, потому что они находились в тех же координатах, поэтому кажется, что в этой позиции есть только один прямоугольник.

Если вы хотите удалить этот прямоугольник, например, щелчком правой кнопкой мыши:

if click[2] == 1:
    pygame.draw.rect(gameDisplay,black, (100,200,100,200))
    pygame.display.update()

Добавьте нижнюю часть первого оператора if click. В основном он будет рисовать другой прямоугольник на первом прямоугольнике, сохраняя те же координаты, но того же цвета с фоном. Итак, ваш первый прямоугольник кажется стертым :-).

person Community    schedule 03.01.2015
comment
@JaysonGalante Я отредактировал свой ответ, проверьте еще раз, пожалуйста. - person ; 03.01.2015
comment
я пробовал со спрайтами, но у меня все еще та же проблема - person Jayson Galante; 03.01.2015
comment
я забыл проверить новые отредактированные извините, я попробую это - person Jayson Galante; 03.01.2015
comment
Вы, вероятно, делаете что-то не так, откройте новый файл и скопируйте этот код. Они работают. Значит, вы делаете что-то не так в своей программе. - person ; 03.01.2015
comment
Я пробовал, и он работает без спрайтов и изображений, но когда я использую точку столкновения, он возвращает ту же проблему - person Jayson Galante; 03.01.2015
comment
Что ж, тогда не используйте точку столкновения, я думаю, вы можете рисовать изображения слишком разными способами. - person ; 03.01.2015