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