Я создал клона flappybird, но я не могу столкнуться между птицами и телом горшка. - PullRequest
0 голосов
/ 14 июля 2020

Я использовал случайный диапазон для своих горшков, и я не знаю, как сделать столкновение между горшками и птицей. Я не могу использовать коды каналов, потому что это проект, и я должен создать его с помощью горшков. Я написал простой cra sh def, чтобы знать, что произошло столкновение. Не знаю, как брать диапазон банка


pygame.init()
#displayset
display_width = 600
display_height = 300
high_pot = display_height * 0.80
low_pot = display_height * 0.20
half_pot_gap = 50

#object
birdImg = pygame.image.load('bird.png')
bird_height = 80
bird_width = 80
x = 50
y = (display_height * 0.5) - (bird_height/2)

#colors
black = (0,0,0)
white = (255,255,255)
yellow = (255,255,0)
red = (255,0,0)
skyblue = (135,206,235)
orange = (255,69,0)

#deeeeeef
def bird(x,y):
    gameDisplay.blit(birdImg,(x,y))
    

    
    
def pot(pot1X,pot1Y,pot1H,pot2X,pot2Y,pot2H,potW,potColor):
    pygame.draw.rect(gameDisplay,potColor,(pot1X,pot1Y,potW,pot1H))
    pygame.draw.rect(gameDisplay,black,(pot1X,pot1Y,potW,pot1H),2)
    
    
    pygame.draw.rect(gameDisplay,potColor,(pot2X,pot2Y,potW,pot2H))
    pygame.draw.rect(gameDisplay,black,(pot2X,pot2Y,potW,pot2H),2)
    
    pot_head_1X = pot1X - 10
    pot_head_1Y = pot1H
    pot_head_2X = pot2X - 10
    pot_head_2Y = pot2Y
    pot_head_width = 50
    pot_head_height = 20
    
    pygame.draw.rect(gameDisplay,orange,(pot_head_1X,pot_head_1Y,pot_head_width,pot_head_height))
    pygame.draw.rect(gameDisplay,black,(pot_head_1X,pot_head_1Y,pot_head_width,pot_head_height),2)
    
    pygame.draw.rect(gameDisplay,orange,(pot_head_2X,pot_head_2Y,pot_head_width,pot_head_height))
    pygame.draw.rect(gameDisplay,black,(pot_head_2X,pot_head_2Y,pot_head_width,pot_head_height),2)
    
    
def new_pot(factor):
    new_random = random.randrange(low_pot,high_pot)
    pot1H = new_random - half_pot_gap
    pot1X = display_width + 100 * factor
    pot1Y = 0
    
    pot2H = display_height - (new_random + half_pot_gap)
    pot2X = display_width + 100 * factor
    pot2Y = new_random + half_pot_gap
    
    
    return pot1X,pot1Y,pot1H,pot2X,pot2Y,pot2H

#scoredef

def display_message(textMessage, tColor, position_X, position_Y):
    textMessage = str(textMessage)
    font_and_size = pygame.font.Font("freesansbold.ttf",22)
    text_surface = font_and_size.render(textMessage, True, tColor)
    text_rect = text_surface.get_rect()
    text_rect.center = ((position_X),(position_Y))
    gameDisplay.blit(text_surface,text_rect)
#pot
potW = 30
potColor = yellow
gameSpeed = 3

pot1X = [0,0,0,0]
pot1Y = [0,0,0,0]
pot1H = [0,0,0,0]
pot2X = [0,0,0,0]
pot2Y = [0,0,0,0]
pot2H = [0,0,0,0]

pot1X[0],pot1Y[0],pot1H[0],pot2X[0],pot2Y[0],pot2H[0] = new_pot(1)
pot1X[1],pot1Y[1],pot1H[1],pot2X[1],pot2Y[1],pot2H[1] = new_pot(3)
pot1X[2],pot1Y[2],pot1H[2],pot2X[2],pot2Y[2],pot2H[2] = new_pot(5)
pot1X[3],pot1Y[3],pot1H[3],pot2X[3],pot2Y[3],pot2H[3] = new_pot(6.5)

score = 0
score_counter = 0

def crash():
    display_message("YOU CRASHED" ,red,50, 50)

#window
gameDisplay = pygame.display.set_mode((display_width,display_height))

pygame.display.set_caption("Racey")

clock = pygame.time.Clock()

tasadof = False
y_change = 0

space_flag = 0
down = True
while not tasadof:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            tasadof = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                y_change = -9
                space_flag = 0
                down = False
                
                
    if not down:
        if y_change<0:
            if y-1 > - 10:
                y -= 1
            else:
                y= -10
            y_change+=1
            space_flag = 0
        else:
            down = True
            space_flag = 0
    else:
        y += 2
        if y> (display_height-(bird_height-20)):
            y = display_height-(bird_height-20)
    y += y_change            
    gameDisplay.fill(skyblue)
    bird(x,y)      
    for i in range(4):
        pot(pot1X[i],pot1Y[i],pot1H[i],pot2X[i],pot2Y[i],pot2H[i],potW,potColor)
        pot1X[i] -= gameSpeed
        pot2X[i] -= gameSpeed
        if pot1X[i] < -50 :
            pot1X[i],pot1Y[i],pot1H[i],pot2X[i],pot2Y[i],pot2H[i] = new_pot(1)
            score += 5
    pygame.display.update()
    clock.tick(100)
    
pygame.quit()
quit()

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

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

Было бы проще, если бы вы переделали свой код для использования pygames Rect class (docs здесь ) для хранения положения и размера объекта, с тех пор вы можете использовать встроенный метод Rect colliderect().

Можно go и используйте класс pygames Sprite и сделайте свою игру еще проще.

Наконец, лучше хранить всю информацию, относящуюся к отдельному объекту, например, горшку, вместе в отдельный экземпляр этого объекта, например класс pot, вместо того, чтобы хранить все значения x для них вместе в списке, а все высоты вместе в другом списке (et c), как вы делаете в отдельном POT1X и POT1H списки. Использование спрайтов сделает это неявно, поскольку вы расширите класс Sprite для каждого типа объекта. Один для птицы, а другой для горшков, хотя на самом деле вам не нужно использовать спрайты, чтобы перейти к использованию объектов / классов для ваших игровых объектов, вы можете просто создать свои собственные классы.

EDIT:

Довольно просто определить, перекрываются ли две области в какой-либо части. лично я бы так не поступил. Я бы использовал pygame.Rect, чтобы содержать информацию о прямоугольниках, а затем использовал colliderect(). Однако важно знать, как определить, пересекаются ли две области. Вы должны проверить, где находятся края прямоугольников относительно друг друга.

Предполагая, что r1_x и r1_y - это верхний правый угол rect1, а r1_w и r1_w - ширина и высота, и аналогично для r2_x, r2_y , r2_w, r2_h, затем:

def rect_collision_check(r1_x, r1_y, r1_w, r1_h, r2_x, r2_y, r2_w, r2_h):
    if ((r1_x + r1_w < r2_x) or (r1_x > r2_x + r2_w) or
        (r1_y + r1_h < r2_y) or (r1_y > r2_y + r2_h)):
        return False
    return True

Или просто возвращение логического результата напрямую:

def rect_collision_check(r1_x, r1_y, r1_w, r1_h, r2_x, r2_y, r2_w, r2_h):
    return not ((r1_x + r1_w < r2_x) or (r1_x > r2_x + r2_w) or
                (r1_y + r1_h < r2_y) or (r1_y > r2_y + r2_h))

L oop над горшками, вызывающими указанную выше функцию с информацией о птице и информация о горшке. Если вы получили True return, значит, произошло столкновение.

0 голосов
/ 14 июля 2020

Я просто хотел упомянуть, что было бы лучше добавить больше деталей к вашему вопросу. В частности, добавьте несколько комментариев, объясняющих, что происходит в вашем коде. Так ответит больше людей. ?

Теперь столкновение в Pygame очень просто ... если вы используете SPRITES !!! Идея в том, что вы создаете группу спрайтов, которая представляет собой довольно причудливый список трубок и птицы. Затем вы просто проверяете, не конфликтует ли что-нибудь в этом списке, есть простой способ сделать все это. Вот несколько ссылок, которые помогут вам начать:

Спрайты / уроки Pygame: https://kidscancode.org/blog/tags/pygame/

Как сделать обнаружение столкновения спрайтов: Как использовать спрайт Столкновение в Pygame

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