Как мне заставить объект перестать двигаться, если он столкнулся со стеной в pygame?

#python #pygame #game-development

#python #pygame #разработка игр

Вопрос:

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

 #Imports
import pygame, sys


#Functions




#General Set Up
pygame.init()
clock = pygame.time.Clock()

#Main Window

swid = 1280        
shgt = 700
screen = pygame.display.set_mode((swid, shgt))
pygame.display.set_caption("Raid: The Game || Movement Test")


#Game Rectangles

player = pygame.Rect(30, 30, 30, 30)
wall = pygame.Rect(140, 80, 1000, 20)
window = pygame.Rect(300, 400, 220, 20)
door = pygame.Rect(500, 500, 120, 18)

bgcol = (0,0,0)
playercol = (200,0,0)
wallcol = pygame.Color("grey12")
doorcol = pygame.Color("blue")
windowcol = (100,100,100)

xwalkspeed = 0
ywalkspeed = 0


while True:
    #Handling Input
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_DOWN:
                ywalkspeed  = 10
            if event.key == pygame.K_UP:
                ywalkspeed -= 10
            if event.key == pygame.K_LEFT:
                xwalkspeed -= 10
            if event.key == pygame.K_RIGHT:
                xwalkspeed  = 10

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_DOWN:
                ywalkspeed -= 10
            if event.key == pygame.K_UP:
                ywalkspeed  = 10
            if event.key == pygame.K_LEFT:
                xwalkspeed  = 10
            if event.key == pygame.K_RIGHT:
                xwalkspeed -= 10
    
    
    
    player.x  = xwalkspeed
    player.y  = ywalkspeed

    distancebetween = 0

    if player.colliderect(wall):
        ywalkspeed = 0
        xwalkspeed= 0
                       

    if player.top <= 0:
        player.top = 0
    
    if player.bottom >= shgt:
        player.bottom = shgt

    if player.left <= 0:
        player.left = 0

    if player.right >= swid:
        player.right = swid


    
    #Visuals
    screen.fill(bgcol)
    pygame.draw.ellipse(screen, playercol, player)
    pygame.draw.rect(screen, wallcol, wall)
    pygame.draw.rect(screen, doorcol, door)
    pygame.draw.rect(screen, windowcol, window)


    #Updating the Window
    pygame.display.flip()
    clock.tick(60)
  

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

Я нашел причину, по которой он продолжал двигаться в противоположную сторону, когда он сталкивается со стеной. Это потому, что если я двигаюсь к стене, my ywalkspeed = 10 и когда я столкнулся со стеной, это становится 0 , тогда, если я начал отпускать клавишу перемещения, становится ywalkspeed = -10 ywalkspeed . В настоящее время я не знаю, как это исправить, поскольку я всего лишь новичок.

Ответ №1:

Создайте копию исходного прямоугольника игрока с copy() помощью . Переместите игрока. Если обнаружено столкновение, восстановите прямоугольник игрока:

 copy_of_player_rect = player.copy()

# move player
# [...]

if player.colliderect(wall):
    player = copy_of_player_rect 
  

Комментарии:

1. Я выполнил предложение Rabbid76. Это сработало, но как только он сталкивается со стеной, он закрывается и сообщает, что объект «pygame.Rect» не вызывается.

2. Хороший момент. Но, видимо, код слишком длинный, возможно, я отредактирую его позже

Ответ №2:

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

 xwalkspeed = 0
ywalkspeed = 0
  

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