Python 当以帧率独立(增量时间)移动时,精灵会口吃-pygame

Python 当以帧率独立(增量时间)移动时,精灵会口吃-pygame,python,windows,pygame,Python,Windows,Pygame,我想为水平和垂直运动实现帧率独立,但每次我这样做时,sprite都会口吃 视频下载中的代码: 使用从中选取的示例重新创建问题,并进行一些编辑 import time import pygame, sys clock = pygame.time.Clock() from pygame.locals import * pygame.init() # initiates pygame pygame.display.set_caption('Pygame Platformer') WINDOW

我想为水平和垂直运动实现帧率独立,但每次我这样做时,sprite都会口吃

视频下载中的代码:

使用从中选取的示例重新创建问题,并进行一些编辑

import time

import pygame, sys

clock = pygame.time.Clock()

from pygame.locals import *
pygame.init() # initiates pygame

pygame.display.set_caption('Pygame Platformer')

WINDOW_SIZE = (300*4,200*4)

screen = pygame.display.set_mode(WINDOW_SIZE,0,32) # initiate the window

display = pygame.Surface((300,200)) # used as the surface for rendering, which is scaled

moving_right = False
moving_left = False
vertical_momentum = 0
air_timer = 0

true_scroll = [0,0]

def load_map(path):
    f = open(path + '.txt','r')
    data = f.read()
    f.close()
    data = data.split('\n')
    game_map = []
    for row in data:
        game_map.append(list(row))
    return game_map

game_map = load_map('map')

grass_img = pygame.image.load('grass.png')
dirt_img = pygame.image.load('dirt.png')

player_img = pygame.image.load('player.png').convert()
player_img.set_colorkey((255,255,255))

player_rect = pygame.Rect(100,100,5,13)

background_objects = [[0.25,[120,10,70,400]],[0.25,[280,30,40,400]],[0.5,[30,40,40,400]],[0.5,[130,90,100,400]],[0.5,[300,80,120,400]]]

def collision_test(rect,tiles):
    hit_list = []
    for tile in tiles:
        if rect.colliderect(tile):
            hit_list.append(tile)
    return hit_list
vx = 0
def move(rect,movement,tiles):
    global vx
    collision_types = {'top':False,'bottom':False,'right':False,'left':False}

    vx  += movement[0]
    rect.x = vx
    hit_list = collision_test(rect,tiles)
    for tile in hit_list:
        if movement[0] > 0:
            rect.right = tile.left
            collision_types['right'] = True
        elif movement[0] < 0:
            rect.left = tile.right
            collision_types['left'] = True

    rect.y += movement[1]
    hit_list = collision_test(rect,tiles)
    for tile in hit_list:
        if movement[1] > 0:
            rect.bottom = tile.top
            collision_types['bottom'] = True
        elif movement[1] < 0:
            rect.top = tile.bottom
            collision_types['top'] = True
    return rect, collision_types
last_time = time.time()
while True: # game loop
    dt = time.time() - last_time
    last_time = time.time()
    display.fill((146,244,255)) # clear screen by filling it with blue

    true_scroll[0] += (player_rect.x-true_scroll[0]-152)/20
    true_scroll[1] += (player_rect.y-true_scroll[1]-106)/20
    scroll = true_scroll.copy()
    scroll[0] = int(scroll[0])
    scroll[1] = int(scroll[1])

    pygame.draw.rect(display,(7,80,75),pygame.Rect(0,120,300,80))
    for background_object in background_objects:
        obj_rect = pygame.Rect(background_object[1][0]-scroll[0]*background_object[0],background_object[1][1]-scroll[1]*background_object[0],background_object[1][2],background_object[1][3])
        if background_object[0] == 0.5:
            pygame.draw.rect(display,(14,222,150),obj_rect)
        else:
            pygame.draw.rect(display,(9,91,85),obj_rect)

    tile_rects = []
    y = 0
    for layer in game_map:
        x = 0
        for tile in layer:
            if tile == '1':
                display.blit(dirt_img,(x*16-scroll[0],y*16-scroll[1]))
            if tile == '2':
                display.blit(grass_img,(x*16-scroll[0],y*16-scroll[1]))
            if tile != '0':
                tile_rects.append(pygame.Rect(x*16,y*16,16,16))
            x += 1
        y += 1

    player_movement = [0,0]
    if moving_right == True:
        player_movement[0] += 2 * dt * 60
    if moving_left == True:
        player_movement[0] -= 2 * dt * 60
    player_movement[1] += vertical_momentum
    vertical_momentum += 0.2# * dt * 60
    if vertical_momentum > 3:
        vertical_momentum = 3
    print(player_movement, dt)
    player_rect,collisions = move(player_rect,player_movement,tile_rects)

    if collisions['bottom'] == True:
        air_timer = 0
        vertical_momentum = 0
    else:
        air_timer += 1

    display.blit(player_img,(player_rect.x-scroll[0],player_rect.y-scroll[1]))


    for event in pygame.event.get(): # event loop
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_RIGHT:
                moving_right = True
            if event.key == K_LEFT:
                moving_left = True
            if event.key == K_UP:
                if air_timer < 6:
                    vertical_momentum = -5
        if event.type == KEYUP:
            if event.key == K_RIGHT:
                moving_right = False
            if event.key == K_LEFT:
                moving_left = False
        
    screen.blit(pygame.transform.scale(display,WINDOW_SIZE),(0,0))
    pygame.display.update()
    clock.tick(60)

我用于项目的碰撞和绘图代码

def drawing(self, screen):
    screen.blit(self.covece, (self.hitbox.x - scroll[0], self.hitbox.y - scroll[1]))
  

def movement(self, listOfWalls, dt):
    #.speed.x , self.speed.y = 0,0
    if self.left:
        self.speed.x = -self.vel * dt * 60
    if self.right:
        self.speed.x = self.vel * dt * 60
    if self.up:
        self.speed.y = -self.vel * dt * 60
    if self.down:
        self.speed.y = self.vel * dt * 60
    if self.speed.x != 0 and self.speed.y != 0:
        self.speed.x *= .7071
        self.speed.y *= .7071
    print(self.speed)

    self.korY += self.speed.y 
    self.korX += self.speed.x 

    self.hitbox.x = self.korX
    if r := self.hitbox.collidelistall(listOfWalls):
        for n in r:
            if self.speed.x > 0:
                self.korX = listOfWalls[n].left - self.hitbox.width
            if self.speed.x < 0:
                self.korX = listOfWalls[n].right
    self.speed.x = 0
    self.hitbox.x = self.korX

    self.hitbox.y = self.korY
    if r := self.hitbox.collidelistall(listOfWalls):
        for n in r:
            if self.speed.y > 0:
                self.korY = listOfWalls[n].top - self.hitbox.height
            if self.speed.y < 0:
                self.korY = listOfWalls[n].bottom
    self.speed.y = 0
    self.hitbox.y = self.korY
def绘图(自身,屏幕):
blit(self.covece,(self.hitbox.x-scroll[0],self.hitbox.y-scroll[1]))
def移动(自身、列表墙、dt):
#.速度.x,自速度.y=0,0
如果self.left:
self.speed.x=-self.vel*dt*60
如果你是对的:
self.speed.x=self.vel*dt*60
如果自我更新:
self.speed.y=-self.vel*dt*60
如果self.down:
自速度y=自速度*dt*60
如果self.speed.x!=0和self.speed.y!=0:
自速度.x*=0.7071
自速度y*=0.7071
打印(自速度)
self.korY+=self.speed.y
self.korX+=self.speed.x
self.hitbox.x=self.korX
如果r:=self.hitbox.collizeListAll(listOfWalls):
对于r中的n:
如果self.speed.x>0:
self.korX=listOfWalls[n]。左-self.hitbox.width
如果自速度x<0:
self.korX=listOfWalls[n]。对吗
self.speed.x=0
self.hitbox.x=self.korX
self.hitbox.y=self.korY
如果r:=self.hitbox.collizeListAll(listOfWalls):
对于r中的n:
如果自速度y>0:
self.korY=listOfWalls[n]。top-self.hitbox.height
如果自速度y<0:
self.korY=listOfWalls[n]。底部
自速度y=0
self.hitbox.y=self.korY
clock.tick(60)
)返回增量时间。它返回自上次调用以来经过的毫秒数。因此,您可以执行
dt=clock.tick(60)/1000
def drawing(self, screen):
    screen.blit(self.covece, (self.hitbox.x - scroll[0], self.hitbox.y - scroll[1]))
  

def movement(self, listOfWalls, dt):
    #.speed.x , self.speed.y = 0,0
    if self.left:
        self.speed.x = -self.vel * dt * 60
    if self.right:
        self.speed.x = self.vel * dt * 60
    if self.up:
        self.speed.y = -self.vel * dt * 60
    if self.down:
        self.speed.y = self.vel * dt * 60
    if self.speed.x != 0 and self.speed.y != 0:
        self.speed.x *= .7071
        self.speed.y *= .7071
    print(self.speed)

    self.korY += self.speed.y 
    self.korX += self.speed.x 

    self.hitbox.x = self.korX
    if r := self.hitbox.collidelistall(listOfWalls):
        for n in r:
            if self.speed.x > 0:
                self.korX = listOfWalls[n].left - self.hitbox.width
            if self.speed.x < 0:
                self.korX = listOfWalls[n].right
    self.speed.x = 0
    self.hitbox.x = self.korX

    self.hitbox.y = self.korY
    if r := self.hitbox.collidelistall(listOfWalls):
        for n in r:
            if self.speed.y > 0:
                self.korY = listOfWalls[n].top - self.hitbox.height
            if self.speed.y < 0:
                self.korY = listOfWalls[n].bottom
    self.speed.y = 0
    self.hitbox.y = self.korY