[PEDIDO DE AJUDA][PURE MAGIC][INDIE][PYGAME] MOVIMENTO DO PERSONAGEM
Eai galera tudo bem? Então venho aqui pedir ajuda no meu game, estou com uma dificuldade na parte do código que é a seguinte, no video abaixo demonstra o que está acontecendo.
O que eu quero fazer é arrumar o movimento do personagem com o speed gerado por level , mais itens e o tipo de ground, igual ao do tibia, porém, primeiro preciso entender como fazer ele andar na velocidade correta só com o valor do speed. O que tem que ser feito é que o personagem deve andar 64pixels em uma direção a uma velocidade x, mas como fazer isso é o problema.
@staticmethod
def check_map_colision(new_posx, new_posy):
loaded_map = json.loads(open(os.path.join(BASE_DIR, "data", "map.json")).read())
player_rect = pygame.Rect(new_posx, new_posy, 64, 64)
for tile in loaded_map["tiles"]:
for obj in tile["objects"]:
if obj["id"] > 1:
obj_rect = pygame.Rect(int(tile["posx"]), int(tile["posy"]), 64, 64)
if player_rect.colliderect(obj_rect):
return True
return False
def input(self):
key = pygame.key.get_pressed()
mods = pygame.key.get_mods()
mouse = pygame.mouse.get_pressed()
new_posx = self.rect.x
new_posy = self.rect.y
############
# MOVEMENT #
############
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
Caso precisem verificar o código todo, só em solicitar que eu forneço sem problemas.
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".
Olá, parece que voce esta fazendo um otimo trabalho, mas não consegui entender a questão de movimento, parece que o player está se movendo em blocos de 64 pixels, acho que o tercho de codigo fornecido não ajudou muito a compreenção. Não entendi o problema o player parece estar se movendo muito rapido no video fornecido, ou o video foi acelerado??