Почему блоки не сталкиваются с мячом - PullRequest
1 голос
/ 22 апреля 2020

Я хочу, чтобы мяч сталкивался с блоками, а мяч - нет. Самолет - это название бара, который игрок может передвигать (70,10) Блок (кирпич) - кирпич, который игрок должен разбить (80,40) Размер игры (480 * 640) - это создать блок

, если блок Менее 30 блоков создаются случайным образом в случайном пространстве

    while len(wblock) <= 30:
        down = random.randint(0, 9)
        right = random.randint(0, 6)
        wb = random.randint(1,42)
        wblock.append([right*80, down*40, wb])

, когда вниз и вправо размер блока точек равен 80 * 40

    if wball[0] >= 460:
        bx = bx*(-1)
    if wball[0] == 0:
        bx = bx*(-1)
    if wball[1] >= 640:
        running = False
    if wball[1] == 0:
        by = by*(-1)
    wball[0] += bx*2
    wball[1] += by*2
    screen.blit(ball, (wball[0],wball[1]))
    ballrect = pygame.Rect(ball.get_rect())
    ballrect.left = wball[0]
    ballrect.right = wball[1]

, здесь также сталкиваются шарик и полоса, коробочка go через бар ... почему

    position = pygame.mouse.get_pos()
    planepos = (position[0], 600)
    position[0]
    screen.blit(plane, planepos)
    planerect = pygame.Rect(plane.get_rect())
    planerect.left = planepos[0]
    planerect.top = planepos[1]
    if planerect.colliderect(ballrect):
       by = by*(-1)
       print(by)

теперь этот код является столкновением шара, и блок

    index = 0
    for brick in wblock:
        index += 1
        brickrect = pygame.Rect(blocks[brick[2]].get_rect())
        brickrect.left=brick[0]
        brickrect.top=brick[1]
        if brickrect.colliderect(ballrect):
            wblock.pop(index)
            by = by*(-1)
            index -= 1
        screen.blit(blocks[brick[2]], (brick[0],brick[1]))



    fpsClock.tick(FPS)
    pygame.display.flip()

screen.blit(gameover, (10,100))
pygame.display.flip()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
    pygame.display.flip()

- мой код. мог бы получить мой вопрос?

когда мяч двигался, он двигался через блоки и застревал в небе

1 Ответ

1 голос
/ 22 апреля 2020

Проблема mjaor возникает при настройке ballrect. Вы должны установить ballrect.top вместо ballrect.right:

ballrect = pygame.Rect(ball.get_rect())
ballrect.left = wball[0]
ballrect.top = wball[1] # <---- `top` instead of `right`

Обратите внимание, вы можете установить положение прямоугольника с помощью аргумента ключевого слова, когда вы извлекаете прямоугольник из pygame.Surface (см. pygame.Surface.get_rect):

ballrect = ball.get_rect(topleft = wball)

Более того, прямоугольная область angular, которая покрыта поверхностью, возвращается pygame.Surface.blit :

ballrect = screen.blit(ball, wball)

Если вы хотите оценить, находится ли мяч в границах, вам нужно оценить, не превышает ли правая часть шара правая часть экрана, а левая - нет. превышает левое, верх не превышает верх, а нижнее не дно.
Создайте pygame.Rect объект для шара и сравните left, right, top 1030 * прямоугольника до границ. Инвертировать bx соответственно by, если мяч выходит за пределы:

screerect = screen.get_rect()
ballrect = ball.get_rect(topleft = wball)

if ballrect.left <= 0 or ballrect.right >= screerect.right:
    bx = -bx
if ballrect.top <= 0 or ballrect.bottom >= screerect.bottom:
    by = -by

wball[0] += bx*2
wball[1] += by*2

ballrect = screen.blit(ball, wball)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...