python - collide - Pygame: Sprite animation Theory-Need Feedback
pygame layered updates (1)
Después de ajustar un poco el código que obtuve de alguien para hacer que las imágenes de los personajes se muevan en relación con su dirección y hacia arriba, hacia la izquierda, la entrada de entrada correcta lo he reunido: (espero que el código no sea demasiado complicado)
Código de movimiento de personaje + IMG
La hoja de Sprite solo se ejecuta longitudinalmente, por lo que básicamente cada sección de sprite es una acción diferente. ¿Habría alguna manera de hacer un código que funcione con el actual para bajar de una "acción" establecida para hacer una animación?
Por ejemplo: ''Run Left'' es sprite 3. Entonces, después de designar esa columna, ¿sería posible realizar un loop down de cuántos fotogramas de la animación de ejecución (digamos 4) para hacer una animación?
Imagen de ejemplo: texto alternativo http://animania1.ca/ShowFriends/dev/example.jpg http://animania1.ca/ShowFriends/dev/example.jpg
Debería ser facil.
Si graba el número de cuadro en una variable, puede modularlo con el número de cuadros que necesita para obtener un número de cuadro de animación para mostrar.
frame_count = 0
animation_frames = 4
while quit == False:
# ...
# snip
# ...
area = pygame.Rect(
image_number * 100,
(frame_count % animation_frames) * 150,
100,
150
)
display.blit(sprite, sprite_pos, area)
pygame.display.flip()
frame_count += 1
Si las diferentes acciones tienen diferentes números de cuadros, tendrá que actualizar los cuadros de animación cuando actualice image_number.
Además, esto supone que está bien reproducir la animación comenzando en cualquier fotograma. Si este no es el caso, deberá registrar el recuento de cuadros cuando comenzó la acción, y quitarlo del conteo de cuadros antes del módulo:
area = pygame.Rect(
image_number * 100,
((frame_count - action_start_frame) % animation_frames) * 150,
100,
150
)
Una nota sobre el manejo de su evento. Si mantiene presionada, por ejemplo, izquierda, y toca a la derecha, pero sigue presionando hacia la izquierda, el sprite deja de moverse porque el último evento que procesó fue un evento clave, a pesar del hecho de que aún estoy a la izquierda.
Si esto no es lo que quiere, puede evitarlo guardando un registro de los estados arriba / abajo de las teclas que le interesan, o usando la interfaz pygame.key.get_pressed .
En otra nota, pareces estar apuntando a una velocidad de fotogramas fija, y al mismo tiempo determinar qué tan lejos mover tu sprite en función del tiempo tomado en el último fotograma. En mi opinión, esto probablemente no es ideal.
Los juegos de acción en 2D generalmente necesitan funcionar de manera predecible. Si se inicia un proceso pesado de CPU en segundo plano en su computadora y hace que su juego ya no pueda generar 60 fotogramas por segundo, es preferible que disminuya la velocidad, en lugar de hacer que los objetos comiencen a saltarse grandes distancias entre fotogramas. Imagina si esto sucediera en un juego de acción en 2D como Metal Slug donde tienes que saltar evitando las balas.
Esto también hace que los cálculos de física sean mucho más simples. Tendrás que hacer una llamada de juicio según el tipo de juego que sea.