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.
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.
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??
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.
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/