Я написал простую игру в pygame. Раньше это было все в одном файле, но я решил сохранить его в чистоте, поэтому разделил код на разные скрипты. После этого игра работает намного медленнее, чем раньше. Я считаю, что задержка вызвана обращением к импортированным переменным и функциям в каждом кадре, но все еще не знаю, как решить эту проблему. Вот код, надеюсь поможете:
main.py
import pygame
import player
import window
def main():
pygame.init()
running = True
clock = pygame.time.Clock()
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
window.refresh()
player.run()
clock.tick(window.FPS)
print(clock.get_fps())
pygame.display.update()
pygame.quit()
if __name__ == "__main__":
main()
player.py
import pygame
from math import sqrt
from window import WIDTH, HEIGHT, WIN
from classes import *
player = Obj(50, 50, 50, 10)
def normalize(x, y):
if x != 0 and y != 0:
return (x / sqrt(2), y / sqrt(2))
return (x, y)
def movement(obj: Obj):
keys = pygame.key.get_pressed()
startx = obj.x
starty = obj.y
x = 0
y = 0
if keys[pygame.K_w]:
y -= obj.vel
if keys[pygame.K_d]:
x += obj.vel
if keys[pygame.K_a]:
x -= obj.vel
if keys[pygame.K_s]:
y += obj.vel
pos = normalize(x, y)
obj.x += pos[0]
obj.y += pos[1]
speed = abs(sqrt((obj.x - startx) ** 2 + (obj.y - starty) ** 2))
# print(speed)
def on_track(obj: Obj):
if obj.x >= WIDTH - obj.size:
obj.x = WIDTH - obj.size
if obj.x <= 0:
obj.x = 0
if obj.y >= HEIGHT - obj.size:
obj.y = HEIGHT - obj.size
if obj.y <= 0:
obj.y = 0
def run():
pygame.draw.rect(WIN, (Color.black), (player.x, player.y, player.size, player.size))
movement(player)
on_track(player)
pygame.display.update()
окно.py
from classes import *
import pygame
WIDTH, HEIGHT = 800, 600
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Game")
FPS = 60
def refresh():
WIN.fill(Color.white)
классы.py
class Color():
white = (255, 255, 255)
black = (0, 0, 0)
blue = (0, 0, 255)
red = (255, 0, 0)
green = (0, 255, 0)
class Obj():
def __init__(self, x, y, size, vel):
self.x = x
self.y = y
self.size = size
self.vel = vel
Заранее спасибо!
Боже мой, это действительно было проблемой. Кроме того, я должен был уточнить, что я пользователь Mac, поскольку нередки случаи, когда ОС оказывается проблемой. Возможно, Windows обрабатывает повторяющиеся display.update
по-другому, и поэтому на вашем ПК все работает без сбоев. В любом случае, не могли бы вы продублировать комментарий в разделе ответов, так как так получилось, что это оказалось решением
Готово. Хорошо, приятно знать. Я использую Linux Debian. Не тестировался на окнах.
Вы называете pygame.display.update
дважды (в player.run
и main.main
).
Удаление его из player.run
решает проблему.
Вы вызываете
pygame.display.update
дважды (вplayer.run
иmain.main
), но в остальном я не вижу никаких проблем, и ваш код работает без проблем на моем компьютере. Я также помещал все в тот же файл и не замечал никакой разницы. Вы пытались профиль код?