Python 使用时钟的Pygame延迟问题

Python 使用时钟的Pygame延迟问题,python,pygame,clock,Python,Pygame,Clock,我用pygame做了一个蛇游戏,效果很好。然而,它有时对用户输入的响应不是很快。我用一个时钟和延迟来设置蛇的移动速度 移动代码: pygame.time.delay(1) clock.tick(7) player.move() render_screen() 渲染屏幕: screen.fill((0, 0, 0)) draw_grid() player.draw() food.draw() screen.fill((0, 0, 0), (0, 513, 512, 50)) start.draw

我用pygame做了一个蛇游戏,效果很好。然而,它有时对用户输入的响应不是很快。我用一个时钟和延迟来设置蛇的移动速度

移动代码:

pygame.time.delay(1)
clock.tick(7)
player.move()
render_screen()
渲染屏幕:

screen.fill((0, 0, 0))
draw_grid()
player.draw()
food.draw()
screen.fill((0, 0, 0), (0, 513, 512, 50))
start.draw()
screen.blit(comic_font.render('Score: ' + str(score), False, (255, 100, 0)), (10, size + 5))
pygame.display.update()
完整代码:

import pygame
import random

pygame.init()


class Snake:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.speed_x = 1
        self.speed_y = 0
        segments = []
        for a in range(1, 4):
            segments.append(Segment(self.x - a, self.y))
        self.segments = segments

    def move(self):
        global score, game_mode
        # handle key inputs
        keys = pygame.key.get_pressed()
        for key in keys:
            if self.speed_x == 0:
                if keys[pygame.K_a]:
                    self.speed_x = -1
                    self.speed_y = 0
                if keys[pygame.K_d]:
                    self.speed_x = 1
                    self.speed_y = 0
            elif self.speed_y == 0:
                if keys[pygame.K_w]:
                    self.speed_x = 0
                    self.speed_y = -1
                if keys[pygame.K_s]:
                    self.speed_x = 0
                    self.speed_y = 1

        # check for wall collisions
        if self.x + self.speed_x < 0 or self.x + self.speed_x > rows - 1 or self.y + self.speed_y > rows - 1 or \
                self.y + self.speed_y < 0:
            game_mode = "end"
            start.text = "RETRY"
            return None

        # moves snake
        self.segments.insert(0, Segment(self.x, self.y))
        self.x += self.speed_x
        self.y += self.speed_y

        # checks for self collisions
        for segment in self.segments:
            if self.x == segment.x and self.y == segment.y and self.segments.index(segment)!=len(self.segments)-1:
                game_mode = "end"
                start.text = "RETRY"
                break

        # checks for eating food
        if self.x == food.x and self.y == food.y:
            food.x = random.randrange(0, 16)
            food.y = random.randrange(0, 16)
            score += 1
        else:
            self.segments.pop()

    def draw(self):
        for segment in self.segments:
            segment.draw()
        pygame.draw.rect(screen, (255, 0, 0), (self.x * size / rows, self.y * size / rows, size / rows, size / rows))


class Segment:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self):
        pygame.draw.rect(screen, (0, 255 - player.segments.index(self), 0),
                         (self.x * size / rows, self.y * size / rows, size / rows, size / rows))


class Food:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self):
        pygame.draw.rect(screen, (255, 255, 0), (self.x * size / rows, self.y * size / rows, size / rows, size / rows))


class button:
    def __init__(self, x, y, r, g, b, text, font, width, height):
        self.x = x
        self.y = y
        self.r = r
        self.b = b
        self.g = g
        self.text = text
        self.font = font
        self.width = width
        self.height = height

    def draw(self):
        pygame.draw.rect(screen, (self.r, self.g, self.b), (self.x, self.y, self.width, self.height))
        screen.blit(self.font.render(self.text, False, (0, 100, 0)), (self.x + 10, self.y))

    def mouse_over(self, pos):
        if self.x < pos[0] < self.x + self.width and self.y < pos[1] < self.y + self.height:
            return True


def draw_grid():
    margin = size / rows
    x = 0
    y = 0
    for line in range(rows):
        x = x + margin
        y = y + margin

        pygame.draw.line(screen, (255, 255, 255), (x, 0), (x, size))
        pygame.draw.line(screen, (255, 255, 255), (0, y), (size, y))


def render_screen():
    screen.fill((0, 0, 0))
    draw_grid()
    player.draw()
    food.draw()
    screen.fill((0, 0, 0), (0, 513, 512, 50))
    start.draw()
    screen.blit(comic_font.render('Score: ' + str(score), False, (255, 100, 0)), (10, size + 5))
    pygame.display.update()


size = 512
rows = 16

screen = pygame.display.set_mode((size, size + 50))
pygame.display.set_caption("Snake")

comic_font = pygame.font.SysFont("Comic Sans MS", 30)

clock = pygame.time.Clock()

running = True
game_mode = "wait"

player = Snake(8, 8)
food = Food(random.randrange(0, 16), random.randrange(0, 16))
start = button(size - 155, size + 5, 0, 255, 0, "PLAY", comic_font, 150, 40)

score = 0

render_screen()

while running:
    for event in pygame.event.get():
        pos = pygame.mouse.get_pos()
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if start.mouse_over(pos):
                if game_mode == "wait":
                    game_mode = "play"
                    start.text = "PAUSE"
                elif game_mode == "play":
                    game_mode = "wait"
                    start.text = "RESUME"
                elif game_mode == "end":
                    game_mode = "play"
                    start.text = "PAUSE"
                    score = 0
                    running = True
                    game_mode = "wait"
                    player = Snake(8, 8)
                    food = Food(random.randrange(0, 16), random.randrange(0, 16))
                render_screen()
    if game_mode == "play":
        pygame.time.delay(1)
        clock.tick(7)
        player.move()
        render_screen()

导入pygame
随机输入
pygame.init()
蛇类:
定义初始化(self,x,y):
self.x=x
self.y=y
自速度_x=1
自速度_y=0
段=[]
对于范围(1,4)内的a:
segments.append(segments(self.x-a,self.y))
self.segments=段
def移动(自我):
全球得分,游戏模式
#处理关键输入
keys=pygame.key.get_pressed()
对于键入键:
如果self.speed_x==0:
如果键[pygame.K_a]:
self.speed_x=-1
自速度_y=0
如果键[pygame.K_d]:
自速度_x=1
自速度_y=0
elif self.speed_y==0:
如果键[pygame.K_w]:
自速度_x=0
self.speed_y=-1
如果键[pygame.K_s]:
自速度_x=0
自速度_y=1
#检查墙壁碰撞
如果self.x+self.speed\u x<0或self.x+self.speed\u x>行-1或self.y+self.speed\u y>行-1或\
self.y+self.speed_y<0:
游戏模式=“结束”
start.text=“重试”
一无所获
#移动蛇
self.segments.insert(0,segments(self.x,self.y))
self.x+=self.speed\u x
self.y+=self.speed\u y
#检查自碰撞
对于self.segments中的段:
如果self.x==segment.x和self.y==segment.y和self.segments.index(segment)=镜头(自分段)-1:
游戏模式=“结束”
start.text=“重试”
打破
#检查是否进食
如果self.x==food.x和self.y==food.y:
food.x=random.randrange(0,16)
food.y=random.randrange(0,16)
分数+=1
其他:
self.segments.pop()
def牵引(自):
对于self.segments中的段:
段.绘图()
pygame.draw.rect(屏幕,(255,0,0),(self.x*大小/行,self.y*大小/行,大小/行,大小/行))
班级部分:
定义初始化(self,x,y):
self.x=x
self.y=y
def牵引(自):
pygame.draw.rect(屏幕,(0255-player.segments.index(self),0),
(self.x*大小/行,self.y*大小/行,大小/行,大小/行))
类别食物:
定义初始化(self,x,y):
self.x=x
self.y=y
def牵引(自):
pygame.draw.rect(屏幕,(255,255,0),(self.x*大小/行,self.y*大小/行,大小/行,大小/行))
类别按钮:
定义初始化(self、x、y、r、g、b、文本、字体、宽度、高度):
self.x=x
self.y=y
self.r=r
self.b=b
self.g=g
self.text=文本
self.font=font
self.width=宽度
自我高度=高度
def牵引(自):
pygame.draw.rect(屏幕,(self.r,self.g,self.b),(self.x,self.y,self.width,self.height))
blit(self.font.render(self.text,False,(0,100,0)),(self.x+10,self.y))
def鼠标悬停(自身,位置):
如果self.x
完整的代码在上面重现了这个问题

在对此进行了一点实验之后,似乎当pygame.time.delay(1)越小,延迟就越小

我认为用户只能在tics之间读取输入,因此他们必须准确地在现场输入

我想这可能就是为什么延迟越小,输入越慢,因为延迟会影响每个输入之间的间隔时间

有人知道为什么游戏没有记录吗