Если у меня в Pygame есть два прямоугольника разных размеров (10 на 10 и 20 на 20), как я могу выяснить, когда два прямоугольника сталкиваются? - PullRequest
0 голосов
/ 14 октября 2019

Я не могу определить, когда сталкиваются два прямоугольника разных размеров.

Я пытался, "если x == obj_x и y == obj_y:" где x - это значение x одного прямоугольника, obj_xявляется значением x другого прямоугольника, и то же самое для значений y.

import pygame
import time
import random

pygame.init()
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)

display_width = 500
display_height = 500

screen = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('Avoid')

x_change = 0
y_change = 0

FPS = 30
block_size = 10

font = pygame.font.SysFont(None, 25)
smallfont = pygame.font.SysFont("comicsansms",25)


def showLives(lives):
    text = smallfont.render("Lives: "+str(lives), True, white)
    screen.blit(text, [0,0])
def message_to_screen(msg,color):
    screen_text = font.render(msg, True, color)
    screen.blit(screen_text, [100,250])

clock = pygame.time.Clock()

def gameLoop():
    gameExit = False
    gameOver = False

    x = 250
    y = 425

    x_change = 0
    y_change = 0

    obj_speed = 5


    obj_y = 0
    obj_x = 0

    obj2_y = 0
    obj2_x = 0
    obj2_speed = 3

    lives = 3
    while not gameExit:
        while gameOver == True:
            screen.fill(white)
            message_to_screen("Game Over, Press C to play again or Q to quit", red)
            pygame.display.update()
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        gameExit = True
                        gameOver = False
                    if event.key == pygame.K_c:
                        gameLoop()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x_change = -block_size
                    y_change = 0
                elif event.key == pygame.K_RIGHT:
                    x_change = block_size
                    y_change = 0
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    x_change = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    x_change = 0
                    y_change = 0
        if x > 500-block_size:
            x-=block_size
        if x < 0+block_size:
            x+=block_size
 #       if x >= display_width-block_size-block_size or x < 0:
 #           gameOver = True
        obj_y = obj_y + obj_speed
        if obj_y > display_height:
            obj_x = random.randrange(0, display_width-block_size)
            obj_y = -25
        obj2_y = obj2_y + obj2_speed
        if obj2_y > display_height:
            obj2_x = random.randrange(1, display_width-block_size)
            obj2_y = -27

        x += x_change
        y += y_change
        screen.fill(black)

        pygame.draw.rect(screen,white, [obj_x,obj_y,20,20])
        pygame.draw.rect(screen,white, [obj2_x,obj2_y,20,20])
        pygame.draw.rect(screen, red, [x,y,block_size,block_size])
        showLives(lives)
        pygame.display.update()
        if x == obj_x and y == obj_y:
            lives -= 1
        if lives == 0:
            gameOver = True
    clock.tick(FPS)
    pygame.quit()
    quit()

gameLoop()

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

1 Ответ

1 голос
/ 14 октября 2019

PyGame имеет класс pygame.Rect () , чтобы сохранить положение и размер прямоугольника. Он использует его для рисования изображений / спрайтов и проверки столкновения между спрайтами.

x = 250
y = 425

obj_y = 0
obj_x = 0

rect_1 = pygame.Rect(x, y, 10, 10)
rect_2 = pygame.Rect(obj_x, obj_y, 20, 20)

, а затем вы можете проверить столкновение

rect_1.colliderect(rect_2)

Вы также можете использовать его для рисования прямоугольника на экране

pygame.draw.rect(screen, white, rect_2)
pygame.draw.rect(screen, red, rect_1)

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

button_rect.collidepoint(event.pos)

Чтобы изменить значения в прямоугольнике, у вас есть rect_1.x, rect_1.y, rect_1.width, rect_1.height, но также

x,y
top, left, bottom, right
topleft, bottomleft, topright, bottomright
midtop, midleft, midbottom, midright
center, centerx, centery
size, width, height
w,h

Некоторые из них принимают кортеж с (x, y)

, например: центральный прямоугольник на экране

rect_1.center = (display_width//2, display_height//2)

или событие с использованием screen

rect_1.center = screen.get_rect().center

ИЛИцентральный текст на экране

screen_text_rect = screen_text.get_rect()
screen_text_rect.center = screen.get_rect().center

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