Как остановить движение персонажа после столкновения? - PullRequest
0 голосов
/ 11 января 2019

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

Я пытался сделать скорость персонажа x и скорость y равной 0, но, похоже, это не сработало. Я видел, как люди делают это с помощью объектно-ориентированного программирования, есть ли способ не использовать ООП?

# character co-ordinates
gokuX = 0
gokuY = 0

# using arrow keys to move the character
if keys[pygame.K_LEFT]:
    gokuVx = -RUN_SPEED
elif keys[pygame.K_RIGHT]:
    gokuVx = RUN_SPEED
if keys[pygame.K_UP]:
    gokuVy = -RUN_SPEED
elif keys[pygame.K_DOWN]:
    gokuVy = RUN_SPEED

# the rectangle around my character
gokuRect = pygame.Rect(gokuX, gokuY, gokuW, gokuH)

# store the rectangles inside a list
lvl1rlist = [lvl1r0, lvl1r1, lvl1r2, lvl1r3, lvl1r4, lvl1r5, lvl1r6, 
lvl1r7, lvl1r8]

# detecting collisions between the character and the rectangles
for i in range(9):
    if gokuRect.colliderect(lvl1rlist[i]):
        # I don't know what to do here to make the character not move

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

1 Ответ

0 голосов
/ 14 января 2019

Исходя из вашего частичного кода, я предполагаю, что вам нужно перестроить свои функциональные возможности - вам нужно только «переместить» прямоугольник ваших символов, ЕСЛИ нет столкновения - поэтому тест на столкновение необходимо выполнить до того, как вы переместитесь, или сразу после этого (в этом случае вам нужно будет повернуть вспять предыдущее движение - см. вариант 2).

Альтернатива 1:

По логике: проверка на столкновение; если со времени последнего хода столкновения не произошло, переместите персонажа.

    collision_detected = False

    # detecting collisions between the character and the rectangles after the last movement (!)
    for i in range(9):
        if gokuRect.colliderect(lvl1rlist[i]):
            print("collision detected.")       
            collision_detected  = True
            RUN_SPEED = 0
            # Show "Game Over" Screen



     if not collision_detected: 
        if keys[pygame.K_LEFT]:
            gokuVx = -RUN_SPEED
        elif keys[pygame.K_RIGHT]:
            gokuVx = RUN_SPEED
        if keys[pygame.K_UP]:
            gokuVy = -RUN_SPEED
        elif keys[pygame.K_DOWN]:
            gokuVy = RUN_SPEED     


    # the rectangle around my character
    gokuRect = pygame.Rect(gokuX, gokuY, gokuW, gokuH)

Альтернатива 2: (реверсировать движение - персонаж не «в» стене, а остановлен прямо перед ней)

Логически: перемещать персонажа; проверить на столкновение; если есть столкновение, поверните последнее движение и покажите экран «Игра окончена»

# movecharacter
if keys[pygame.K_LEFT]:
     gokuVx = -RUN_SPEED
elif keys[pygame.K_RIGHT]:
     gokuVx = RUN_SPEED
if keys[pygame.K_UP]:
     gokuVy = -RUN_SPEED
elif keys[pygame.K_DOWN]:
     okuVy = RUN_SPEED

 # the rectangle around my character
gokuRect = pygame.Rect(gokuX, gokuY, gokuW, gokuH)


# check for a collision         
for i in range(9):
       if gokuRect.colliderect(lvl1rlist[i]):
           print("collision detected.")

            # reverse previous movement which has led to a collision  
           if keys[pygame.K_LEFT]:
               gokuVx = +RUN_SPEED
           elif keys[pygame.K_RIGHT]:
                gokuVx = RUN_SPEED
           if keys[pygame.K_UP]:
               gokuVy = +RUN_SPEED
           elif keys[pygame.K_DOWN]:
               okuVy = RUN_SPEED

           RUN_SPEED = 0
           # Show "Game Over" Screen
...