PygameDelttime 函数向右转比向左转慢 10 倍

Pygame Delttime Function to go to the Right is 10 times slower than when I go to the left

你好 Whosebug 社区, 有人可以帮我解决我的问题吗? 当我向左移动时,我的速度非常快,但是当我想向右移动时,它就变得很慢。我从我的移动功能中删除了 dt 并且速度相同。我更改了按钮,但问题似乎只在我使用 += 时出现。你们中有人曾经处理过这个问题并且可以帮助我吗?

import pygame
import time
import random

#0 = Menu, 1 = Game, 2 = Quit
game_state = 1
WHITE = (255, 255, 255)

class Player(pygame.sprite.Sprite):
    speed = 100

    def __init__(self, WIDTH):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("player.png")
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, 480)

    def move(self, keys, dt):
        if(keys[0]):
            self.rect.x += self.speed * dt
            print(self.speed)
            print(dt)
            print(self.rect.x)
        if(keys[1]):
            print(self.speed)
            print(dt)
            self.rect.x -= self.speed * dt
            print(self.rect.x)
        

class Main():

    prev_time = time.time()
    dt = 0

    #initalizing menu or game depending on variables
    def __init__(self):
        global game_state

        while game_state !=2:
            WIDTH, HEIGHT = 800, 600
            screen = self.initialize_pygame("Alien Slaughter", WIDTH, HEIGHT)

            self.all_sprites = pygame.sprite.Group()
            self.player = Player(WIDTH)
            self.all_sprites.add(self.player)

            if(game_state == 1):
                self.prev_time = time.time()
                self.game(screen, WIDTH, HEIGHT)

    #calculating deltatime
    def calc_deltatime(self):
        self.now = time.time()
        self.dt = self.now - self.prev_time
        self.prev_time = self.now

    #initializing pygame and create window
    def initialize_pygame(self, title, width, height):
        screen = pygame.display.set_mode((width, height))
        pygame.display.set_caption(title)
        icon = pygame.image.load("icon.png")
        pygame.display.set_icon(icon)
        pygame.init()
        return screen

    def handle_inputs(self, keys, event):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_d:
                keys[0] = True
            if event.key == pygame.K_a:
                keys[1] = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_d:
                keys[0] = False
            if event.key == pygame.K_a:
                keys[1] = False

    def game(self, screen, width, height):
        global game_state

        BLACK = (100, 100, 100)

        keys = [False, False]

        #Game loop
        while game_state == 1:
            #Process input (events)
            for event in pygame.event.get():
                #Check for Closing windows
                if event.type == pygame.QUIT:
                    game_state = 2
                self.handle_inputs(keys, event)
            
            self.calc_deltatime()

            self.player.move(keys, self.dt)
            #Update
            self.all_sprites.update()

            #Draw / render
            screen.fill(BLACK)
            self.all_sprites.draw(screen)
            pygame.display.update()


game = Main()

由于pygame.Rect应该表示屏幕上的一个区域,因此pygame.Rect对象只能存储整数数据。

The coordinates for Rect objects are all integers. [...]

当移动添加到 Rect 对象的坐标时,坐标的小数部分会丢失。如果每一帧都这样做,位置误差会随着时间累积。

如果要以浮点精度存储对象位置,则必须将对象的位置分别存储在单独的变量和属性中,并同步 pygame.Rect 对象。 round坐标并将其赋给矩形的位置:

class Player(pygame.sprite.Sprite):
    speed = 100

    def __init__(self, WIDTH):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("player.png")
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, 480)
        self.x = self.rect.x

    def move(self, keys, dt):
        if keys[0]:
            self.x += self.speed * dt
        if keys[1]:
            self.x -= self.speed * dt
        self.rect.x = round(self.x)