#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
Чтобы измерить расстояние и сгладить реалистичное движение, вы также можете использовать уравнения движения из физики.