Пигментное столкновение между прямоугольниками

1

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

Изображение 174551

но я застрял сейчас. Я действительно не знаю, как выглядит код, хотя я смотрел документацию. И, во-вторых, я не уверен, как создать "Sprite". Как сделать свой прямоугольник как "спрайт", или это не имеет значения, и он может оставаться только обычным прямоугольником, который движется?

import pygame
pygame.init()

win = pygame.display.set_mode((1200, 600))

pygame.display.set_caption("My Game")

x = 40
y = 45
width = 30
height = 30
vel = 4
black = (0,0,0)

run = True
while run:
pygame.time.delay(15)

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        run = False

win.fill((255,255,255))

keys = pygame.key.get_pressed()

if keys[pygame.K_LEFT] and x > 0:
    x -= vel
if keys[pygame.K_RIGHT] and x < 1200 - width:
    x += vel
if keys[pygame.K_UP] and y > 0:
    y -= vel
if keys[pygame.K_DOWN] and y < 600 - height:
    y += vel

pygame.draw.rect(win, (255, 0, 0), (x, y, width, height))

# Boundaries
pygame.draw.rect(win, (black), (0, 0, 1200, 20))
pygame.draw.rect(win, (black), (0, 0, 20, 600))
pygame.draw.rect(win, (black), (0, 580, 1200, 20))
pygame.draw.rect(win, (black), (1180, 0, 20, 600))

# Obstacle walls
pygame.draw.rect(win, (black), (300, 0, 20, 530))
pygame.draw.rect(win, (black), (20, 100, 230, 20))
pygame.draw.rect(win, (black), (70, 200, 230, 20))
pygame.draw.rect(win, (black), (20, 300, 230, 20))
pygame.draw.rect(win, (black), (70, 400, 230, 20))

# Middle Wall
pygame.draw.rect(win, (black), (600, 100, 20, 500))


pygame.display.update()

pygame.quit()
Теги:
pygame

1 ответ

1
Лучший ответ

Вам не нужны pygame sprites и группы спрайтов для обнаружения столкновений, вы можете просто использовать pygame.Rect. Я поместил все стены в список и сделаю их pygame.Rect объекты, тогда можно использовать colliderect rects для коллизий. Вам также нужен прямоугольник для игрока (просто замените x, y, width, height с помощью rect). Итерации над walls списка с for петель, чтобы проверить, если один сталкивается с игрока прямоугольником, а также привлечь их.

import pygame


pygame.init()
win = pygame.display.set_mode((1200, 600))
clock = pygame.time.Clock()  # A clock to limit the frame rate.
BLACK = (0, 0, 0)
WHITE = (255,255,255)
RED = (255, 0, 0)

# The player variables have been replaced by a pygame.Rect.
player = pygame.Rect(40, 45, 30, 30)
vel = 4
# The walls are now pygame.Rects as well. Just put them into a list.
walls = [
    pygame.Rect(0, 0, 1200, 20), pygame.Rect(0, 0, 20, 600),
    pygame.Rect(0, 580, 1200, 20), pygame.Rect(1180, 0, 20, 600),
    pygame.Rect(300, 0, 20, 530), pygame.Rect(20, 100, 230, 20),
    pygame.Rect(70, 200, 230, 20), pygame.Rect(20, 300, 230, 20),
    pygame.Rect(70, 400, 230, 20), pygame.Rect(600, 100, 20, 500),
    ]

run = True
while run:
    # Handle the events.
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()

    # Update the player coordinates.
    if keys[pygame.K_LEFT] and player.x > 0:
        player.x -= vel
    if keys[pygame.K_RIGHT] and player.x < 1200 - player.width:
        player.x += vel
    if keys[pygame.K_UP] and player.y > 0:
        player.y -= vel
    if keys[pygame.K_DOWN] and player.y < 600 - player.height:
        player.y += vel

    # Game logic.
    for wall in walls:
        # Check if the player rect collides with a wall rect.
        if player.colliderect(wall):
            print('Game over')
            # Then quit or restart.

    # Draw everything.
    win.fill(WHITE)
    pygame.draw.rect(win, RED, player)
    # Use a for loop to draw the wall rects.
    for wall in walls:
        pygame.draw.rect(win, BLACK, wall)

    pygame.display.update()
    clock.tick(60)  # Limit the frame rate to 60 FPS.

pygame.quit()
  • 0
    Большое спасибо, и особенно со списком "стен". Я бы никогда не подумал об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню