Почему это обнаружение столкновений не применяется к ранее созданным объектам? - PullRequest
0 голосов
/ 15 декабря 2018

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

import pygame,random
pygame.init()
width,height,radius = 1280,720,20
class Ball(): 
    def __init__(self):  
        self.x = 0
        self.y = 0
        self.vx = 0
        self.vy = 0  
def make_ball():
    ball = Ball()
    ball.x = random.randrange(radius, width - radius)
    ball.y = random.randrange(radius, 100)
    ball.vx = random.randint(1,2)
    ball.vy = 0
    return ball
def main():
    rect_x = 60    
    display = pygame.display.set_mode((width,height))
    pygame.display.set_caption("BOUNCE")
    running = True
    ball_list = []
    ball = make_ball()
    ball_list.append(ball)
    while running:  
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    ball = make_ball()
                    ball_list.append(ball)
        for ball in ball_list: 
            ball.x += ball.vx
            ball.vy += 0.02
            ball.y += ball.vy
            if ball.y >= height - radius:
                ball.vy *= -1
            if ball.x >= width - radius or ball.x <= radius:
                ball.vx *= -1    
        display.fill((0,0,0))   
        for ball in ball_list:
            random_color = (random.randint(1,255),random.randint(1,255),random.randint(1,255))
            circle = pygame.draw.circle(display,random_color,(int(ball.x), int(ball.y)),radius)   
        rectangle = pygame.draw.rect(display,(255,255,255),(int(rect_x),660,60,60)) 
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT and rect_x > 0:
                rect_x -= 2
            if event.key == pygame.K_RIGHT and rect_x < width - 60:
                rect_x += 2
        '''if pygame.Rect(circle).colliderect(rectangle) == True:   ###THIS IS THE BAD CODE!
            print('Your Score:',pygame.time.get_ticks())
            running = False'''
        text = pygame.font.Font(None,120).render(str(pygame.time.get_ticks()),True,(255,255,255))
        display.blit(text,(50,50)) 
        pygame.display.flip()
    pygame.quit()
if __name__ == "__main__":
    main()

1 Ответ

0 голосов
/ 15 декабря 2018

Отступ и организация кода - ключ к этому.нарушающий раздел (комментарии удалены):

for ball in ball_list:
    random_color = (random.randint(1,255),random.randint(1,255),random.randint(1,255))
    circle = pygame.draw.circle(display,random_color,(int(ball.x), int(ball.y)),radius)   
rectangle = pygame.draw.rect(display,(255,255,255),(int(rect_x),660,60,60)) 
if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT and rect_x > 0:
        rect_x -= 2
    if event.key == pygame.K_RIGHT and rect_x < width - 60:
        rect_x += 2
if pygame.Rect(circle).colliderect(rectangle) == True:
    print('Your Score:',pygame.time.get_ticks())
    running = False

У вас были все правильные части, но порядок, в котором вы делаете их, выключен, а также отступ:

    for ball in ball_list:
        random_color = (random.randint(1,255),random.randint(1,255),random.randint(1,255))
        circle = pygame.draw.circle(display,random_color,(int(ball.x), int(ball.y)),radius)
        rectangle = pygame.draw.rect(display,(255,255,255),(int(rect_x),660,60,60))
        if pygame.Rect(circle).colliderect(rectangle):
            print('Your Score:',pygame.time.get_ticks())
            running = False

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

Говоря об этом, я бы рекомендовал использовать:

pressed = pygame.key.get_pressed()
if pressed[pygame.K_LEFT] and rect_x > 0:
    rect_x -= 2
if pressed[pygame.K_RIGHT] and rect_x < width - 60:
    rect_x += 2

for ball in ball_list:
    # for loop from above

вместо того, что у вас было.Это работает лучше всего, когда вы хотите, чтобы удерживать клавишу нажатой.pygame.key.get_pressed () получает состояние всех клавиш постоянно, а не только когда происходит событие

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