Executando verificação de segurança...
2

Quando faço a movimentação do personagem eu separo a speed e o passo para ter mais flexibilidade e aproveitar melhor a orientação a objetos.

Um exemplo seria mais ou menos assim:


# Apenas um exemplo de personagem
class Personagem(Objeto):
    
    def __init__(self):
        # Posições iniciais
        self.x = 0
        self.y = 0
        # Valor da velocidade
        self.speed = 2
        
    ...
    
    # Função que faz andar
    def walk(self, direction):
        self.x += direction[0] * self.speed
        self.y += direction.[1] * self.speed
        
    def level_up(self):
        self.speed += 1
        ...
        
        
# Criando o jogador
player = Personagem()
# Definindo as direções para a movimentação
movimento = { UP: (0, -1), DOWN: (0, 1), LEFT: (-1, 0), RIGHT: (1, 0)  }

# Andando
player.walk(movimento.DOWN)

É apenas um exemplo, mas dessa forma basta alterar a variavel speed da maneira que quiser. O passo do movimento pode ser alterado também para ser maior do que um pixel por padrão, tudo depende do quanto ele irá se movimentar na situação mais "lenta".

Carregando publicação patrocinada...
1

Ja tentei assim porém eu utilizo 64 pixels a cada movimento, se eu tento utilizar o speed multiplicando por um valor x, ele fica muito mais rapido e o que eu quero na real, é que ele desloque os 64 pixels em um tempo y o qual é definido pelo speed.

1

Poderia ser então 64 no lugar de 1 no movimento e o speed inicializar com algo como 1.2?

...
    self.speed = 1.2
...

movimento = { UP: (0, -64), DOWN: (0, 64), LEFT: (-64, 0), RIGHT: (64, 0)  }

Utilizando um número float pode dar mais controle para não aumentar tanto assim a velocidade.

Sei que de primeira não parece, mas multiplicar o passo de 64 por um valor x não apenas "aumenta" o passo. Aumentar a velocidade, na prática, é apenas andar mais no mesmo tempo. Talvez tendo o código completo dê de a gente testar e entender melhor.

1

Acho que poderia funcionar, mas a um probleminha se vc multiplicar speed pelo 64 nao séria mais 64 pois houve uma multiplicação efetuada e na new_pos seria somada a um valor diferente e o personagem não se movimentaria em blocos de 64, entende??

1

isso ai, ele seria nesse caso apenas 20% maior que 64 e ele ficaria numa posição que eu nao quero, ele precisa andar 64 pixels porém, ele precisa correr esses 64 pixel em um tempo X.

1

voce pode tentar isso:

import time

ti = time.time()
while True:
    tf = time.time()
    dt = tf - ti 
    ti = tf
    
    if dt >= 500:
        if key[pygame.K_LEFT] or key[pygame.K_a]:
            new_posx -= 64
            self.context["direction"] = "WEST"
            self.frame_motion()
        if key[pygame.K_RIGHT] or key[pygame.K_d]:
            new_posx += 64
            self.context["direction"] = "EAST"
            self.frame_motion()
    
        if key[pygame.K_UP] or key[pygame.K_w]:
            new_posy -= 64
            self.context["direction"] = "NORTH"
            self.frame_motion()
            
        if key[pygame.K_DOWN] or key[pygame.K_s]:
            new_posy += 64
            self.context["direction"] = "SOUTH"
            self.frame_motion()
            if not self.check_map_colision(new_posx, new_posy):
                self.rect.x = new_posx
                self.rect.y = new_posy
                self.context["posx"] = self.rect.x
                self.context["posy"] = self.rect.y
                self.can_move = True
            else:
                self.can_move = False

Desta forma o movimento so ira ocorrer com um certo delay, mas nao afetar os updates. Claro que o 500 do if e um exemplo coloque o valor que achar melhor. Este valor é produzido em milissegundos só para ficar mais declarado.

Fonte: https://humberto.io/pt-br/blog/desbravando-o-pygame-5-movimento-e-colisao/