#python
#python
Вопрос:
Я создаю игру в Pygame. Теперь у меня на экране движется только один прямоугольник. Направление прямоугольника можно изменить с клавиатуры.
main.py :
import pygame
import sys
import player
import room
# Colors
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
blue = (0, 255, 0)
green = (0, 0, 255)
# Global variables
S_WIDTH = 800
S_HEIGHT = 800
FPS = 60
# player speed
SPEED = 2
# Initialization
pygame.init()
screen = pygame.display.set_mode([S_WIDTH, S_HEIGHT])
pygame.display.set_caption("Py-Man Alpha")
clock = pygame.time.Clock()
# Game class
class Game(object):
"""
This is main class of game.
All game events will happen here.
"""
Player = player.Player(blue, 50, 50, 0, 0)
def __init__(self, screen, running):
self.screen = screen
self.running = running
self.run()
def run(self):
while self.running:
# Events
for event in pygame.event.get():
# If user hits 'x'
if event.type == pygame.QUIT:
self.running = False
# Keyborad events
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
self.Player.direction = 'up'
self.Player.move(SPEED, WALLS)
elif event.key == pygame.K_DOWN:
self.Player.direction = 'down'
self.Player.move(SPEED, WALLS)
elif event.key == pygame.K_LEFT:
self.Player.direction = 'left'
self.Player.move(SPEED, WALLS)
elif event.key == pygame.K_RIGHT:
self.Player.direction = 'right'
self.Player.move(SPEED, WALLS)
elif event.key == pygame.K_p:
self.Player.direction = 'pause'
# Clear screen
self.screen.fill(white)
#Draw
self.Player.move(SPEED, WALLS)
self.Player.draw(self.screen)
for wall in WALLS:
wall.draw()
# Set clock
clock.tick(60)
# Update screen
pygame.display.flip()
# End of game
pygame.quit()
sys.exit()
# Tests
game = Game(screen, True)
player.py:
#imports
import pygame
class Player(pygame.sprite.Sprite):
"""
This class represent the player image
and has the player actions.
"""
direction = 'right'
def __init__(self, color, width, height, x, y):
# Pygame constructor
pygame.sprite.Sprite.__init__(self)
# Init. variables
self.color = color
self.width = width
self.height = height
# Create sprite
self.image = pygame.Surface([width, height])
self.image.fill(self.color)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
def draw(self, screen):
# Draw player on the screen
pygame.draw.rect(screen, self.color, [self.rect.x, self.rect.y, self.width, self.height], 0)
def move(self, speed, walls):
# Move the player
if self.direction == 'up':
self.rect.y -= speed
elif self.direction == 'down':
self.rect.y = speed
elif self.direction == 'left':
self.rect.x -= speed
elif self.direction == 'right':
self.rect.x = speed
итак, как я могу ускорить свою игру? Как я могу улучшить скорость? Где я ошибаюсь?
Спасибо!
РЕДАКТИРОВАТЬ: обновление монитора происходит медленно. Я нажимаю клавишу «вверх», но монитор принимает команду через 2-3 секунды. Почему?
Комментарии:
1. Этот вопрос, похоже, не по теме, потому что речь идет об улучшении рабочего кода, он может лучше подойти для codereview.stackexchange.com
2. Вы пробовали увеличивать
SPEED
переменную? Держу пари, это даст вам больше скорости.3. что такое медленно? обновление экрана или скорости проигрывателя?
4. возможно, вы можете попробовать обновить только после выполнения действия?
5. Я согласен с @Tim. Чтобы этот вопрос был не по теме, вам нужно профилировать свой код и определить узкое место, а затем конкретно спросить об этом.
Ответ №1:
Вы можете увеличить SPEED
или clock.tick(60)
Но я предпочитаю увеличивать SPEED
.
clock.tick(60)
означает 60 FPS
, и вы могли бы увеличить его, но многие мониторы обновляют его экран с 60Hz
помощью and it means 60 FPS
. Больший FPS означает больше работы для процессора, поэтому он горячее, и вы можете услышать вентилятор процессора 🙂
Кстати: человеческому глазу требуется не менее 24 кадров в секунду, чтобы увидеть анимацию.