@Afafks123132132165

Почему pygame работает нестабильно?

Когда меняю time delay то игрок начинает двигаться медленнее или быстрее. Но это ничего он дрожит и как то рывками перемещается. Что делать?
import pygame

pygame.init();
win = pygame.display.set_mode((320,320));
pygame.display.set_caption("Game")

x = 144
y = 144
width = 32
height = 32
speed = 5

run = True

while run:
	pygame.time.delay(20)
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			run = False
	keys = pygame.key.get_pressed()
	if keys[pygame.K_UP]:
		y-=speed
	if keys[pygame.K_LEFT]:
		x-=speed
	if keys[pygame.K_RIGHT]:
		x+=speed
	if keys[pygame.K_DOWN]:
		y+=speed
	win.fill((0,0,0))
	pygame.draw.rect(win, (0,0,255), (x,y,width,height))
	pygame.display.update()	
pygame.quit()
  • Вопрос задан
  • 487 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ZhikharevKirill
Всё просто
У вас движение игрока привязано к частоте обновления игры, т.е. чаще обновляется - чаще двигается - быстрее перемещается
Исправить это можно домножив скорость игрока на задержку между обновлениями, вот так
delay = 20

pygame.time.delay(delay)

pos += speed * delay

Тем самым мы получаем, что игрок всегда двигается со скорость speed в миллисекунду
Итоговый код
import pygame

pygame.init();
win = pygame.display.set_mode((320,320));
pygame.display.set_caption("Game")

x = 144
y = 144
width = 32
height = 32
speed = 5

delay = 20

run = True

while run:
  pygame.time.delay(delay)
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      run = False
  keys = pygame.key.get_pressed()
  if keys[pygame.K_UP]:
    y-=speed*delay
  if keys[pygame.K_LEFT]:
    x-=speed*delay
  if keys[pygame.K_RIGHT]:
    x+=speed*delay
  if keys[pygame.K_DOWN]:
    y+=speed*delay
  win.fill((0,0,0))
  pygame.draw.rect(win, (0,0,255), (x,y,width,height))
  pygame.display.update()	
pygame.quit()


Но можно сделать ещё лучше
Можно напрямую указывать фпс, который будет контролироваться pygame

import pygame

pygame.init();
win = pygame.display.set_mode((320,320));
pygame.display.set_caption("Game")

fps = 60
fps_clock = pygame.time.Clock()

x = 144
y = 144
width = 32
height = 32
speed = 5

run = True

while run:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      run = False
  keys = pygame.key.get_pressed()
  if keys[pygame.K_UP]:
    y-=speed
  if keys[pygame.K_LEFT]:
    x-=speed
  if keys[pygame.K_RIGHT]:
    x+=speed
  if keys[pygame.K_DOWN]:
    y+=speed
  win.fill((0,0,0))
  pygame.draw.rect(win, (0,0,255), (x,y,width,height))
  pygame.display.update()	

  fps_clock.tick(fps)
pygame.quit()
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы