Задать вопрос
@Last1Try
Начинающий программист

Создание движка на пайгейм, как реализовать коллизию между объектами?

Возникла проблема с созданием физики и коллизии персонажа и объектов. Не могу сделать так, что бы персонаж не прыгал сквозь блоки и стоял на них свободно, и мог вообще взаимодействовать с другими объектами. Есть предположение, что все блоки надо вставлять в 1 класс, и дальше как то взаимодействовать с персонажем, но не знаю как сделать. Помогите пожалуйста, так как выбрал создание игры как тема проекта(10 класс), но не осознал своих сил, начал писать движок сам.
5cb4dbb731c27695886521.jpeg5cb4dbbf63457512380631.png5cb4dbc680e93863525004.png5cb4dbd101807339230203.png5cb4dbe0f09b7130428654.png5cb4dbe7c806c177805079.png
import pygame
pygame.init()

win = pygame.display.set_mode((500, 500))

pygame.display.set_caption("Sulzhenko Project")

walkRight = pygame.image.load('right.png')

walkLeft = pygame.image.load('left.png')

bg = pygame.image.load('pygame_bg.jpg')
playerStand = pygame.image.load('stay.png')
block = pygame.image.load('Block.png')
cherry = pygame.image.load('cherry4.png')

clock = pygame.time.Clock()

x = 50
y = 445
width = 50
height = 50
speed = 5

isJump = False
jumpCount = 10

left = False
right = False
animCount = 0

def drawWindow():
    global animCount
    global animTrigger
    win.blit(bg, (0, 0))
    win.blit(block, (150, 350))
    win.blit(block, (175, 350))
    win.blit(block, (200, 350))
    win.blit(block, (225, 350))
    win.blit(block, (250, 350))
    win.blit(block, (375, 350))
    win.blit(block, (275, 350))
    win.blit(block, (300, 350))
    win.blit(block, (325, 350))
    win.blit(block, (350, 350))
    win.blit(block, (125, 350))
    win.blit(block, (100, 350))
    win.blit(block, (75, 350))
    win.blit(block, (50, 350))
    win.blit(block, (25, 350))
    win.blit(block, (0, 350))
    win.blit(block, (375, 350))
    win.blit(block, (400, 350))
    win.blit(block, (150, 200))
    win.blit(block, (175, 200))
    win.blit(block, (200, 200))
    win.blit(block, (225, 200))
    win.blit(block, (250, 200))
    win.blit(block, (375, 200))
    win.blit(block, (275, 200))
    win.blit(block, (300, 200))
    win.blit(block, (325, 200))
    win.blit(block, (350, 200))
    win.blit(block, (125, 200))
    win.blit(block, (100, 200))
    win.blit(block, (75, 200))
    win.blit(block, (475, 200))
    win.blit(block, (450, 200))
    win.blit(block, (425, 200))
    win.blit(block, (375, 200))
    win.blit(block, (400, 200))
    win.blit(cherry, (450, 150))

    if left:
        win.blit(walkLeft, (x, y))
    elif right:
        win.blit(walkRight, (x, y))
    else:
        win.blit(playerStand, (x, y))

    pygame.display.update()

run = True
while run:
    clock.tick(30)

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

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and (x > 5):
        x -= speed
        left = True
        right = False
    elif keys[pygame.K_RIGHT] and x < 500 - width - 5:
        x += speed
        left = False
        right = True
    else:
        left = False
        right = False
        animCount = 0
    if not (isJump):
        if keys[pygame.K_SPACE]:
            isJump = True
    else:
        if jumpCount >= -10:
            if jumpCount < 0:
                y += (jumpCount ** 2) / 2.5
            else:
                y -= (jumpCount ** 2) / 2.5
            jumpCount -= 1
        else:
            isJump = False
            jumpCount = 10

    drawWindow()

pygame.quit()
  • Вопрос задан
  • 753 просмотра
Подписаться 1 Сложный 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
M0LCHALIVIY
@M0LCHALIVIY
Я не знаток в геймдеве, но тоже учусь.
Мне кажется тебе надо сделать что-то типо гравитации, которая уменьшает Y игрока, если низ игрока не в коллизии с чем-либо.
А коллизию проверять можно добавляя к координате Y высоту Игрока и, сравнивая с координатой Y блоков/пола.
Как то так, надеюсь логику ты понял, если я не прав поправьте в комментариях, узнаю свои ошибки
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы